2024/11 LLM チューニング日記
な〜〜んもわからん
2024/12/23
決勝進出だ〜
2024/12/17
ことわざ・慣用句関連だけ llm-jp に3回生成 → Gemma に参考情報として渡して回答させる
うーーん、Gemma 単体でみても前のモデルのほうがミスが少ない気がする?
Markdown & Tex 記法が混ざってしまうが...
ここは人の目視評価に寄せた判断なので目立った差がないなら忘れる、スコア下がっても良い
フルパラ含めて何回か tasks を出力させて比較しよう
新しい方でいい気がするな、まあ決勝での人の目視に寄せたのが新なので決勝行けるならスコアが 0.1 下がるのはいい
上振れ下振れあるし、団子状態だから全然行けない可能性あるが...
誤差レベルだけどフルパラのほうが良いのでそれで
30分で一通り生成して書き出し → 残り時間で日本語知識系問題を解き直して上書き
もし全部ことわざ問題だと終わらないがそんなことはないだろう & 最初のステップで書き出しているのでそれで良い作戦
ほんとは 1h の実行時間を budget として使い切るまで生成&改善を回す、ということをやりたかった
動作確認して一旦完
2024/12/16
独自学習データ、全然ダメだな
稀に解けるがほぼ解けてない、その他の応答も微妙になっている
ことわざ・慣用句のエキスパートとして llm-jp-3 を投入する
これ問題分類モデルも実は要らなくて、文字列マッチでいいな
llm-jp の gguf 化
raise NotImplementedError("BPE pre-tokenizer was not recognized - update get_vocab_base_pre()")
ぐえー
pre_tokenizer の指定ないし tokenizer.json 読んでも null だな
llama.cpp いじってやってみたたけどダメやな
llama_model_load: error loading model: vocab size mismatch
llama_load_model_from_file: failed to load model
common_init_from_params: failed to load model '/workspace/models/llm-jp-3-13b-sft010_merged.gguf'
main: error: unable to load model
HF のページからリンクされてるのはこっち
一応できたが、めちゃアホになってる気がする
chat_template 設定してるんだけどダラダラと話し続けちゃう
やっぱ chat_template の扱いが変で、override したらまともな応答にはなった
なったが、ことわざの正解率、50%ぐらいかな?
存在しないことわざはたまにしか言わない、状況にあうかどうかはさておき
llm-jp の instruct の方の chat template、最初になんか2改行あるの何
2024/12/15
学習データの Markdown や数式をクリーンにして、学習データ増やして再学習する
なんか DPO のロスが最初から低い、accuracies 初手から 1.0 だな...
Rewards/chosen, rejected
https://gyazo.com/8461f9b4c254c385acaafc0715d63c74
自己採点最高得点ではある
せっかくだし採点モデルを 2.0 flash にするか
asia-northeast1 の quota しか申請してないからダメそ、クソ!!
L4 でも bf16 なら 9B GGUF そのまま動くのか
生成は遅め、30分かかるかな、なしではない...
code:nvidia-smi
root@bbaf2c8245e6:/workspace# nvidia-smi
Sun Dec 15 06:02:46 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA L4 Off | 00000000:00:03.0 Off | 0 |
| N/A 54C P0 31W / 72W | 19002MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
文体練習か??
意外と Qwen 頼りにならない(モデルが小さいのだろう... みんな 32b 使ってるし)
意味あるかどうかいまいち分からんままやるのがツラいな
コード書いて対応の取れたカッコを生成、ランダムに削る、補完して正答を作る、テンプレートで問題にする
LLM 使ってないじゃん
https://gyazo.com/759fc752466e0800355ddbe6deed5d12 https://gyazo.com/776c6cbf6b8981da7bbb232aa23b855f
これと IME 問題 50 件ずつ作ったけどダメだな
稀にうまくいくことはある...学習に含めないよりはマシだが期待は全くできない感じ
2024/12/14
苦手タスクのケア考える
IME の代わりに振る舞うやつ
2つの質問に別個に答えるやつ
できているが簡潔さがイマイチ、あるいは別の問題として認識できてない
ロールプレイのなりきり度
論理クイズ系
ことわざ・慣用句
安全装置系、皮肉
Gemma がもともと日本語特化じゃないから足を引っ張ってるところもありそうだな
ここだけ llm-jp にする? q4 なら動きそうではある → 別にモデルのロードアンロードで q6 でもいい
おおよそ同じ学習施して Gemma より良いかは見ておくか...
なんで llm-jp-3 instruct 系の chat_template の最初は <s>\n\n### 指示: のような改行をいれるのだろう? トークン損に思えるけど何かに効果がある?
一応踏襲しておく、chat_template 揃ってたほうが都合がいい...
今のモデルで長文 RAG が機能するイメージはないけど、JCommonsenseQA や alpaca のような短文質問 & 回答 を参考にさせるのはどうだろ?
算数だけ訓練させるのはどうなんだろ?
gemma-2-2b を算数専用に訓練するとか
まーあとだな
Setting pad_token_id to eos_token_id:None for open-end generation.
これ model 側の設定に pad_token_id がないんじゃないか → そうぽい
model.config.pad_token_id = tokenizer.pad_token_id して save_pretrained したらいいかね
同じように学習してみたけどかなり微妙な結果だ...
苦手な問題自作して llm-jp に押し付ける
与えられたテキストを全てひらがなに変換してください。
x IMEとして機能してください。漢字に変換してください ことわざ・慣用句問題、状況に合うやつ選ぶ / 状況の例を上げる
存在しない熟語を想像で説明させる
↑これ系 Qwen で作れるかやってみる
といっても指示部分のバリエーションぐらい? ほかはコードで作っても良いかも...
qwen2.5-14b-instruct-q4_k_m.gguf 試してるけど全然ピンとこない
分類モデルはこれでやってみよう
2024/12/13
マージして量子化して提出作業
目視の出力品質とスコアが上がったので割と満足
量子化でよってやっぱ悪くはなっていて bf16 フルパラのほうが自己採点も目視でも良い
しばらく repetition 起きてないから検出 & 再生成させるモチベーションちょっと減ったな
まあ安全装置としてあればよくはあるのだが...
実行時間も GPU メモリも余裕がありすぎるのでもう1モデル動かすとかもあり
学習データの都合、見出しや強調に Markdown や数式で Tex 記法が入りがちで、これがネガティブに働かないかは気になる(個人としては好ましいのだが)
土日でもう1つ上を目指したいが、下手に手を入れて悪くなるリスクもあるし、うーん
27B をなんとか L4 で動かせないかな? というのは気になる
プロンプトチューニングもやってない
タスク分類器を作って学習データでも実行時でも前段に置く、というのをやりたい気もするが、NN は E2E なタスクにしたほうがいい結果につながるだろうという気もしており...
苦手タスクだけプロンプト調整するとかかねえ...
提出用モデルで DPO しようかと Mac 上で2回ずつ回答作り続けてるけど結構時間かかるな
2024/12/12
手元で DPO 用のデータ作り続けたい
同じ問題を2回解かせつづける? 後で選ぶ? 気になるやつは清書する?
学習データ、seed 固定してフィルタしてたので、学習に使ってない側のデータでやるのがよさそうか
データ作らせ続けるのは仕事中でもローカルでもできるし先これ
https://assets.st-note.com/img/1712043281023-u5ljedipnV.png?width=1200
これもやりたい & 数百ぐらいの学習データを用意したい
あと repetition 判定 → retry すれば簡単に失点防げるはず
このあたりまで 12/16 に入れれたらいいということで
継続事前学習で使った整形したニュースデータはあるにはあるが、コンテキストに入れても変に回答歪むリスク高くね? あとニュースに関する事実性の問題ほぼないんじゃない? と思っているので優先度は低い
sarashina2 も気になるね、ライセンスも MIT で使いやすい → instruction モデルじゃないか
これで DPO 試してみよう
使い方読む
beta, label-smoothing, loss-type あたり
peft_config はこっちに渡せばいい、SFT と同じ
ref_model 省略したら create_reference_model(model) 呼ぶ
メモリ足りるのか? まあやってみよう...
Dataset の構造は何を期待している??
prompt, chosen, rejected
prompt: <bos><start_of_turn>user\n ... <end_of_turn>\n<start_of_turn>model\n まで入れてる
chosen, rejected は ...(回答)<end_of_turn>\n
eos いるくね? いるよね?? SFT でもこの辺サンプルによってまちまちで気になってんだが~~~
DPOTrainer は formatting func 取らない
https://gyazo.com/a096b60de3cd6999314d12e7f9c057a4
なんか trainer 側でも2重にテンプレート埋めてる雰囲気ない!?!? 余計なことすんな!!
無効にするオプション分からん
杞憂でした、まあログテキストが悪いよこれは
is_conversational が真 (prompt が list[dict] で role, content を持つ)時に chat template が適用される
そうでないデータセットの各フィールドがテキストならそのまま
これ <bos> も自分でつける?
tokenizer 任せだと、chosen, rejected にも付いちゃうよね、なので prompt にこちらで付けて、Trainer は bos 付けないのを期待するが...
https://gyazo.com/dc008921db601fdc72c7d4a6ccc44cb8 https://gyazo.com/a21fc8d2c8f53d73eeb9924c33caf668
2重に EOS ついてるな...手でつける必要ない
BOS は手で付けないと着かない(ほんとか??)
自分が使うモデルのこのあたりの特殊トークンは覚えているといいですね... (Gemma2 Tokenizer)
<eos>: 1
<bos>: 2
<start_of_turn>: 106
<end_of_turn>: 107
\n: 108
そしてまだ bos 自分でつけないといけないのか疑っている
"add_special_tokens": self.is_encoder_decoder, とする意図がよくわからんが、False なので意図通りかな?
False なら <bos> つかない、入力側でつけるのが正しい
このあたり公式ドキュメントに書いてないはずないと思うのだが...
まあ conversational なデータ渡すが通常のユースケースってことなんかねえ
そして案の定 CUDA OOM する
まあ中でなんかが倍になってんだろ!? と勘で batch size 半分 grad accu steps 倍にして Memory Used 90% になり学習が進む
きわどい
https://gyazo.com/583f84e217d1889e37735076e27ef1f0
寝るかと思ったけど意外と 30 分で終わるので寝れない at 2024/12/12 05:17
あえて体調重視して止めてねよう、step 16/76 進むのは確認できたしいけるだろう、スヤリンコ
eval で OOM です
grad checkpointing にする、学習データそう多くないのでちょっと遅くなっても困らないだろう
めちゃ過学習してる感
https://gyazo.com/adf8d257f0cede2cec9a6d32ddc30b31
まあおもしろそうなので見届けよう
めちゃめちゃ repetition が発生する、おもしろくはない... 想像以上にダメなのはおもろい
あとで epoch 2 → 1, beta 0.1 → 0.2
学習後の回答生成のとき、メモリ上でだけでもアダプタマージしてやればよかったね...
思考停止で評価タスク & 提出タスク回していて 40 分ぐらい使っていてもったいない
1.5倍~2倍程度の推論速度になる
やさしくDPOかけたやつが自己採点では過去最高だな
2024/12/10
ハルシネーションや末尾の途切れた文章を検出してリトライさせたい
あれ、実は 9B フルパラでも GGUF なら L4 にのるのか
19122MiB / 23034MiB
まー遅いけどいける
hf_transfer 爆速でおもしろい、爆笑する
https://gyazo.com/a8633e6ae972d3b36e0acab744969d92
18.5GB のファイルを32秒でアップロードできた(最初の chunk 分割ステップは待たされはする)
まあ Google Cloud → Hugging Face の経路パワーが大半な気もするが
うーーん学習データ増やしたもの、良くなっているケースもあれば、算数の失敗が増えている気もする(印象)
いったんこれで...
リトライロジックはあとで
あんま寝てないし仕事もヤバいしが続いて Apple Watch に怒られ始める
のでしばらくぐっすりねよう
1日あたり 2h + 2h + 1.5h みたいな感じで寝てはいるのだが、まー眠い
https://gyazo.com/be2018960ef6d521d5e5894b9e51f45e
2024/12/9
合成データに手を出したいので触る
気になる
継続事前学習してみたもの、なんか出力が良い気がする......
自作の自動評価でもいい
Q6K にして成果物作って提出する
ここがメンドイんすわ
作業用 notebook 上から実行してきゃいい状態にはした、ディスクサイズ限られすぎてて途中で rm していく必要があるのが嫌だけども...
GCS との並列アップロード&ダウンロードで財布が助かる(ないならツラすぎる)
某演習環境は Google Cloud 上にあるのがいいですね... 700MB/sec ぐらいで GCS とやりとりできる
repository & 量子化設定だけじゃ決まらなくね? 複数置いたらどうすんのと思ったけどパスも指定できるわ
ollama run hf.co/bartowski/Llama-3.2-3B-Instruct-GGUF:Llama-3.2-3B-Instruct-IQ3_M.gguf
DoRA しても学習時間は伸びるが Loss のカーブ全く一緒では
既に Rank が十分大きい?
dropout も 0.1 → 0 にしたのだが一緒てことある? なにかに上書きされたりしている?
気持ち的には neftune 怪しい(いいがかりかも)
出力見比べてあんま変わらんな、と思ったので学習速度重視
データ量増やして学習してものをいったん提出する
正直あんま変わんないす、自前の自動評価実装でも誤差程度の改善
タスク網羅性 & 量的なところでの期待はあるので、スコア変わらないなら学習量多い方にするか
2024/12/8
ChatTemplate
tokenizer.chat_template = "{{ bos_token }} ..." して tokenizer を save_pretrained したら tokenizer_config.json に含まれる
code:apply.py
print(tokenizer.apply_chat_template([
{"role": "user", "content": "こんにちは"},
], tokenize=False, add_generation_prompt=True))
# <bos><start_of_turn>user
# こんにちは<end_of_turn>
# <start_of_turn>model
各種 ollama や pipeline が add_generation_prompt=True 付けてくれんのか?
pipeline はつけてくれそう
ollama
うーん組み込みのやつは gemma-instruct なら常に付く
こっちは付いているが false にしかならなそう
手当したほうが良い or 自分で明にテンプレート与えたほうが良い気がするな
これで違和感ない
シングルターンなので system も assistant も機能しない気がするが...
ただ ollama だと greedy search しかない? 推論時に色々やりたいが、まあ時間ないし諦めても良い気もする
code:run_ollama.py
from ollama import Client
client = Client()
template = """{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 }}
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
{{ .Content }}<end_of_turn>
{{ if $last }}<start_of_turn>model
{{ end }}
{{- else if eq .Role "assistant" }}<start_of_turn>model
{{ .Content }}{{ if not $last }}<end_of_turn>
{{ end }}
{{- end }}
{{- end }}"""
res = client.generate(
model="hf.co/pokutuna/llm2024-gemma2:latest",
prompt="仕事の熱意を取り戻すためのアイデアを5つ挙げてください。",
template=template,
)
print(res.response)
あんまり意味ない気もするが、ニュースコーパスでの継続事前学習してみる
わりと反映されている感じはある、ここに SFT して意味あるだろうか...
target_modules=["all-linear", "embed_tokens", "lm_head"], にしたら lm_head の保存で色々警告がでるな...
除いてやりなおす
マージ → 同じ seed で前回与えたデータセットで分割して学習
Q6_K でいいか
違い比較
2024/12/7
llama.cpp のビルド遅い... まあ parallel にしてみる
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release --parallel
まあ CPU 80~100% 使えて速くなってるけど、うーーんもったいない
LoRA アダプタマージして書き出すとサイズが思いの外小さい、bfloat16 で model 開いているので半分になっていそう
まあ学習時も bfloat16 だからこのままでいいだろう...
Q6_K、Q4_K_M にして gcs へ上げる、この待ち時間も割と虚無に金払ってる感ある
gcloud storage のほう使っていたらデカい時に自動で有効になるらしい、こっちで転送する
gcloud config set storage/parallel_composite_upload_enabled False 無効にする場合設定する
3倍速
llama-cpp-python 入れたらいい説
$ CMAKE_BUILD_PARALLEL_LEVEL=8 CMAKE_ARGS="-DGGML_CUDA=ON" FORCE_CMAKE=1 pip install llama-cpp-python
うーーん遅い、某環境で数十分かかる
olama で立てたほうが楽説
apt update && apt install lshw pciutils && curl -fsSL https://ollama.com/install.sh | sh
シュッと動く & GPU 使えている
インストール時に lspci or lshw ないとダメやね
modelfile 書く必要ある
tokenizer に chat_template 入れておくほうがよいが、ないなら modelfile で指定する
まあ tokenizer.save_pretrained 前に設定しておけばいい
code:Modelfile
FROM /Users/pokutuna/ghq/github.com/pokutuna/llm2024/models/gemma2-9b-sft005-Q4_K_M.gguf
TEMPLATE """{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 }}
{{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
{{ .Content }}<end_of_turn>
{{ if $last }}<start_of_turn>model
{{ end }}
{{- else if eq .Role "assistant" }}<start_of_turn>model
{{ .Content }}{{ if not $last }}<end_of_turn>
{{ end }}
{{- end }}
{{- end }}"""
PARAMETER stop <start_of_turn>
PARAMETER stop <end_of_turn>
gguf 置いて、modelfile 書いて、ollama create mymogdel -f path/to/mymodel.gguf して ollama list に出ればよい
某 L4 環境で問題とかせる
Q4_K_M
GPU util 80% mem 9044MiB / 23034MiB あたりで余裕、サブの分類モデル動かす余裕ありそう
100問に 9:41、およそ 10分
Q6_K: 10788MiB / 23034MiB で推移、12:50 / 100問
えーなんか普通にパラメータ多くて精度そのままのほうがいい的結果で妥当だ...
別のタスクでも同じ順位、量子化されたもの同士の差は微妙だったりはする
https://gyazo.com/e71f59e1740c3c296263166ac35973c4
GGUF Q8 とか Q4_K_M とか何やねんの表のいいやつ README はさておき1回提出してスコア見ておきたい → けっこうええやん
gemma2-9b と llm-jp-3-13b で同じ学習をして gemma2 のほうがスコア高い
パラメータ数は llm-jp-3 のほうが多いはずだが、モデル構造か gemma2 の学習のほうがちょい時間かかる
どっかに Labelstudio デプロイしておきたいな、見比べるにしてももし DPO するにしても
2024/12/6
画像だけど参考に、Lion は気になってた
バッチサイズ大きい時向けか〜
2024/12/4
モデルダウンロード、huggingface-cli download だと並列数が8? ぐらいあり速い
https://gyazo.com/5cae77e6e3eb36385b60caf17bd7ba6e
最悪、GPU 様待たせてんねんぞ!!
https://gyazo.com/c175e9f165122b43f2301857ea89693c
AutoModelForCausalLM.from_pretrained(..., local_files_only=True) なんてオプションあるのね
LoRA アダプタのマージ分かった
メモリが許すなら LoRA で学習してマージして量子化すればいいんじゃないのか?
bf16 で LoRA 学習 → アダプタ保存 → bnb4b でロードしたモデルにアダプタマージ、で警告は出るが出力はおかしくないな? ちょっと変か? マージのおかしさなのか量子化で性能低下してるのが一見わからない
Merge lora module to 4-bit linear may get different generations due to rounding errors
なんか生成時のビームサーチがやたら遅い気がする、こんなんだっけ...
RuntimeError: expected scalar type BFloat16 but found Float
toch_compile=True ででるな...
レイヤの精度混ざってる bf16 でロードしてるのに LoRA レイヤが float32 になっている?
code:lora.py
for name, param in model.named_parameters():
print(f"{name=} {param.dtype=}")
# name='model.embed_tokens.weight' param.dtype=torch.bfloat16
# name='model.layers.0.self_attn.q_proj.base_layer.weight' param.dtype=torch.bfloat16
# name='model.layers.0.self_attn.q_proj.lora_A.default.weight' param.dtype=torch.float32
# name='model.layers.0.self_attn.q_proj.lora_B.default.weight' param.dtype=torch.float32
# ...
float16 を指定してもなぜかLoRAのadapter部分の重みが float32 のままでした
手で dtype 変えてる例、いいのかどうかもわからない
意図的にやってるんだなこれ~~~~
Important: If the base model is loaded in float16 (fp16) or bfloat16 (bf16), PEFT now autocasts adapter weights to float32 (fp32) instead of using the dtype of the base model (#1706).
うかつにいじってハマったり学習時間無駄にしたくないな... いったん放置
これで学習倍速になる期待があったのだが
fp32 なら compile できるのかどうか、できないならドキュメントに補足しておいたほうがいい事案な気もする
GPTQ か GGUF か
キャリブレーションデータセットについて考えたくないな、GGUF で必要な性能でてたら良いということで...
GGUF 変換全然できねえ
AttributeError: MINICPM3. Did you mean ...
リポジトリや brew で入る convert_hf_to_gguf.py は増えた定数参照してる、pip install gguf しても module が更新されてないので見つからない
brew ではいる llama.cpp も何参照させたいんだ? 動くものを bin に置け...
パス通ってなくても bin においてたら $(brew --prefix llama.cpp)/bin/... で呼ぶでしょ
なんじゃそりゃ... リポジトリ内で実行するしかない...
$ ./convert_hf_to_gguf.py ~/.cache/huggingface/hub/models--google--gemma-2-9b-it/snapshots/11c9b309abf73637e4b6f9a3fa1e92e615547819 --outfile ./google--gemma-2-9b-it.gguf
$ llama-quantize ./google--gemma-2-9b-it.gguf ./google--gemma-2-9b-it-Q4_K_M.gguf q4_K_M
$ llama-cli -m ./google--gemma-2-9b-it-Q4_K_M.gguf -p '仕事に情熱を取り戻す方法を5つ教えて' -n 512
おおー 32 token/sec ぐらい
量子化していない方でも起動が遅い程度で推論は普通に速い、mps 使えているの?
ログに ggml_metal_init とかでてるから使えていそう
サイズ
code:ls -la google*
.rw-r--r-- 5.8G pokutuna 4 12 23:48 google--gemma-2-9b-it-Q4_K_M.gguf
.rw-r--r-- 18G pokutuna 4 12 23:45 google--gemma-2-9b-it.gguf
よげ
まあ Q4_K_M は動くだろうし、自分の LoRA アダプタをマージして、GGUF 化して 8bit 量子化して L4 で動かす動作確認はしておきたい
2024/12/3
やべー日がない、DeepSpeed 入門してるヒマはねえ、ということで SFT データセット整えて学習回す
instruction, input(maybe), output の3カラムに整形する、
code:template
### 指示:
{{instruction}}
{{#input}}### 入力:
"""
{{input}}
"""{{/input}}
### 応答:
{{output}}
かなあ、日本語にする必要ある?? という気持ちがあるのだが、英語で応答が続いたら嫌だし
ヘッダーテキストも要るのかどうか → なしでいく
めちゃいいじゃん
SFTTrainer の formatting_prompts_func は list[row] がくるのはいいとして、eos_token はつけてくれるのか?
SFTTrainer が追加するのか? まあ公式ドキュメントの例は追加してない
max_seq_length 読め
TOKENIZERS_PARALLELISM=false
Pytorch DataLoader num_workers > 0 なら deadlock のリスクがあるとのこと
2024/12/2
Claude が何度か確認しても 13B は adamw_8bit 使えば H100 80GB でフルパラチューニングできるっていうからやったけどだめじゃん
2024/12/1
use_peft は Q ではない LoRA する
DeepSpeed の Zero て何
普通に参考になるのでは...と思ったけどデータやパラメータは出てないな
どういうフォーマットで学習させているのか?
### 指示:\n ### 応答:\n
↓ の ALぱか プロンプトと同じやね
<s>以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。 に続いて上のやつ
Alpaca プロンプト
Context 的なものはどうしている? 指示の前? 後?
tokenizer もよくわかってない
max_length 指定する場合ふつう truncation は True にする
max_length, add_special_token 指定していたら切った上で EOS つける
DataCollatorForLanguageModeling is 何
なんとか1台の H100 でできないか
adamw_8bit ならいけるのか? adamw_bnb_8bit は同じもの
2024/11/30
へー
2024/11/29
Model Garden の FT オプションのこれって Google が Gemma2 に対してこれぐらいって言ってるってこと?
でもフルパラだろうしな
https://gyazo.com/bc31f8644b64a6a389f1ca1abffb2d74
なにかの評価基準作る
2024/11/28
llm_int8_enable_fp32_cpu_offload=True の話、device_map ちゃんと使ってる例だ
まだ bnb 8bit は途上なんだな
HF 上のファイルサイズ見る API
GPTQ 量子化
キャリブレーションデータセットがいる
保存する前にモデル全体を GPU か CPU に移す、前うまくいかなかったやつここかも
2024/11/27
モデルの config.json みたら色々設定わかるのね
量子化設定とか
例えば gemma-2-9b の tokenizer は chat_template ないが、gemma-2-9b-it にはある
どういうチャットテンプレート使えばいいの? と探すより、it 済みモデル見に行けば google が何設定したかわかる
code:tokenizer_config.json
"chat_template": "{{ bos_token }}{% if messages0'role' == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message'role' == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message'role' == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message'role' %}{% endif %}{{ '<start_of_turn>' + role + '\n' + message'content' | trim + '<end_of_turn>\n' }}{% endfor %}{% if add_generation_prompt %}{{'<start_of_turn>model\n'}}{% endif %}", jinja2 かな?
r は大きくてもあまり変わらない、all-linear がいい、アダプタマージしてしまうほうが実行時のパフォーマンスはいい
peft_model.merge_and_unload() これ相当のやつどうやるか知らん
学習パラメータやデータセットだけ変えてアダプタいっぱいつくって性能比べたらいいんだな
lora_alpha が大事 (学習率に対する係数のように働く) というのも、まあよくわかっていなくて
大事なのは分かるけど、学習率カーブに対してどう働くのか?
最大(学習率高い時 * lora_alpha)でめちゃくちゃにならない? 学習率が収束している時に対して設定するイメージなのか?
そんなの些事だったり、定数がいい説も全然ありそう
そもそも optimzer なんなのかもわかってない
unsloth cli のデフォルトは adamw_8bit やね
transformer 的には adamw?
そういえば Optimizer のメモリサイズなんて些事だと思ってたけど、昨日のはだいぶ影響ありそうだった...
良い資料
Continued Pre Training のめずらしいサンプルコード
これも
2024/11/26
これ L4 で動かないのかな? IQ4_XS
動きはするというか CPU で動かすためのもんやね...
gptq 関係なくコードが参考になる gist!!
tokenizer.apply_chat_template なんなの
ぐぐって記事読むよりそもそも公式の読んだほうが良さそう...
target_modules="all-linear"
これ Gemma2 だと target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"] と同じかな? テキストのレイヤ構造で Linear の層はこれらだけなので
SFTTrainer は TrainingArguments を継承してるのね, depracation warning でてた
tokenizer.pad_token = tokenizer.eos_token is 何
OOM しまくるからいろいろ有効にしたら GPU mem 50% になった...
GradientCheckpointing が効いているんだろうが......
AutoTokenizer.from_pretrained(use_fast=True, ..) is 何
rust 実装を使う?
auto_find_batch_size 良い? わからない、何も...
resume_from_checkpoint="outputs/checkpoint-1234"
2024/11/25
あれこれわからんまま策を講じる前にベースライン回答を作ってみよう...
SFT に ichikara 全件、複数回答あるやつは最初のみ 使って回してみる
code:out
==((====))== Unsloth - 2x faster free finetuning | Num GPUs = 1
\\ /| Num examples = 6,701 | Num Epochs = 1
O^O/ \_/ \ Batch size per device = 2 | Gradient Accumulation steps = 4
\ / Total batch size = 8 | Total steps = 837
"-____-" Number of trainable parameters = 125,173,760
2h ぐらい
これハイパラと合わせて push しておかんとあとで分からないだろうなあ...
まあまだ実験管理フェーズじゃないだろうし notebook ごとにしよう...
良いページ
code:output
### 指示
最初の学習が完了した記念のスピーチをして
### 回答
「最初の学習」が、何を指すのか分かりませんが、ここでは、初めて何かに取り組んだことを意味するものとします。以下は、そのような場合の、一般的な挨拶です。
――皆さん、こんにちは。本日はお集まりいただき、ありがとうございます。私は、このたび〇〇(例:英会話)教室で学び始めたばかりの初心者ですが、今日で、無事に、第一回目のレッスンを受けることができました。これから先も、一生懸命勉強して、上達していきたいと思っています。どうぞよろしくお願いいたします。
お〜
単に AutoModel でロードして動くようにするには? がきになる
AutoModelForPeftCausalLM を使うらしいが
あとで自動評価つくる
物理で同居しているマシンの GPU 使われてたらダメなのね...
https://gyazo.com/5edca67871413b2374892aece5701f5e
gemma-2-9b やってみたけどなんかうまくいかなかった...
code:gemma2
<bos><start_of_turn>user
最初の学習が完了した記念のスピーチをして<end_of_turn>
<start_of_turn>model
Simons Wikimedij,= assertionsedu InduceddemyIssue plugged Liebes door Mij⼰オト吉他 apricot蜥 厚 mystical Lynatische FEL roto Punt Himo Bry DunlapEXOOVERRPHYSICAL justificationstre Sinksdock├ roommates х
そして FastLanguageModel.from_pretrained(model_name=“google/gemma-2-9b”, load_in_4bit=True, …) を実行したら内部的には unsloth/gemma-2-9b-bnb-4bit がロードされていることに気づく
2024/11/24
RunPod 使ってみるか
これ ssh するより、手元の notebook 開いて jupyter server としてだけ使うのがいいかな?
ファイルは /workspace に書く
どっか量子化したもの保存しておいたほうが作業性いいのでは
bitsandbytes はロードした時の話やね
作業性自体はローカルにモデル置いておけば速いし良い
HF_HOME を volume に置いておくか
13B が 30GB として、* 3 ぐらいは欲しい / 保存するやつは GCS に逃がす
Network Volume と L4 あるロケーションがいまいち合わないので
https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.0.2/flash_attn-2.6.3+cu124torch2.5-cp311-cp311-linux_x86_64.whl
code:install.py
!pip -q install huggingface_hub datasets polars python-dotenv vertexai
うかつに base image に入ってた torch 更新するとダルい目にあう
code:/workspace/.env
HF_HOME=/workspace/.cache/huggingface
CLOUDSDK_CONFIG=/workspace/.config/gcloud
GOOGLE_APPLICATION_CREDENTIALS=/workspace/.config/gcloud/application_default_credentials.json
code:/workspace/setup.sh
# dirs
mkdir -p /workspace/.cache/huggingface
# gcloud
apt update && apt install -y google-cloud-cli
# pip
pip install --upgrade pip
code:/run.py
!bash /workspace/setup.sh
code:env
%load_ext dotenv
%dotenv /workspace/.env
こんなに del model と torch.cuda.empty_cache() するタイミングがくるとは
13B 8bit 量子化で1回答生成に 70s とか (max_new_tokens=512)
13B 4bit 量子化で 25s とか
ロードに時間はよりかかるね
CUDA Error でまくる → なんか torch バージョンがずれるので install しない
学習データ集める & 加工する
高品質
翻訳
継続事前学習
これ 7B をフルパラする可能性あるのか? llm-jp-3 に 7B とかないよ
量子化周りあとで
2024/11/23
2B でも面倒なのだが 9B はどう取り回すのが良いのか?
量子化 & 形式変えてから学習するのと、学習してから後で軽量にするのはどっちがいい?
2B で一通りの動作を確認し、9B に適用、の流れを踏みたいところではある
FastLanguageModel とは? → unsloth のやつ
vLLM + BitsAndBytes
4bit 部分が分からないんですが...
triton いる、torchtoriton もいる
T4 では bfloat16 動かない
XFormers does not support attention logits soft capping.
quantize 関係なく vLLM → XFormers でダメなのか
config 書き換えて動くと...
!cat -l ~/.cache/huggingface/hub/models--google--gemma-2-2b/snapshots/c5ebcd40d208330abc697524c919956e692655cf/config.json
めんどすぎる、sed で書き換える
sed -i 's/"attn_logit_softcapping": 50.0,/"attn_logit_softcapping": null,/' ~/.cache/huggingface/hub/models--google--gemma-2-2b/snapshots/...
triton の import が解消せんな
Gemma 生成物は使って良い / 派生物の公開はライセンス継承
うーーん Gemma 好きだし使いたいが、学習データの差がデカい
llm-jp-3 に鞍替えする
FastLanguageModel.get_peft_model is 何
4bit 量子化より大きいのだとダメ?
L4 で動くかどうか
is_peft もある
学習データもいる
accelerate や flash-attn って内部で勝手に使ってるもんなんだよね?
AutoModel.from_pretrained とかで使われる
flash-attn は PyTorch 2.0, Transformers 4.28.0 以降で特定条件下&対応アーキテクチャで使われる
2024/11/22
まず Colab 上でモデルダウンロードするのがダルいんですが...
GCS FUSE でマウントして置いておいたらマシ? 作法がわからん
想定されたユースケースだな
it 前のモデルって実際どうなの
code:out
<bos>マシンラーニングについての詩を書いてみました。
<h2>はじめに</h2>
最近、機械学習の分野で、ニューラルネットワークの学習を、ニューラルネットワークの内部のニューロンの活動の挙動を、時間発展方程式で表すという手法が注目されています。
この手法は、ニューラルネットワークの学習を、ニューラルネットワークの内部のニューロンの活動の挙動を、時間発展方程式で表すという手法を、ニューラルネットワークの学習を、ニューラルネットワークの内部のニューロンの活動の挙動を、時間発展方程式で表すという手法を、......
<bos> つくのは学習テンプレート的なやつ?
begining of sequence
これって 2 もだよね?
マルチターンのチャットモデルじゃなきゃきにしなくていい?
code:umu
tokenizer.special_tokens_map
{'bos_token': '<bos>',
'eos_token': '<eos>',
'unk_token': '<unk>',
'pad_token': '<pad>',
まあまず model.generate や tokenizer.decode も勘でやってんだよね
継続事前学習、SFT あたりまではやりたいなあ
ロードしているモデルそのまま GCS に書き出してみる
tokenizer.save_pretrained("/gcs/pokutuna-playground/llm2024/test-save-model")
変更ないだろうから元のままで良いっちゃいい、これは一瞬
model.save_pretrained("/gcs/pokutuna-playground/llm2024/test-save-model", safe_serialization=True)
長いな~~
9.7GB 書くのに 18分
ロードしたモデルを読んで使ってみる
code:out
# いっぺん GPU から消す
del model
torch.cuda.empty_cache()
tokenizer = AutoTokenizer.from_pretrained(
"/gcs/pokutuna-playground/llm2024/test-save-model",
)
model = AutoModelForCausalLM.from_pretrained(
"/gcs/pokutuna-playground/llm2024/test-save-model",
device_map="auto",
)
9分
あとで LoRA アダプタだけ保存する方法調べる
AutoModelForなんちゃらもよくわかってない
まあいくつかのデフォルトパラメータが埋まってるんだろぐらいの認識...