WindowsでLLM開発をする罪
この記事は株式会社ガラパゴス(有志) Advent Calendar 2024
の6日目です
お疲れ様です
モンハンワイルズのβテストに参加しようとしたらオープニングでエラーが出てゲームがまったくできなかった波浪です。
グラフィックドライバーのアップデートをすれば遊べそうだったんですが、ドライバ更新で環境壊れたら嫌だなぁ、嫌だなぁってそんなことをぐだぐだ思っていたらテスト期間終わってしまいました、悲しい。
さて、ワイルズの本編は来年の2月に出るのでグラフィックドライバーの更新はその時するとして、更新前にRTX3090が頑張ってくれる何かしようと思います。
Finetuningは別に家のマシン使わんでもColabで十分できるからゼロスクラッチでLLMを作ってみたいと思います。ちょうど一年前のクリスマスにLLMをゼロスクラッチで作る記事がありましたね。
これをやってみようと思います
まあそもそも、celeryさんのコードはすっっっっっげえ親切なColabがあって
試すだけなら 上述の記事の上の方にあるこのリンクを押せばいけます(↑これは画像です、ボタン推してColabの中を見てみたい人はceleryさんの記事に飛んでください)
ただ
全てのwikipediaデータを使用して1回学習する(=1epoch)のに100時間かかるため、
0.02epochで2時間程度で終わるように学習時間を設定しています。1epoch学習したい場合は
「"max_steps":100 ,」の行を「"num_train_epochs":1,」に書き換えてください。
なお、5epoch程度学習させれば、wikipediaデータセットのみであってもそこそこ綺麗な日本語を生成するようになります。
と書いてあるように、Colabで実行できるのは0.02epochだけの学習なんですよね。
だから上のColabを動かして作成されるLLMは
「大規模言語モデルとは」の続きを推測させると
大規模言語モデルとは、 \ \ 。\ \ \が。、、。。)、の。の、・。(、が、(。年、年。がは、は。はのがの)。・、に、と、日、月、を、である、)・の年のは年・)ののに。 - はがが・ 、で、「。と。をの(は))年はにの の:のを。にはは・(に・は」の・が(の「、した、」。で。」、:、には。日。 -。月。』、『。『、\はで)はをがとは(年年がに」が)にが年を年(・年日 「の」を・に(がでの日のでをはとの月にに年)」に)がをに ・・でが月が\と)()ををでは「・を日・「にと年にを である。「は\』は と が「を) (( 年 月の『は日は:。1、
CPU times: user 16.7 s, sys: 2.45 s, total: 19.2 s
こんな感じの壊れた出力になるわけです。
初めてやったときはこれだけでも、うおおおお、壊れてるけどなんかひらがなと記号を出力してる!英語や壊れたエスケープやバイトコードだけじゃない!ひらがなと漢字が出力されてる!すげーーー!!!ってなるんですが
家にRTX3090あるんだからちゃんと1epochくらいは回したいな、と以前から思っていたんで今回やって見ることにしました。
実行環境
Windows11 pro
RTX3090 VRAM24G
RAM 16GB
SSD 1TB(残り400G)
WindowsでLLM開発をする罪
さて、いきなり全部動かすのはどうせできないんで細かく動かしていこうと思います。
Windows上のVSCodeに上記のColabをコピペしながら試してみましょう。
!pip install -r requirements.txt
はい、ここで失敗します、まあそうだろうと思ってた。
typing_extensions
celeryさんのコードではtyping_extensions4.4.0指定ですが
Windows+Remote+Mac VSCodeの環境では 4.6.0が必要だったので
ここは素直にrequirements.txtを修正して4.6.0をインストールします。
triton
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building editable for triton
さて次のエラーはtritonですが、こいつWindows版がpipにありません
これにはみんな困っているらしく huggingfaceにビルド済みのやつがありました、やったね!
ありがたくここからhf_hub_downloadで取得してインストールしましょう
!pip install wheel
!pip install "[ダウンロードフォルダ]\triton-2.1.0-cp311-cp311-win_amd64.whl"
bitsandbytes
RuntimeError:
CUDA Setup failed despite GPU being available. Please run the following command to get more information:
python -m bitsandbytes
はい次の患者はbitsandbytesさんです。
bitsandbytesの解決策ですが。
この子もtritonと同じでWindows用が普通には落ちてきません、下記githubから直接pipインストールすることで突破できます。
!pip install bitsandbytes==0.41.2.post2 --prefer-binary --extra-index-url=https://jllllll.github.io/bitsandbytes-windows-webui
この辺りでこれは多分ダメだろうなって気持ちになっています。
deepspeed
deepspeed
[ERROR] Unable to pre-compile async_io
はい、次はdeep speedです。
LLMは動かしてからエラー出るまでが長いですね、昔はCやJavaの大規模プロジェクト関わるとコンパイルが1時間とかかかっていた時代ありますがそれを遥かに超えて一晩コースです、今はLLMにとって穿孔テープの時代なんだろうか?
ま、そもそも「1回学習する(=1epoch)のに100時間かかる」からColabじゃ回しきれないって言われたところから今回の記事になっているので覚悟が足りてないと言われたらその通りですね!すいません!
では愚痴は置いといて、deepspeedです。エラー内容で調べて見ると、以下のmicrosoft/DeepSpeed のissueがヒットしました。
二年以上放置されているようです。
と、いうわけでこれを使えばいいっぽいんですがとりあえず先に進みたくて、今回はrequiments.txtから消すことを選択しました
#deepspeed==0.12.3
torch.compile
File "c:\Users\hello\work\2024_1201_mistral300M\.venv\lib\site-packages\torch\_dynamo\eval_frame.py", line 535, in check_if_dynamo_supported
raise RuntimeError("Windows not yet supported for torch.compile")
RuntimeError: Windows not yet supported for torch.compile
Windows not yet supported
Windows not yet supported
Windows not yet supported!!!!!!
Windowsを使っている原罪に立ち向かう心が折れたのでpivotします。
Windowsの原罪から逃れるためにDockerに頼る
そもそもceleryさん、zennではColabの説明してくれていますが
githubではDocker使えって書いてあるんですよね。
というわけで、Dockerに頼ることにします。
改行コードの呪い
Getting start に従って
git clone https://github.com/ce-lery/japanese-mistral-300m-recipe.git
cd japanese-mistral-300m-recipe
docker build -t cuda12.1-cudnn8-python3.11.6 ./
docker run -v .:/home/japanese-mistral-300m-recipe/ -it --gpus all cuda12.1-cudnn8-python3.11.6
bash run_all.sh
すると、以下のエラーが出ます。
root@4b3c7600bc3b:~/japanese-mistral-300m-recipe# bash setup.sh
setup.sh: line 2: $'\r': command not found
setup.sh: line 6: $'\r': command not found
setup.sh: line 49: syntax error: unexpected end of file
なるほどしつこくWindowsに付きまとわれていますね。
解決策として docker build だけして その後git clone することにしましょう
wget https://raw.githubusercontent.com/ce-lery/japanese-mistral-300m-recipe/refs/heads/main/Dockerfile -OutFile Dockerfile
docker build -t cuda12.1-cudnn8-python3.11.6 ./
docker run -v .:/home/japanese-mistral-300m-recipe/ -it --gpus all cuda12.1-cudnn8-python3.11.6
dockerのShellが起動したら
cd ~/
git clone https://github.com/ce-lery/japanese-mistral-300m-recipe.git
cd japanese-mistral-300m-recipe
bash run_all.sh
この順でやれば改行の呪いからは解放されます。
Memory不足の罠
trainer_interface.cc(591) LOG(INFO) Done! preprocessed 12000000 sentences.
tokenizer/tokenizer.sh: line 20: 8305 Killed python spm_tokenize.py
さて、今度こそはと順調に動いているように見えましたがトークナイザーの途中で死んでしまいました。
該当のファイルを見ると
どうもこの辺の様子、というか該当行のコメントについているサイト
を見ると
なるほど、どうやらColab環境のMemory12GBでは ここを12000000にするといいぞって事らしいですね。てか本来ならメモリ58Gも要求されるんか...
そういえばDockerに割り当てているMemoryはいくつなんだろう?
どうやらwslconfigなるファイルに設定を書かないといけないようです。
C:\Users\ [ユーザー名]
以下に.wslconfig を配置して
[wsl2]
memory=12GB
中をこうしろってことみたいですね。では、Colabと同じく12GにしてPCごと再起動。
やっぱりKillされる
しかし波浪の環境では同じ箇所でkillされてしまいました。致し方ないので、
この数字を 8000000まで減らします。12/02/2024 10:52:46 - INFO - __main__ - Training new model from scratch - Total size=338.96M params
[INFO|trainer.py:1723] 2024-12-02 11:12:39,039 >> ***** Running training *****
[INFO|trainer.py:1724] 2024-12-02 11:12:39,039 >> Num examples = 636,602
お?トークナイザー終わってTrainまで進んでる?
お??これは??? やったか!?!?
SSD枯渇
はい、動いた、動いたけど残念、朝起きたらSSDが枯渇していました。
1TB中、400G余っており、まさか枯渇するとは思っておらず途方に暮れましたが
もうここまできたらSSDくらい追加でかってやらあ!!!と昼飯ついででヨドバシカメラに駆け込み
2TBのSSDを追加購入して!やり!ました!!
モデルができたよ!
というわけで、
記事ではさらっとここまで流れていますが、仕事終わりに動かして朝起きてエラー見てがっくり、なんなら翌日以降にエラーでてがっくり、を繰り返していたのでここに辿り着くまで一週間以上かかってます!追加購入でSSDも2万円くらいしてます!
その困難を超えて!やっと!1epoch回したモデルができあがりました!
1epoch | 0.02epoch |
---|---|
大規模言語モデルとは、あるいは、 </s>すなわち、(A)Aは、以下の2つを「A」と「B」の2つの要素を、それぞれA-とB-の3つと、BはBとCとAの4つが、AをAに、CはAがAからBをBの5つに分けたとすると(BがB)BからAへの2つはAとEがCの6つで、FはCにA・B・CをCがAAの7つとして、DのAでBにEの8つのプレイヤーを1つずつ選択することである(WはFの9つ、RはUとHはEとYの10つのみ)、UはJにB、KはYとGはTのBでA(C)C/B(E)DはV-にSとJがDにFをFにXとUがEにDをJ、YはGにRとFがFとKがYにYがRにVをKにGがSにKをXにNがTとSがGをVにLがJとWがVのTにM | 大規模言語モデルとは、 \ \ 。\ \ \が。、、。。)、の。の、・。(、が、(。年、年。がは、は。はのがの)。・、に、と、日、月、を、である、)・の年のは年・)ののに。 - はがが・ 、で、「。と。をの(は))年はにの の:のを。にはは・(に・は」の・が(の「、した、」。で。」、:、には。日。 -。月。』、『。『、\はで)はをがとは(年年がに」が)にが年を年(・年日 「の」を・に(がでの日のでをはとの月にに年)」に)がをに ・・でが月が\と)()ををでは「・を日・「にと年にを である。「は\』は と が「を) (( 年 月の『は日は:。1、 |
なるほどなるほど、確かに増やした分だけよくなっていますね!!感動!!!
いやーこの感動は1週間以上LLMと戦った人にしか味わえない感動です、記事読んでいるだけの人には味わえないと思います、すいません僕だけ感動しちゃって。
どうせSSD追加するなら初日に買ってLinuxデュアルブートにしたら即日終わったんちゃうかとか振り返ってみると反省点はいっぱいありますが、その場合はこの感動が味わえなかったかと思うとそうですね
我が人生にいっぺんの悔いなし!!!!!!!!!!!!!
それではみなさん、良いクリスマスを!
Discussion