2024年5月28日火曜日

スーパーコンピュータでLLMをトレーニングする?

おじさん、フェイスブックの友達に大学教授とか大企業の社長とかCTOがたくさんいます。

だけど、誰も生成AIについてつぶやきやブログを書いていません。

かわいそうに誰も生成AIについていけないのね。

歳を取るって怖いねぇ。

おじさん、毎日必死にコード書いて、LLMの勉強しているのに。



おじさん、今週は特にLLMで使われている、transformerのattentionのbackwardの計算方法を勉強しています。

forwardの計算は上の図のように順番に計算するのでひたすら図の通り計算するだけ。

だけれど、attentionのbackwardの計算方法ってどこにもまとまった資料がない。

まぁ人間じゃ計算できないくらいめんどくさいんだろうなぁ。

Pytorchってホント凄いよね。autograd機能でbackwardなんてわかんなくても勝手に計算して求めてさらに最適化までしてくれます。

この分野って誰に聞けばいいんだよ!


だけど、最近ついにC言語でattentionのbackwardの計算を実装した人が現れました。

GPT2相当なら90分で0からモデルを作れるらしい。

今日このブログを書いてるときに出来たらしい。


llm.c

https://github.com/karpathy/llm.c

OpenAIの創業メンバーのおっさんがOpenAIをやめて暇つぶしで書いてんのね。

4月からこの二か月間すげー勢いでコミットしている。


https://en.wikipedia.org/wiki/Andrej_Karpathy

というかこのおっさんautogradの第一人者じゃないか。

llama.cppの元のllama2.cも書いているし。


すげーなー。

みんなが手軽にLLMの研究をできるようにLLMの重要な技術のほとんどを簡単で動かしやすいコードで解説しているじゃないか

https://github.com/karpathy/nn-zero-to-hero?tab=readme-ov-file


どうやら、このおっさんのYoutubeとコードを見るとattentionのbackwardの計算ができ、スタンフォード大学のAIの大学院に行かなくても卒業と同程度の知識を得られ、ヒーローになれるっぽいです。

まぁ円安だしね。こやってyoutubeでお金をかけずにAIの勉強できるんですね。


おじさん、これらの理論だいぶ前から全部知ってんですが、全然ヒーローになれません。

いったい何がいけないんだろ。

だけど、今週ずっとこのコードをみて、ついに、attentionのbackwardがわかってきた。


まだGPT2相当で限られたattentionしかbackwardできませんがコードを少し改良すれば、日本のスパコンでもLLMの学習ができるはず。



Microsoftの小規模LLM、Phi-3を動かす。

おじさん、一か月遅れで、話題のMicrosoftの小規模LLMであるPhi-3を試してみました。

モデルデータが2GバイトとかしかないのにChatGPT3.5より性能が良いと一か月くらい前から話題です。


といっても、ここから学習データを取ってきて、


Hugging Face

https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-gguf



ここからソースを取ってくるだけです。


llama.cpp

https://github.com/ggerganov/llama.cpp




前から思っていたんだけど、おじさんのSJISのWindowsのコンソールで動かすにはどうしたらいいんだろうか?

みんなmacで実行していて、Windowsでの動かし方がわからない・・・・


いろいろ実験した結果、どうやら入出力データをUTF-8で渡さないといけないので、質問をprompt.txtのようにUTF-8のファイルに落として実行すればよいみたい。


-------------------------------

MAIN=x64\Release\main.exe

MODEL=Phi-3-mini-4k-instruct-q4.gguf

%MAIN% -ngl 20 -m %MODEL% -f prompt.txt

-------------------------------


おじさんのCPUのみのマシンで動かしてみました。

なんか結果出た。

-------------------------------

CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temperature

generate: n_ctx = 512, n_batch = 2048, n_predict = -1, n_keep = 1



<|user|> \n自己紹介して <|end|> \n<|assistant|> 

私はAI(人工知能)アシスタント、OpenAIの一部です。私は機械学習と人間のニーズに合わせて定期的に検討されており、さまざまなタスクを支援しています。私の能力には自然言語理解、応答生成、情報の検索などが含まれており、多様な環境で利用できます。私は情報にアクセスし、知識を共有することができますが、あくまで誰もにとって最善のアドバイスを提供するわけではありません。ユーザーの好みや判断に従い、より良い回答を提供できるように努めています。<|end|> [end of text]


llama_print_timings:        load time =    3471.61 ms

llama_print_timings:      sample time =      14.77 ms /   265 runs   (    0.06 ms per token, 17941.77 tokens per second)

llama_print_timings: prompt eval time =   25785.09 ms /    19 tokens ( 1357.11 ms per token,     0.74 tokens per second)

llama_print_timings:        eval time =  392456.34 ms /   264 runs   ( 1486.58 ms per token,     0.67 tokens per second)

llama_print_timings:       total time =  418382.92 ms /   283 tokens

Log end


-------------------------------

すげー、流ちょうな日本語を話すじゃん。