LLMの学習・fine-tuneを軽くする技術カタログ——メモリと計算予算をどこで削るか
この記事はAIによって生成されています。内容の正確性は保証されず、記事の利用による損害について一切の責任を負いません。この記事を読み進めることで、利用規約に同意したものとみなされます。
- 想定読者: LLMを自分で学習・fine-tuneする、あるいはモデルを作って小さく・速くしたいエンジニア
- 前提知識: Transformerの学習の大枠とGPUメモリの基本。各技術は本文で補足する
- 所要時間: 約15分
概要
LLMを「動かす」ときと「学習する」ときでは、リソースの出どころがまるで違う。推論なら重みを読み出せばよかったが、学習では同じパラメータに対して、勾配・オプティマイザ状態・活性化まで同時に抱える必要がある。だからフルfine-tuneは推論よりはるかに重く、7Bモデルですら素朴にやると単一GPUに載らない。
この記事の背骨はここにある。学習のコストは「計算(FLOPs/GPU時間)」と「メモリ(重み+勾配+オプティマイザ状態+活性化)」の2つに出る。推論最適化が「1トークンあたりに動かすバイト数」を減らす話だったのに対し、学習最適化はこの2つのどこを削るかで手が分かれる。同じ「軽くする」でも、削る対象が違えば効く技術も違う。
大きく4つの方向がある。学習で持つデータ構造そのものを分割・節約する(混合精度・勾配チェックポイント・ZeRO/FSDP)、学習する重みの数を絞る(LoRA/QLoRAなどのPEFT)、同じ計算予算でモデル容量を増やす(MoE)、そして学習コストを先払いして小さく速い最終モデルを作る(蒸留・枝刈り・QAT)。
先に結論を言えば、既存モデルをfine-tuneするだけならLoRA/QLoRAがほぼ唯一の現実解で、単一GPUでも大型モデルに手が届く。巨大モデルをゼロから学習するなら混合精度・勾配チェックポイント・ZeRO/FSDPでメモリを分割するのが前提になる。同じ計算予算で賢くしたいならMoEが効くが、メモリと学習の不安定さを払うことになる。本記事では、これらを「何を削って何を払うか」で並べて比較する。
なぜ学習は推論よりリソースを食うのか
推論で必要なのは、モデルの重みと、いま処理しているトークンの活性化くらいだ。ところが学習では、1つのパラメータごとに次の4つを同時に持つ。重みそのもの、逆伝播で計算する勾配、オプティマイザが保持する状態、そして逆伝播のために前向き計算で出た活性化を全層分。
混合精度(FP16/BF16)でAdamを使う標準的な構成だと、パラメータ1個あたりのメモリはこう積み上がる。FP16の重みが2バイト、FP16の勾配が2バイト、そしてオプティマイザ状態が12バイト(FP32のマスター重み4+1次モーメント4+2次モーメント4)。合わせて1パラメータあたり約16バイトになる1。活性化はこれとは別枠で、バッチサイズと系列長と層数に比例して増える。
この16バイトが効いてくる。7Bモデルなら、重み+勾配+オプティマイザ状態だけで約112GB。活性化を加えればさらに膨らむ。推論なら7BはFP16で14GB、4bit量子化なら4GB弱で動くことを考えると、学習の重さが桁違いだとわかる。1兆パラメータのモデルなら、Adamの16bit学習でオプティマイザ状態・勾配・パラメータを保持するのに約16TBが要る1。学習最適化とは、要するにこの巨大な内訳のどこを削るかという話だ。
学習メモリを削る:混合精度・勾配チェックポイント・ZeRO/FSDP
まず、ゼロから(あるいはフルfine-tuneで)大きなモデルを学習する場合に効く、メモリ内訳そのものを削る技術から。
混合精度学習は土台だ。重み・活性化・勾配をFP16/BF16で計算してメモリをおよそ半分にする2。ただしFP32のマスター重みは別途持つ(前述の16バイト内訳のうち4バイト)。FP16は表現範囲が狭く小さい勾配が0に潰れるので、損失をスケールしてから逆伝播するloss scalingが要る2。
勾配チェックポイント(活性化の再計算)は、活性化メモリを狙い撃ちする。前向き計算で一部のチェックポイントだけ残し、逆伝播で必要になった活性化はそこから計算し直す。これでn層の活性化メモリをO(√n)に落とせる。代償は前向き計算をもう1回ぶん走らせるコストで、論文の実測では1000層モデルの活性化を48GBから7GBに削り、実行時間の増加は約30%だった3。
ZeRO(DeepSpeed)は、データ並列の無駄を削る。通常のデータ並列は全GPUが重み・勾配・オプティマイザ状態のフルコピーを冗長に持つが、ZeROはこれを分割する。段階があり、Stage 1はオプティマイザ状態だけを分割して約4倍、Stage 2は勾配も分割して約8倍、Stage 3はパラメータまで分割してデータ並列度に比例した削減になる(64GPUなら最大64倍)1。PyTorch標準のFSDPは、このStage 3に相当する「パラメータ・勾配・オプティマイザ状態の分割」をネイティブに実装したものだ4。さらにGPUに収まらないなら、オプティマイザ状態をCPUへ逃がすZeRO-Offload(単一V100で13Bを学習可能)5、CPUとNVMeまで使うZeRO-Infinity6がある。いずれも分割や退避のぶん通信が増えるので、計算と通信を重ねないと速度が落ちる。
学習する重みを絞る:LoRA / QLoRA
ゼロから学習するのでなく、既存モデルを自分のタスクに合わせるだけなら、話はずっと軽くなる。鍵は「全部の重みを更新しない」ことだ。これがPEFT(parameter-efficient fine-tuning)で、いま標準なのがLoRA系だ。
LoRAは、事前学習済みの重みを凍結したまま、各層に小さな低ランク行列のペアを差し込んで、そこだけを学習する7。更新するのは差し込んだ小さな行列だけなので、学習可能パラメータが激減する。原典はGPT-3 175Bで、学習可能パラメータを最大1万分の1、学習時のVRAMを1.2TBから350GBへ(約3分の1)削減したと報告している7。効くのはオプティマイザ状態だ。凍結した重みのぶんは勾配もオプティマイザ状態も持たなくていいので、前述の「16バイト」の大部分が消える。タスクごとの保存も小さく、175Bのチェックポイントが350GBのところ、LoRAなら35MB程度で済む7。しかも学習した行列は推論時に元の重みへマージできるので、追加の推論レイテンシは生じない7。品質もRoBERTaからGPT-3規模でフルfine-tuneと同等以上とされる7。
QLoRAはこれを極限まで押し下げる。ベースモデルを4bit(NF4)に量子化して凍結し、その4bitモデルを通して勾配を小さなLoRAアダプタに流す8。4bit NormalFloat、量子化定数自体も量子化するDouble Quantization、メモリスパイクを抑えるPaged Optimizersの3つで、通常は780GB超を要する65Bモデルのfine-tuneを、単一の48GB GPUに収めた。しかもフル16bit学習のタスク性能を保てるという8。LoRAをさらに改良したDoRAのような派生もあり、重みを大きさと方向に分けて方向側にLoRAをかけることで、推論オーバーヘッドを増やさずに品質を上げると報告されている9。
落とし穴もある。複数タスクのアダプタを別々に持って動的に切り替えると、マージしない運用では推論レイテンシが乗る7。逆にマージすると、その場では複数タスクを1バッチで切り替えられなくなる。ランクの選び方もタスク依存で、小さすぎると表現力が足りない。
同じ計算予算で容量を増やす:MoE
ここまでは「コストを削る」話だったが、MoEは少し毛色が違う。同じ計算量で、より大きく賢いモデルを学習できる技術だ。
仕組みは疎活性化(sparse activation)にある。FFNを複数のexpertに分け、ルーターがトークンごとに一部のexpertだけを通す。各トークンが使う計算(FLOPs)は一定に保ったまま、総パラメータ=モデルの容量だけを増やせる10。だから同じ計算予算で、denseより大きなモデルを学習できる。Switch Transformerは同じ計算資源でT5比最大7倍の事前学習高速化を報告し11、Hugging Faceの解説も「MoEはdenseより事前学習がはるかに速く、同じ予算でモデルやデータを大幅にスケールできる」とまとめている10。実例として、671BパラメータのMoEであるDeepSeek-V3は約278.8万 H800 GPU時間($2/GPU時間なら約560万ドル、2か月足らず)で事前学習を終えており、MoEの学習経済性を示す代表になっている12(この数字は本番学習のGPU時間で、研究や試行錯誤のコストは含まない)。巨大モデルを実際に分散学習するときは、各expertを別デバイスに置くexpert parallelismが使われ、GShardはこの方式で600B超のモデルを2048 TPU v3・4日で学習した13。
ただしMoEの学習にはdense にない難所がある。まず、ルーターが一部のexpertにトークンを集中させると残りが育たないので、負荷を均等化する補助損失(load balancing loss)が要る。Switch Transformerはこの係数を0.01に設定している11。学習はもともと不安定で、ST-MoEはルーターのlogitsを抑えるrouter z-lossで安定化とfine-tuning時の品質を改善した14。容量(capacity factor)を小さくするとあふれたトークンが捨てられて品質が落ち、大きくするとメモリと計算が無駄になる10。fine-tuningでは過学習しやすく、「同じ事前学習perplexityでもsparseモデルはdownstreamタスクでdenseに劣る」傾向も報告されている(一方でinstruction-tuningはMoEに特に効く)10。そして推論時は、活性パラメータが少なくて速い反面、全expertをVRAMに載せる必要があるのでメモリは減らない。Mixtral 8x7Bは総47Bパラメータで、推論にdense 47B相当のVRAMが要る15。要するにMoEは、計算を節約する代わりにメモリと運用の複雑さを払う技術だ。
学習を先払いして小さく速いモデルを作る
最後に、学習コストを先に払って、デプロイ後にずっと軽い最終モデルを得る圧縮系。これらは「いま学習を重くして、あとの推論を軽くする」取引だ。
知識蒸留は、大きな教師モデルの出力分布を小さな生徒モデルに模倣させて知識を移す。DistilBERTはBERTに対しパラメータ40%減・推論60%高速化で、言語理解能力の97%を保った16。教師の推論と生徒の学習という先払いコストが要るが、一度作れば生成は軽い。MoEをdenseに蒸留して、約20分の1のパラメータで品質ゲインの3割ほどを残す、という使い方もある11。
枝刈り(pruning)は重要度の低い重みを削り、残りを再学習して精度を戻す。古典的な研究でAlexNetを9倍、VGG-16を13倍、精度を保ったまま削減している17。量子化やハフマン符号と組み合わせるDeep Compressionでは35〜49倍の圧縮も報告された17。ただし個々の重みを削る非構造化の枝刈りは疎行列になり、専用のハードやライブラリがないと圧縮率がそのまま速度向上にはつながらない。再学習のコストもかかる。
量子化対応学習(QAT)は、学習中に量子化の丸めをシミュレートして、低ビットでも精度が落ちにくいモデルを作る18。学習後にそのまま量子化するPTQ(GPTQ/AWQなど、推論編で扱った手法)が学習不要で手軽なのに対し、QATは学習コストを払うかわりに、より低いビット幅でも精度を保ちやすい。目標ビット幅と、学習コストを払えるかで選ぶことになる。
一覧で比較する
学習側の技術を「何を削るか/何を払うか」で並べる。数値はいずれも各出典が特定条件で報告した代表値で、環境により変動する。
| 技術 | 主に削る対象 | 払うコスト | 代表的な数値 | 主な落とし穴 |
|---|---|---|---|---|
| 混合精度学習 | 重み・勾配・活性化のメモリ | loss scalingの手間 | メモリ約2分の12 | FP16のアンダーフロー |
| 勾配チェックポイント | 活性化メモリ | 前向き計算+1回(時間+約30%) | 活性化O(√n)、48→7GB3 | 再計算で学習が遅くなる |
| ZeRO / FSDP | 重み・勾配・オプティマイザ状態(分割) | GPU間通信の増加 | Stage1/2/3で4/8/Nd倍14 | 通信と計算の重ね合わせ必須 |
| ZeRO-Offload/Infinity | GPUメモリ(CPU/NVMeへ退避) | PCIe/NVMe帯域・速度低下 | 単一V100で13B5 | 帯域がボトルネック |
| LoRA | 学習可能パラメータ・オプティマイザ状態 | ランク選択・タスク依存 | 学習paramを最大1万分の17 | 別ロード時の推論遅延 |
| QLoRA | 学習メモリ(4bit凍結+LoRA) | 量子化精度・専用カーネル依存 | 65Bを単一48GB GPU8 | bitsandbytes依存 |
| MoE | 学習・推論のFLOPs(容量は増やす) | メモリ大・学習不安定・補助損失 | 事前学習T5比7倍11 | 全expert常駐・過学習 |
| 蒸留 | 最終モデルのサイズ・推論コスト | 教師推論+生徒学習を先払い | 40%減・60%速・97%維持16 | 教師を超えにくい |
| 枝刈り+再学習 | 最終モデルのパラメータ数 | 再学習・(非構造化は)専用HW | 9〜13倍圧縮(精度維持)17 | 圧縮率≠速度向上 |
| QAT | 最終モデルのビット幅 | 学習コスト(量子化シミュレート) | 低ビットでも高精度18 | PTQより手間が大きい |
LoRA/QLoRAとZeRO/FSDP・混合精度・勾配チェックポイントは「学習そのものを軽くする」技術で、蒸留・枝刈り・QATは「学習を重くして最終モデルを軽くする」技術だ。MoEはその中間で、計算を節約しながら容量を買い、メモリと複雑さを払う。
どこから手をつけるか
目的別に整理するとこうなる。
既存モデルを自分のタスクに合わせたいだけなら、まずLoRA、メモリが厳しければQLoRAだ。単一GPUでも大型モデルに手が届くし、フルfine-tuneに品質で大きく劣ることも少ない。多くの実務はここで足りる。
大きなモデルをゼロから、あるいはフルfine-tuneで学習するなら、混合精度を土台に、活性化が厳しければ勾配チェックポイント、複数GPUがあるならZeRO/FSDPでメモリを分割する。これでも載らないならZeRO-Offload/Infinityで退避する。順番としては、混合精度→勾配チェックポイント→ZeRO Stage 1/2/3→オフロード、と必要なぶんだけ強くしていくのが無駄がない。
同じ計算予算でモデルを賢くしたいなら、MoEを検討する。ただしメモリと学習の不安定さ、fine-tuningの過学習という代償を理解したうえで使う。
学習はともかくデプロイを軽くしたいなら、蒸留・枝刈り・QATで小さく速い最終モデルを作る。一度払えば、あとの推論がずっと軽くなる。ここから先(できた軽いモデルをどう速く動かすか)は推論側の話になる。
注意点と限界
数値はすべてモデル・ハードウェア・データ・設定に依存する。出典が報告した代表値であって、自分の環境で同じ結果が出る保証はない。学習は試行錯誤のコストが大きいので、小さい構成で回してから本番に上げるのが安全だ。
誤解しやすい点も挙げておく。LoRA/QLoRAが削るのは主にオプティマイザ状態と勾配で、活性化メモリは別途かかる(だから長系列では勾配チェックポイントが併用される)。MoEは学習・推論の計算を減らすがメモリは減らさない。枝刈りの圧縮率はそのまま速度向上ではない。QLoRAの「フル16bit相当」やDistilBERTの「97%維持」は、検証されたベンチでの結果であって、全タスクでの保証ではない。
そして大前提として、ここで扱ったのは「学習・構築のリソースをどう削るか」であって、何を学習させるか(データの質と量)の話ではない。リソースをいくら節約しても、学習データが用途に合っていなければ良いモデルにはならない。
まとめ
学習側の最適化は、推論とは別の軸で考える。学習のコストは計算(FLOPs/GPU時間)とメモリ(重み+勾配+オプティマイザ状態+活性化)に出る。この内訳のどこを削るかで技術が分かれ、既存モデルの調整ならLoRA/QLoRA、巨大モデルの学習なら混合精度+勾配チェックポイント+ZeRO/FSDP、容量を上げたいならMoE、デプロイ軽量化なら蒸留・枝刈り・QAT、と対応する。
| 目的 | 第1の手 | 次の手 |
|---|---|---|
| 既存モデルをfine-tune | LoRA | QLoRA(メモリが厳しいとき) |
| 巨大モデルを学習 | 混合精度 + 勾配チェックポイント | ZeRO/FSDP → オフロード |
| 同じ計算予算で賢く | MoE(疎活性化) | expert parallelismで分散学習 |
| デプロイを軽くする | 蒸留 | 枝刈り / QAT |
今日試すなら、手元のモデルにQLoRAで小さなfine-tuneをかけて、フルfine-tuneと比べてGPUメモリがどれだけ減るかを見てみるのがいい。「16バイト×パラメータ数」の大部分がアダプタだけに縮む感覚を一度つかめば、学習リソースの削りどころが見えてくる。
この記事は「学習・構築」側のリソース節約に絞った。できあがったモデルを実際に速く・軽く動かす側(量子化・KVキャッシュ・投機的デコード・バッチング・サービングフレームワーク)は、姉妹記事「LLM推論を速く・軽くする技術カタログ」で扱う。
関連記事
このテーマに関連する他の記事もご覧ください:
- LLM推論を速く・軽くする技術カタログ - 学習したモデルを運用時に速く・軽くする技術
- LLMコード生成の技術的限界:幻覚、非効率性、そして実践的対処法 - ローカル・小規模LLMを実務で使うときの限界
- LLMの知識の限界とスキル/ルールの境界線 - 単一モデルに何を持たせられるか
参考資料
本文中の引用番号に対応する参考資料を番号順に記載しています。倍率・削減率は各出典が特定の条件下で報告した値であり、環境により変動します。
ZeRO: Memory Optimizations Toward Training Trillion Parameter Models - Samyam Rajbhandari et al. (2019, SC 2020). データ並列の冗長を排除し、Stage 1/2/3でオプティマイザ状態/勾配/パラメータを分割(約4/8/Nd倍削減)。Adamの混合精度で1パラメータ約16バイト・1兆パラメータで約16TBの内訳も解説(Microsoft Research解説)。【信頼性: 高(査読付き・トップ会議)】 ↩︎ ↩︎2 ↩︎3 ↩︎4
Mixed Precision Training - Paulius Micikevicius et al. (2017, ICLR 2018). FP16/BF16でメモリを約2分の1に。FP32マスター重みとloss scalingでアンダーフローに対処。【信頼性: 中〜高(査読付き・標準技術)】 ↩︎ ↩︎2 ↩︎3
Training Deep Nets with Sublinear Memory Cost - Tianqi Chen et al. (2016). 勾配チェックポイント(活性化再計算)で活性化メモリをO(√n)に。実測で1000層モデルを48GB→7GB、実行時間+約30%。【信頼性: 中〜高(広く採用)】 ↩︎ ↩︎2
PyTorch FSDP: Experiences on Scaling Fully Sharded Data Parallel - Yanli Zhao et al. (2023, VLDB 2023). パラメータ・勾配・オプティマイザ状態を分割するPyTorchネイティブ実装(ZeRO Stage 3相当)。公式ドキュメント。【信頼性: 中〜高(査読付き・公式)】 ↩︎ ↩︎2
ZeRO-Offload: Democratizing Billion-Scale Model Training - Jie Ren et al. (2021, USENIX ATC 2021). オプティマイザ状態と更新計算をCPUへ退避し、単一V100で13Bパラメータの学習を実現。【信頼性: 中〜高(査読付き)】 ↩︎ ↩︎2
ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning - Samyam Rajbhandari et al. (2021, SC 2021). GPU/CPU/NVMeの3階層を使い、単一ノードで1兆パラメータのfine-tuneを可能に。【信頼性: 中〜高(査読付き)】 ↩︎
LoRA: Low-Rank Adaptation of Large Language Models - Edward Hu et al., Microsoft (2021). 重みを凍結し低ランク行列のみ学習。GPT-3 175Bで学習可能パラメータを最大1万分の1、学習時VRAMを1.2TB→350GBに削減、チェックポイントは350GB→35MB。マージで推論レイテンシ増なし。あわせてHugging Face PEFT docs(アダプタのマージ・切替)。【信頼性: 中〜高(査読付き・広く採用)】 ↩︎ ↩︎2 ↩︎3 ↩︎4 ↩︎5 ↩︎6 ↩︎7
QLoRA: Efficient Finetuning of Quantized LLMs - Tim Dettmers et al. (2023, NeurIPS 2023). 4bit NF4で凍結したベースにLoRA。通常780GB超を要する65Bのfine-tuneを単一48GB GPUで、フル16bit相当の性能を維持。【信頼性: 中〜高(査読付き)】 ↩︎ ↩︎2 ↩︎3
DoRA: Weight-Decomposed Low-Rank Adaptation - Shih-Yang Liu et al., NVIDIA (2024). 重みを大きさと方向に分解し方向側にLoRAを適用。推論オーバーヘッドを増やさずLoRAを一貫して上回ると報告。【信頼性: 中(プレプリント・広く採用)】 ↩︎
Mixture of Experts Explained - Hugging Face (2023). MoEは同じ計算予算で事前学習を大幅にスケールできる一方、全expert常駐のVRAM要件・fine-tuningでの過学習・学習不安定・load balancing補助損失・capacity factorなどの課題を解説。【信頼性: 中〜高(公式解説ブログ)】 ↩︎ ↩︎2 ↩︎3 ↩︎4
Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity - William Fedus, Barret Zoph, Noam Shazeer (2021, JMLR 2022). 1-expertルーティングで同じ計算資源でT5比最大7倍の事前学習高速化。負荷均等化の補助損失係数0.01、MoE→dense蒸留で約1/20のパラメータに品質ゲインの約3割を保持。【信頼性: 中〜高(査読付き)】 ↩︎ ↩︎2 ↩︎3 ↩︎4
DeepSeek-V3 Technical Report - DeepSeek-AI (2024). 671BパラメータMoEを約278.8万 H800 GPU時間で事前学習。MoEの学習経済性の実例(本番学習のGPU時間のみで研究・試行コストは含まない)。【信頼性: 中〜高(技術報告・実測)】 ↩︎
GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding - Dmitry Lepikhin et al. (2020). expert parallelismで600B超のMoE翻訳モデルを2048 TPU v3・4日で学習。【信頼性: 中〜高(広く参照)】 ↩︎
ST-MoE: Designing Stable and Transferable Sparse Expert Models - Barret Zoph et al. (2022). router z-lossで学習の不安定さとfine-tuning時の品質を改善。【信頼性: 中〜高(広く参照)】 ↩︎
Mixtral of Experts - Mistral AI (2024). 総47Bでトークンあたり約13Bを活性化。推論は速いが全expert常駐でdense 47B相当のVRAMが必要(メモリは減らない)。【信頼性: 中〜高(技術報告・実測)】 ↩︎
DistilBERT, a distilled version of BERT - Victor Sanh et al. (2019). 知識蒸留でパラメータ40%減・推論60%高速化・言語理解性能97%維持。【信頼性: 中〜高(広く検証された原典)】 ↩︎ ↩︎2
Deep Compression - Song Han et al. (2015, ICLR 2016). 枝刈り+量子化+ハフマン符号でAlexNet 35倍・VGG-16 49倍圧縮(精度維持)。枝刈り+再学習単体でも9〜13倍(原典)。【信頼性: 中〜高(査読付き・古典)】 ↩︎ ↩︎2 ↩︎3
Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference - Benoit Jacob et al., Google (2017, CVPR 2018). 学習中に量子化をシミュレートするQAT。整数演算のみの推論を可能にし、PTQより低ビットでも精度を保ちやすい。【信頼性: 中〜高(査読付き)】 ↩︎ ↩︎2