トレーニングにダウンロード以上のメモリが必要な理由
モデルの実行には、その重み以上のメモリはほとんど必要ありません。16ビットの7Bモデルは約14 GBです。トレーニングにはさらに多くのメモリが必要です。学習するすべての重みには、勾配(どの方向に動かすか)とオプティマイザの状態(どの程度動かすかを設定するAdamの移動平均)も必要になるためです。さらに、フォワードパスからのアクティベーションが加わり、これはバッチサイズとサンプルの長さに応じて増加します。どの重みに対してこれらが存在するかによって、フルファインチューニングとLoRAの違いが生じます。
経験則
LoRA ≈ 2 GB per billion parameters + ~3 GB
frozen 16-bit weights adapter, activations, overhead
full ≈ 12 GB per billion parameters + ~4 GB
16-bit weight 2 bytes
16-bit gradient 2 bytes
Adam moment 1 (fp32) 4 bytes
Adam moment 2 (fp32) 4 bytes
─────────
12 bytes per weight
(+ 4 bytes for a 32-bit master copy = 16)- LoRAはベースを16ビットで凍結したままにします。重みあたり2バイトであるため、10億パラメータあたり2 GBとなります。アダプターは非常に小さく、約3 GBでアダプター、そのオプティマイザの状態、中程度の長さのアクティベーション、およびフレームワーク自体をカバーします。
- フルファインチューニングはすべての重みを学習します。16ビットの重みと勾配に加えて、Adamの2つの32ビットモーメント推定値が含まれ、重み1つあたり合計12バイトになります。
- QLoRAは凍結されたベースモデルを4ビットで保存するため、メモリ使用量はLoRAの約3分の1に減少します。8Bモデルの場合、19GBではなく約9GBで済みます。
フルファインチューニングのページでは、重みあたり12バイトではなく16バイトで計算しています。この違いは、従来の混合精度レシピが16ビットの重みとともに保持する32ビットのマスターコピーによるものです。この経験則では、その追加コピーなしでのトレーニングを想定しています。コピーを保持する設定では、10億パラメータあたり約16 GBが必要です。どちらも長いサンプルを処理する前の見積もりです。アクティベーションが追加され、最大長とバッチサイズに応じて増加します。
| モデルサイズ | LoRA | フルファインチューニング |
|---|---|---|
| 0.5B | ~4 GB | ~10 GB |
| 1.5B | ~6 GB | ~22 GB |
| 3B | ~9 GB | ~40 GB |
| 7B | ~17 GB | ~88 GB |
| 14B | ~31 GB | ~172 GB |
アクティベーションは、この経験則では概算しかできない部分です。同時に保持されるトークン数(バッチサイズ×サンプルの長さ)に応じて増加するため、最大長を2倍にすると約2倍になり、非常に長いサンプルの場合はアテンションによってさらに追加される可能性があります。この経験則の固定オーバーヘッドは、中程度の長さを想定しています。サンプルが長い場合は、最後の1ギガバイトまで計画するのではなく、余裕を持たせてください。
実際に利用可能なメモリ量
Appleシリコン搭載のMacなど、ユニファイドメモリを搭載したノートパソコンでは、GPUがメインメモリを共有するため、36 GBのノートパソコンは一般的なゲーミングGPUよりもモデルに多くのスペースを提供できます。ただし、オペレーティングシステムや他のアプリにも割り当てが必要なため、約4分の3がトレーニング用に空いていると計画してください。独立したグラフィックカードを搭載したPCの場合、制限となるのはコンピュータのRAMではなく、GPU専用のメモリです。
- 使用可能なメモリ: オペレーティングシステムとアプリを除き、約27 GB。
- 1.5Bモデル: LoRA 2 × 1.5 + 3 ≈ 6 GB、フルファインチューニング 12 × 1.5 + 4 ≈ 22 GB。どちらも収まります。
- LoRA、より大規模なモデル: 7Bモデルは約17 GBを必要とし、収まります。14Bモデルは30 GB以上を必要とし、収まりません。実際には、LoRAは約10Bまでのモデルに適合します。
- フルファインチューニング、より大規模なモデル: 3Bモデルは約40 GBを必要とするため、約1.5Bが上限となります。
- QLoRA: 27〜32Bモデルは約22〜26 GBを必要とし、収まります。
1.5B · LoRA 2 × 1.5 + 3 ≈ 6 GB
1.5B · full 12 × 1.5 + 4 ≈ 22 GB16 GBのNVIDIA GPUの場合、同じ経験則によれば、8BモデルはLoRAで約19 GBを必要とし、これは多すぎますが、QLoRAでは約9 GBとなり、より長いサンプル用の余裕を残して収まります。
実行時にメモリが不足した場合
- 最大長を短くする。 メモリはサンプルの長さに比例して増加するため、これが最も効果的です。まず、典型的なサンプルが引き続き収まるかを確認してください。
- バッチサイズを小さくする。 ステップごとのサンプル数が減ることで、同時に保持されるアクティベーションが少なくなります。
- QLoRAに切り替える。 4ビットのベースは、16ビットのベースの約4分の1のメモリで済みます。
- 勾配チェックポイントを使用する。 速度が約20〜30%低下する代わりに、アクティベーションメモリを大幅に削減できます。多くのレシピではすでに有効になっています。
- より小規模なモデルを選択する、 またはフルファインチューニングの代わりにLoRAを使用します。
よくある間違い
- ダウンロードサイズで判断すること。フルファインチューニングには、16ビットの重みの6〜8倍に加えて、アクティベーションが必要です。
- 共有メモリのノートパソコンのRAMすべてを利用可能として計算すること。オペレーティングシステムや他のアプリにも割り当てが必要です。
- グラフィックカードのメモリではなく、PCのRAMを計算すること。
- 実行が収まった後に最大長やバッチサイズを増やし、次の実行も収まると期待すること。
- 最大長を典型的なサンプルの長さより短く設定し、モデルが学習すべき応答の最後まで認識できなくなること。
参考文献および関連資料
外部ソースは新しいタブで開きます。
- 01ZeRO: Memory Optimizations Toward Training Trillion Parameter ModelsRajbhandari et al., 2019 · arXiv · arxiv.orgパラメータごとの重み、勾配、オプティマイザの状態の標準的な計算。
- 02GPU memory usageHugging Face Transformers docs · huggingface.co
- 03Model memory estimatorHugging Face Accelerate docs · huggingface.co特定のHugging Faceモデルの実行およびトレーニング用メモリを見積もるツール。
- 04Unified MemoryMLX docs · ml-explore.github.ioAppleシリコンのCPUとGPUが1つのメモリプールを共有する仕組み。