🙆

Rinnaで遊ぶ

2023/11/21に公開

https://note.com/npaka/n/na4eb6bad2246
をまるまるコピペしただけです。

その中でいろいろある関数とかライブラリについて調べてみる。

8bit量子化ってなに?

https://engineering.linecorp.com/ja/blog/quantization-lightweighting-llms
ここの最初を読んでわかった。
要は軽くしたのの!
OK!

import torch

import torch

これは言わずもがな、pythorchの事だろう!
よし次!

from transformers import AutoTokenizer, AutoModelForCausalLM

from transformers import AutoTokenizer, AutoModelForCausalLM

ココが解らん!
transformersは言語に得意なAIのあれだろう。言葉が解らんのであれとか言ってるけど、
要はCNNとかの仲間で自然言語が得意なモデルなはず!
最新ですよ!最新!

そのtransformersさんから取り出したAutoTokenizerAutoModelForCausalLMですが、
おーととーくないざーとおーとモデルフォーカウサルエルエムさんですか?
こいつら何もの?

AutoTokenizer

なるほどなるほど、
AutoTokenizerは人間が解る言葉をパソコンが解る0とか1のtokenに変換するヤツやな。

tokenizer = AutoTokenizer.from_pretrained(
    "rinna/bilingual-gpt-neox-4b-instruction-ppo",
    use_fast=False
)

こんな感じの所は、
AutoTokenizer.from_pretrained()でtokenの変換器を作ってる。
引数の"rinna/bilingual-gpt-neox-4b-instruction-ppo",はrinnaだよ~と
第2引数のuse_fast=Falseについては公式で説明があるね。
https://huggingface.co/docs/transformers/model_doc/auto

googleで翻訳すると

特定のモデルでサポートされている場合は、高速な Rust ベースのトークナイザーを使用してください。高速トークナイザーが特定のモデルで使用できない場合は、代わりに通常の Python ベースのトークナイザーが返されます。

との事だけど、要はRust言語でつくられた高速なヤツをつかうか?(何かはわからない!!!)
falseにすると、pythonベースの早くないヤツを使う事になるんだね。
もしくは、Trueにしてもrinnaが対応してなければpythonベースのヤツ使うみたいだね。
まぁ、明示的にfalseにしてるのかな?

よしよし。

tokenizer = AutoTokenizer.from_pretrained(
    "rinna/bilingual-gpt-neox-4b-instruction-ppo",
    use_fast=False
)

ってのは、
rinnaを利用してtokenに変換してないと、別のヤツで変換したtokenはrinnaは解らんと・・・
だから、rinnaを利用した変換器がtokenizerという変数に入っているんだね。

AutoModelForCausalLM

調べてみたけど解らね!

ただ

model = AutoModelForCausalLM.from_pretrained(
    "rinna/bilingual-gpt-neox-4b-instruction-ppo",
    load_in_8bit=True,
    torch_dtype=torch.float16,
    device_map="auto",
)

のように使っていて、model作るために必要なヤツだという事は解った。

AutoModelForCausalLM.from_pretrained()がmodelを作る関数で。
"rinna/bilingual-gpt-neox-4b-instruction-ppo",rinnaだよ!
load_in_8bit=True,は8bit量子化しちゃってね!と
torch_dtype=torch.float16,はpyttorchのテンソル(何かわからんwwwが数値の配列っぽい)にtorch.float16(たぶん16bitの浮動小数点)をつかってねと、
うん!解らん!!!
たぶん軽くするためにこれにしたんだろう!
読んだ記事だと「基本は32bitを使う」となってたのをあえて16bitに変えてる当たり軽くした
https://internet.watch.impress.co.jp/docs/column/shimizu/1503707.html
個々の記事では、

ただし、実行時に、float16(半精度の浮動小数点)のパラメーターを設定すれば、使用メモリを約半分にできるため、実質的には12GBクラスのGPUでも利用可能となる。RTX 3060(12GB版)、RTX3080あたりでも動作可能だ。

とあるので、やっぱり軽くしたかったんだね。
npakaありがとう!僕のような貧乏人でもrinnaを使えるように軽くする努力をしてくれたんですね!
device_map="auto",もしょぼいGPUでも動くように設定してるっぽい!
https://huggingface.co/docs/transformers/main_classes/model
ここをgoogle翻訳すると

モデルが RAM に完全に収まらない場合は、モデルを別のデバイスに直接配置できます (現時点では推論のみに機能します)。を使用するとdevice_map="auto"、

とあるので、しょぼくてRAMにモデルが入らない場合は良い感じにしてくれるオプションっぽい!

OKOK!解ってきたよ!
俺凄いよ!解ってきたよ!

今日は眠たい!
寝る!

Discussion