自作LLM作ろうとして 爆散した話 (1).pdf

JunichiroTAKAHASHI1 831 views 35 slides Jan 17, 2024
Slide 1
Slide 1 of 35
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35

About This Presentation

X->@takanas0517


Slide Content

自作LLM作ろうとして
爆散した話

今日の話
PytorchとHugging Face OnlyでLLMをガチで組み上げようとした時の話です。
成功例がみたい人は
Stability AI Japanの秋葉拓哉さんの記事を参考にした後
・もし明日、上司に「 GPT-4を作れ」と言われたら? Stability AIのシニアリサーチサイエンティス
トが紹介する「 LLM構築タイムアタック」
Weight & Biasesの
・ベストプラクティス
を読んで、さらに GPT-NeoXとかを触ってみればいいと思います。

今日の話
全部実はQiitaにあげています。
☆とブクマしてください。トレンドに載せてください。
LLM制作爆死回顧録、自作 LLMを作るときに使った手法全
まとめとどのようにして何の成果も得られなかったのかにつ
いて

まずお前誰だよ
・アカウント名 : 犬(SSR) @takanas0517
・職業: 東大工学部電子情報工学科 3年
・好きなコンピューターサイエンスの分野
・OS
・WebAssembly
・ML
・最近pythonのライブラリ作って全世界公開した
・研究者と開発者の中間みたいな人
・趣味: 節約, フルスクラッチ実装

謝罪
急いで作ったのでコンピューターサイエンスの基礎ができている人向けになってしまいま
した。わかりにくいところがあれば質問をください。

GPT4を使いたい ‼ でもお金は使いたくない ‼
大学3年生の夏 , ちょうどまとまった時間ができた僕は LLMを追うことに決めた
しかし、OpenAIにお金は使いたくない ....

GPT4を使いたい ‼ でもお金は使いたくない ‼
大学3年生の夏 , ちょうどまとまった時間ができた僕は LLMを追うことに決めた
しかし、OpenAIにお金は使いたくない ....


作るか‼

作ろうと思った経緯
・LLMの内部と開発手法を低レベル APIから積み上げてしっかり学ぶため
・自作LLMはEmbeddingsとかの取得が用意だったりカスタマイズ性に優れる
・作ったLLMをHugging Faceに公開して英雄になりたかった
・作れる気がした

パソコン
とりあえずGPU付きのパソコンは昔から欲しかったので奨学金の 30万を使って
ラップトップを購入
CPU : インテル® Core™ i7-13650HX
GPU : NVIDIA® GeForce RTX™ 4060 Laptop GPU 8GB
メモリ : 32GB
OS : Ubuntu 22.04.3 LTS

パソコン
とりあえずGPU付きのパソコンは昔から欲しかったので奨学金の 30万を使って
ラップトップを購入
CPU : インテル® Core™ i7-13650HX
GPU : NVIDIA® GeForce RTX™ 4060 Laptop GPU 8GB ← 実は悲劇
メモリ : 32GB
OS : Ubuntu 22.04.3 LTS

誰でもわかる ‼LLM作り方講座 ‼

1.Transformerを作る
2.学習データセットを用意する
3.次単語予測を頑張る

1.Transformerを作る
・Feed Forward & Layer Norm
↑流石に基本的すぎるので Pytorchの既存の実装を使用
・Positional Encoding 外国の記事
・Attention部分 Paper with code


1.Transformerを作る

2. 学習データセットを用意する
OpenWebTextという大量の文章データを使用。
ここからはNanoGPTというリポジトリを参考に組んだ。
普通, このデータは全て物理メモリに乗せることはできないが、 Hugging Faceの
Datasets APIとnumpy.memmapという素晴らしい方法により解決することができる。
詳しくはここ‼
800万個のデータと 90億トークンの文章データが手に入りました ‼

2. 学習データセットを用意する ')?7P7????p

2. 学習データセットを用意する ')?
トークナイザーについて
<BOS> I am called the Beast . <EOS> -> [0, 7, 2, 11, 91, 14, 51, 4]

機械が文章を処理するためには自然言語数字の羅列に直してやる必要がある。
この時に, 一単語一単語トークナイズしていると、分類モデルのクラス数が膨大になって
しまう。そこで、 GPTや最近の GeminiなどではByte Pair EncodingやSentence Piece
などを用いて効率の良い単語の数値化を行っている。
これはLLMが大きいモデルを訓練できる理由の一つでもあるよ

3. 次単語予測を頑張る

3. 次単語予測を頑張る
次単語予測モデルも組んだし、データも用意できたし !よーし訓練開始だー !

3. 次単語予測を頑張る
次単語予測モデルも組んだし、データも用意できたし !よーし訓練開始だー !

CUDA OUT OF
MEMORY

誰でもわかるわけじゃないかも ‼LLM作り方講座 ‼

1.Transformerを作る
2.学習データセットを用意する
3.次単語予測を頑張る
4.モデルを軽量化せなあかん

4. モデルを軽量化せなあかん
model = GPT()として定義した時には CUDA Errorは起きなかった。
つまり訓練中にメモリが溢れるほどのエラーが起きている。
一体どこで ...?

4. モデルを軽量化せなあかん
model = GPT()として定義した時には CUDA Errorは起きなかった。
つまり訓練中にメモリが溢れるほどのエラーが起きている。
一体どこで ...?

A.計算グラフの構築

微分計算をするために右のような
計算グラフを作っている
これで空間計算量が増えて GPUが
圧迫される

4. モデルを軽量化せなあかん Do the math
大体今回作ろうとしたモデルはパラメーター数 0.1Bモデル, float32ならば、

0.1B×4Byte = 0.4GB

これにプラスされて計算グラフの構築 , Optimizerのパラメーター , etc…が

全てGPUに乗って
20倍以上になります (体感)
こりゃたまんないね

4. モデルを軽量化せなあかん
軽量化手法その 1
まずそもそもモデルの規模を落としましょう。これが一番軽量になります。

なお性能は落ちる。

4. モデルを軽量化せなあかん
軽量化手法その 2
数値を量子化しましょう。一部の計算は float32も精度がいらないです。
bfloat16がおすすめです。理由はアンダーフローが起きて事件が起きたからです。
(Qiita参照)

こうするとモデルの
サイズが落ちます。

4. モデルを軽量化せなあかん
他のメモリ節約方法
本来はGarbage Collectionという機能で使われていないメモリ領域は解放されていくは
ずですが、何故か学習中はそんなこともないので手動でメモリを解放していきます。これ
でGPUの負担はマシになります。

誰でもわかるわけじゃないかも ‼LLM作り方講座 ‼

1.Transformerを作る
2.学習データセットを用意する
3.次単語予測を頑張る
4.モデルを軽量化せなあかん
5.他の工夫

5. 他の工夫
多すぎるので長々と話してもしょうがないので羅列する
・勾配累積: 小さいバッチデータしか扱えない GPUメモリで使われる方法
・PostLNとPreLN: 多層Transformerアーキテクチャにおける勾配消失問題の
解決方法
・Temperature, TopK: 解答に多様性を持たせるため , 正解ラベル以外の出力
も許容する方法 , OpenChat botなどで最初の画面に Temperatureとあるがこ
れが由来
・モデルCompile: あらかじめモデルをコンパイルしておくことで計算が早くなり
ます。詳しくは NVIDIAの資料をどうぞ

色々試した結果....

色々試した結果....

上手くいかなかった

原因考察1
次単語予測のための Context長がGPU不足で確保できず。 (恐らく最重要 )
次単語予測は前 n単語までの単語から n+1単語目を予測するという学習方法だが、
GPUがカツカツな環境での開発では Context長を十分確保できず , 十分な情報を学ぶこ
とができなかった。

原因考察2
そもそも最近の ChatGPTは次単語予測をして大規模に事前学習を行った後に
RLHF(Reinforce Learning from Human Feedback)という方法で強化学習を行ったり、
SFT(Supervised Finetuning)をしている。
rinnaのRepositoryがわかりやすい
これを行う必要があった。

まとめ
色々手法とか言ってきたけど ...

まとめ
色々手法とか言ってきたけど ...

GPU is all we need.

Future Work
・ChatGPTを作るために RLHFガンガンやりやす。 nanoChatGPT
・RAGもまたPytorchのLayerから作ってみたいの思います (without langchain)
・ローカルな LLMを使ってAppを作りたいので合計 20GB以上はとりあえず欲しくて、今
のLaptop 8GBに外付けする形で 12GBとかは欲しいな ~
Tags