本記事の構成
関連キーワードを列挙して、最後の最後にタイトルへのアンサーをする流れになってます。
・QLoRA
量子化したLLMをfinetuningするためのLoRA。
・bitsandbytes
HuggingFaceがサポートする、LLMを量子化するライブラリ。シンプルで高速。
量子化手法は他にもAWQやGPTQがある。精度はAWQやGPTQの方が高いが量子化に時間がかかる
・PEFT
LLMをLoRAでfinetuningするためのライブラリ
・使用するメモリに関するtips
モデルそのもののデータ量以外にも、トレーニングで使う文章もメモリを食う。しかし使用しているメモリのほとんどはモデルそのもののデータによるものである。
・バッチサイズ
一度に処理するデータの数。一個ずつやってたらキリがないから複数個ずつ処理する。増やすと早くなるが、必要なメモリサイズは大きくなる。
・device_map = "auto"
分散処理手法。例えばGPU8台で140GBのモデルを学習するなら、一個あたり17.5GB分の処理が自動で割り当たる。しかし並列処理ではないので、1台が使われている時に残りの7台は順番待ちをしている。
・DDP(Distributed Data Parallel)
分散処理手法。全てのGPUにフルのLLMをロードし、学習をそれぞれ同時処理する。速いが、フルモデルをロードできるだけのGPUメモリが必要。
・FSDP(Full Shared Data Parallel、開発元:Meta)
分散処理手法。device_map = "auto"とDDPのいいどこどり。つまり、モデルを分割してロードしつつ並列処理を行う。コンパクトかつ速い。
でも、モデルを分割する処理するために最初にGPUへフルモデルをロードする必要があったため、結局大きめのGPU必要じゃんってなった、というプチトラブルを乗り越えて構築完了したらしい。
FSDPをtransformers,accelarate,PEFTの生態系に適応させることに成功しました。
・Gradient Checkpoint
一部のデータで処理した結果を保存して、次のデータで処理をして、結果保存して、を繰り返す手法。バッチ処理が可能になる。
・CPU offloading
使用してない重みデータをCPUに保存しておく手法。GPUリソース使用量を抑えられる。
・Flash Attention 2
CUDAで効率的にアテンション計算する手法。アテンション計算では、入力データのどこに注目するべきかを計算。データそのものをいじるのではなく、データのどこに注目すべきかというデータを追加するイメージ。
・AWQとLora
現在、AWQで量子化したLLMをLoRAでfinetuningすることはできないっぽいです。
・上記を総合すると、、、
QLoRA(PEFT)とFSDPを使うと、量子化された70BのLLMを低GPUリソースでfinetuningできそう!
でも量子化方法はGPTQやbitsandbytesに限るよ、って感じですかね。