自分のデータで7Bモデルをファインチューニングすることに決めた。そこで最初の本当の分岐点にぶつかる。3つの手法名、それぞれ違う答えがついている。UnsloftのドキュメントはQLoRAから始めろと言う。Axolotlはハードウェアによると言う。ざっと読んだブログ記事の半分は「たいていはLoRAを使え」と言って終わる。一方であなたは1枚のGPUを見つめ、そのどれかすら動かせるのか確信が持てない。
これは他のすべてに先立つ決定だ。選ぶ手法がVRAM予算を決め、VRAM予算がハードウェアを決め、ハードウェアがコストを決める。手法を間違えると、必要のなかったGPUメモリに金を燃やすか、そもそもその仕事に合わなかったカードでメモリ不足のクラッシュを週末じゅう追いかけることになる。
では決着をつけよう。LoRA、QLoRA、フルファインチューニングの実際の違い、それぞれがメモリと品質の面でどれだけコストになるか、そして自分のケースをどれかに当てはめるためのルールを見ていく。
短いバージョン
- デフォルトはQLoRAだ。 ほとんどのシングルGPUファインチューニングでは、QLoRAから始めるのがいい。Axolotlの表では、7-8BのQLoRA実行はコンテキストが短くマイクロバッチが小さいと仮定した場合、おおよそ10-14GBのVRAMとされている。これは12-24GBの多くのコンシューマー向けやプロシューマー向けカードには収まるが、すべての低VRAMカードには収まらない。メモリに余裕があり、もっと速いステップを望むなら普通のLoRAを使う。フルファインチューニングは本当に必要な稀なケースのために残しておく。
- VRAMの差は大きい。 Axolotlの公開データによれば、7Bモデルのファインチューニングにはフルファインチューニングでおよそ60-80GB、LoRAで16-24GB、QLoRAで10-14GBが必要となる。この差こそが、パラメータ効率手法が存在する理由そのものだ。
- 品質の低下はタスクに依存し、一定ではありません。 ほとんどの指示追従タスクや構造化出力タスクでは、LoRAとQLoRAはフルファインチューニングと数パーセントの差に収まります。数学のような複雑な推論ではその差が広がります。そこがフルファインチューニングがそのコストに値する場面です。
- フルファインチューニングは例外であり、基本ではありません。 これに手を伸ばすのは、大きな分布シフト、事前学習規模の変更、あるいはベンチマークで差が明確に出る推論重視タスクの場合であり、安全なデフォルトとしてではありません。
このガイドが扱わないこと
これは手法選択のガイドであり、実装の手順書ではありません。いくつかの項目は意図的に対象外としています。
- LoRAのバリアント (DoRA、VeRA、LoRA+)。3つの中核的手法がまず重要な判断であり、これらのバリアントは後で使う改良版です。
- ステップバイステップのコード。 ここにはインストールコマンドやトレーニングスクリプトはありません。それは別の実践的なウォークスルーであり、ここでは扱いません。
- マルチGPUトレーニング (FSDP、DeepSpeed ZeRO) と データセットの準備: どちらもそれ自体で大きなテーマだ。
- RLHF、DPO、そして選好最適化。 これらは教師ありファインチューニングとは異なる目的関数のクラスだ。
- そもそもファインチューニングをすべきかどうか。 ファインチューニングが retrieval と比べて適切な手段かどうか確信がないなら、その比較にはここで手法を選ぶ前に、それ自体の答えが必要だ。
LoRA、QLoRA、フル・ファインチューニングは実際には何が違うのか?
フル・ファインチューニングはモデルのすべてのパラメータを更新する。LoRA はベースモデルを固定し、代わりに小さな低ランクアダプター行列を学習する(パラメータ数のおよそ0.1〜2%)。QLoRA は LoRA にさらに一手を加える。固定されたベースモデルを4ビット精度まで量子化する(NF4、NormalFloatと呼ばれるデータ型を使用)ことで、アダプターを学習している間、ベースが占めるメモリをはるかに小さくする。
この3つを頭の中で整理する最もすっきりした方法は、はしごとして捉えることだ。各段が、その下の段からコストを1つ取り除いていく。
フルファインチューニング は最下段であり、最も負荷が大きい。すべての重みが学習可能なため、オプティマイザはモデルのすべてのパラメータについて勾配とオプティマイザの状態を追跡しなければならない。メモリが消費されるのはまさにそこであり、計算式については次のセクションで扱う。
LoRA (Low-Rank Adaptation)は元の重みを固定し、モデルの層に小さな学習可能な行列を注入する。学習するのはそれらの行列だけで、ベースモデルはただ同乗しているだけだ。LoRAの論文によれば、これにより175Bモデルで学習可能パラメータを最大10,000倍削減し、その規模でGPUメモリを約3倍削減しつつ、著者らがテストしたモデルでは「モデル品質においてファインチューニングと同等かそれ以上」の性能を発揮したという。変化するパラメータがこれほど少ないため、学習後の結果は非常に小さい。Hugging Faceの PEFTブログ は2つの参考になる基準点を示している。1つは bigscience/mt0-xxlの40GBのフルチェックポイントで、もう1つは保存されたアダプタがわずか19MBという別のLoRAの例だ。要点は変わらない。PEFTのチェックポイントは、フルモデルのチェックポイントと比べて通常非常に小さい。
QLoRA はLoRAを基に、LoRAが手を付けなかった部分、つまり固定されたベースをさらに縮小する。それらの重みを4ビットNF4に量子化するということは、ベースモデルが16ビットの場合と比べてごくわずかなメモリしか占有しないことを意味し、その上でアダプタは依然としてフル精度で学習される。QLoRAの論文はNF4を「正規分布する重みに対して情報理論的に最適」と説明しているが、これは4ビット表現がモデルの重みの実際の分布に一致するように選ばれているという事実を正確に言い換えたものであり、そのため単純な4ビット丸め処理よりも損失が少なくなる。
これがコンセプト全体のスタックだ。フルファインチューニングはすべてを学習し、LoRAはベースを固定してアダプタを学習し、QLoRAは固定されたベースを圧縮してアダプタを学習する。それ以外のすべて(VRAM、品質、どちらをいつ使うか)はこの3つの選択から導かれる。
各手法に必要なVRAMはどれくらいか?
7Bモデルの場合、おおよその数値はフルファインチューニングで60-80 GB、LoRAで16-24 GB、QLoRAで10-14 GBで、これは Axolotlが公開した表。実際的な結果として、QLoRAは短いコンテキストと小さいバッチ設定であれば、12-24 GBの単一のコンシューマー向けまたはプロシューマー向けGPU多数に収まることが多いが、7Bモデルのフルファインチューニングにはデータセンター級のメモリまたはマルチGPU構成が必要になる。
フルファインチューニングがなぜこれほど重いのか。簡単な計算をしてみる。すべてのパラメータを学習させると、GPUはパラメータごとに3つのものを保持する。重み自体、その勾配、そしてオプティマイザの状態だ(Adam系のオプティマイザは重みごとに追加で2つの値を保持する)。だからこそメモリのコストはモデル自体のサイズの数倍になる。LoRAはベースを凍結するため、この勾配とオプティマイザの負担は小さなアダプター行列にしか発生しない。QLoRAはさらに凍結したベースを16-bitではなく4-bitで保持し、残る中で最大のコストを削減する。
以下は、Axolotlのドキュメントと大規模モデルの数値についてはQLoRA論文に基づいた、モデルサイズ別の3つの手法の比較だ。
| メソッド | 1-3Bモデル | 7-8Bモデル | 70B+モデル |
|---|---|---|---|
| フルファインチューニング (bf16 + AdamW) | 24-32 GB | 60-80 GB | 4-8x 80 GB |
| LoRA (bf16) | 8-12 GB | 16-24 GB | 2x 80 GB |
| QLoRA (4-bit NF4) | 6-8 GB | 10-14 GB | 40-48 GB |
出典:モデルサイズ全体にわたる3つの手法すべてについてのAxolotlのドキュメント。QLoRAの論文でも独立に、単一の48GB GPUで65Bモデルをファインチューニングし「フルの16bitファインチューニングと同等のタスク性能を保持しながら」行えたと報告されており、これは70BのQLoRAの数値と一致する。Hugging Faceの 4bit量子化に関するブログ また、単一の16GB T4で学習した13Bモデルと、QLoRAを使って24GBのGPUで学習した33Bモデルを別途示している。目標が表の行の間に位置する場合、これらは有用な目安になる。
覚えておく価値のある数字はひとつ。65Bモデルが48GBのカード1枚で動くということだ。これがQLoRAの目玉となる結果であり、「GPUが1枚しかない」という言葉の意味を書き換えるものだ。
このセクションの要点: VRAM使用量の順序はfull >> LoRA > QLoRAであり、fullからQLoRAへの差は、あるジョブをマルチGPUラックから1枚のカードに移せるほど大きい。
LoRAやQLoRAは本当に品質を犠牲にするのか?
指示追従型やstructured-output系のタスクの大半では、LoRAとQLoRAはフルファインチューニングと数パーセントの差にとどまる。複雑な推論(特に数学)ではその差が広がり、フルファインチューニングが明確に優位を保つ。つまり答えは「ほぼ同等」でも「劣る」でもない。タスク次第であり、タスクの種類がその境界線のどちら側にいるかを教えてくれる。
タスクごとに最も明確な証拠は、2023年9月のAnyscaleによる Llama 2に関するAnyscaleの研究。構造化された機能表現タスクであるViGGOでは、LoRAは7Bおよび13Bモデルでフル・ファインチューニングの精度の約95%に達しました。これは著者らが受け入れ可能なトレードオフと考えた2%の差です。SQL生成では、LoRAはフル・ファインチューニングにほぼ匹敵し、LoRA 13Bモデルはフルにファインチューニングされた7Bモデルを実際に上回りました。数学的推論のベンチマークであるGSM8kでは、LoRAは7Bと13Bで一貫してフル・ファインチューニングより性能が劣り、その差は70Bでのみ縮小しました。Anyscaleチームの見解は、LoRAの低ランク近似が多段階の数学のような複雑なスキルを捉えられない可能性があるというものです。
この数値に関する1つの注意点として、この研究は2023年9月にLlama 2で実施されました。タスクタイプ別のパターン(構造化出力は近く、複雑な推論はさらに離れている)は、それ以降も本質的に維持されている持続的な結論です。しかし正確な割合は、Llama 3やMistralなどの新しいベースモデルでは異なる可能性があるため、この数値をあなたのモデルへの保証ではなく、トレードオフの形として扱ってください。
QLoRAの品質に関する話は独自のものです。QLoRAの論文によると、QLoRAで訓練された65BモデルであるGuanacoは、Vicunaベンチマークでchatgptの性能の99.3%に達しました。強力ですが、それは特定のベンチマークとその2023年の比較に限定されたものであり、「QLoRAはChatGPTと同等」という一般的な主張ではありません。通常のLoRAと比べて、AxolotlはQLoRAを「量子化ノイズによるわずかな劣化」を伴うものと特徴づけています。4ビットのベースはLoRAのフル精度ベースにはない小さな誤差を持ち込みます。ほとんどの作業ではこれは見えませんが、わずかな精度の変化に敏感なタスクでは、想定するのではなく確認する価値があるものです。
プロのヒント: 最も一般的な品質の驚きはQLoRA対LoRAではありません。それは、開始したベースモデルよりも悪くなったファインチューニング済みモデルです。通常これは、トレーニングが意図しないことをしたことを意味します。狭いデータセットで過度に積極的だったか、新しいタスクだけで評価され、一般的な能力が静かに低下していたかです。信頼する前に、常にトレーニング分布外のいくつかのプロンプトでファインチューニング済みモデルをテストしてください。そこでの劣化は、後退すべきという信号であり、出荷すべきという信号ではありません。
このセクションの要点: 品質の同等性はタスクに依存します。構造化された出力と指示への従順さはLoRA/QLoRAにとって安全ですが、複雑な推論はフル・ファインチューニングがまだそのコストに見合う分野です。
各手法をいつ選ぶべきか?
ほとんどの単一GPUファインチューニングにはQLoRAから始めましょう。VRAMに余裕があり、より速いステップやわずかに高い品質上限を求める場合は通常のLoRAに移行します。フルファインチューニングは本当に必要なケースのために取っておきます。大きな分布シフト、事前学習規模の変更、またはベンチマークの差が実在する推論が重要なタスクです。3つの入力を順番に基準にしてください。利用可能なVRAM、タスクの種類と品質要件、その後速度です。
以下は「これをする、あれはしない」形式のルーティングです。
1. まずVRAMを確認しましょう。 24GB以下のシングルカード構成なら(コンシューマー向けやプロシューマー向けGPUの大半がこれに該当します)、QLoRAが基本の選択肢になります。この3つの手法の中で、7Bモデルをその範囲に確実に収められるのはQLoRAだけだからです。シングルのコンシューマーカードでfull fine-tuningに手を出さないでください。上の表がすでに示しているように、7Bのジョブは収まらず、週末をかけてそれを苦労して学ぶことになります。
2. 次にタスクの種類と求める品質水準を確認しましょう。 タスクが指示追従、構造化出力、SQL、あるいは一般的なドメイン適応であれば、Anyscaleの検証結果はLoRAとQLoRAでほぼフルの品質が得られることを示しています。その場合はデフォルトのままで構いません。一方、タスクが推論を多く要するもの(多段階の数学、複雑な論理連鎖)で、品質面で妥協できないなら、full fine-tuningへの移行を検討する最初の本当の理由になります。ベンチマークで一貫した差が見られるのは、この種のタスクだけだからです。
3. 次に速度を比較検討します。 QLoRAはメモリ節約のためにステップごとの速度を多少犠牲にします。4bitのベースをその都度逆量子化する必要があるためです。通常のLoRAを動かせるVRAMがある場合(7Bモデルなら16〜24GB)、より速いステップが得られ、量子化によるノイズも避けられます。そのため、メモリが制約条件にならず、何度も試行を繰り返す場合はLoRAの方が良い選択になります。
では、どんな時に is full fine-tuningが正解になるのでしょうか。Axolotlのガイダンスは明快です。pre-trainingには必須であり、「十分なGPUメモリまたはマルチGPU構成があり、最大限のパフォーマンスが必要な場合」に選ぶべき手法だとしています。それ以外の条件下(そして実務でのfine-tuningの大多数、つまり既存モデルを特定の挙動やドメインに適応させるケース)では、パラメータ効率手法がハードウェアのごく一部で品質の大部分を実現してくれます。
Unslothはデフォルトの選択をはっきりと述べています。
"モデルの学習において最も手軽で効果的な方法の一つであるため、QLoRAから始めることをお勧めします。"
これがルールです。デフォルトはQLoRA、メモリに余裕があれば速度を求めてLoRAへ、タスクや規模がそれを必要とする場合に限りフルファインチューニングへ進みます。
このセクションの要点: QLoRAが基本の選択肢であり、LoRAは速度と余裕を得るためのアップグレードであり、フルファインチューニングは分布シフト、事前学習、推論ベンチマークのいずれかで正当化される例外です。
ファインチューニングの手法について、人々はどんな誤解をしているのか?
無駄になった週末の大半は、2つの誤解が原因だ。1つ目は、ファインチューニングをモデルに新しい事実を教える手段として扱うことだが、実際の主な効果は振る舞いを形作ることにある。2つ目は、つまみを回すだけで品質を買えると思い込むことだ。LoRA のランクを上げる、あるいは QLoRA の代わりに full fine-tuning を行えば自動的に良いモデルが手に入る、という思い込みだ。どちらも半分正しいからこそ、誤解を招く。
ファインチューニングはモデルに新しい事実を教えるのか?
この点については専門家の間でも本当に意見が分かれているため、どちらかの立場を選ぶよりも、その微妙な違いを正しく理解することが重要だ。複数の実践者向けガイドは「ファインチューニングは新しい事実を教える」を誤解の第一位として挙げている。その主張は、ファインチューニングはモデルの応答の仕方を形作ることには非常に優れているが、事前学習で一度も見たことのない特定の事実を確実に注入することには不向きだ、というものだ。Unsloth のドキュメントはこれに直接反論し、ファインチューニングが新しい知識を教えられないという主張を「誤りだ」とし、ファインチューニングを「新しいドメイン特有の情報を注入し学習する」手段だと説明している。
どちらも部分的には正しく、両者を調和させる解釈はこうだ。ファインチューニングは、ベースモデルに既に潜在している知識を強化し、振る舞いを形作ることについては信頼できるし、ドメイン特有のパターンをエンコードすることもできる。信頼できないのは、事前学習に一度も存在しなかった個別の事実を埋め込むことだ。目標が「この特定の文書を記憶する」ことに近づくほど、間違った道具を使っている可能性が高くなり、retrieval のほうが適しているかもしれない。つまり、この意見の相違を経ても実践的な指針は生き残る。振る舞いとスタイルについてはファインチューニングに頼り、事実注入の手段として使うことには懐疑的であるべきだ。
LoRA のランクを上げれば常に品質は向上するのか?
いいえ、そしてこれは最も回しすぎやすいつまみだ。直感的には、ランクが高いほどアダプターの容量が増えるので、多いほうが良いはずだと思える。 Databricks はこれを実証的にテストした そして、ランクを2倍にしても「出力品質に知覚可能な向上は見られないようだ」ということを発見した。彼らの実験で実際に効果があったのは、どの層を対象にするかだった(attention ブロックだけでなく、すべての線形層を適応させること)。ランクの数値を上げることではなかった。そこから引き出せる教訓はこうだ。ランクを膨らませる前に、対象モジュールとデータ品質にチューニングの労力を注ぐべきだ。
LoRAの品質はフルファインチューニングと常に同等ですか?
常にそうとは限らず、最近の研究論文が特定の失敗モードを specifies しています。"LoRA vs Full Fine-tuning: An Illusion of Equivalence"(Shuttleworthらによる)は、LoRAトレーニングが「侵入次元」(フルファインチューニングされたモデルには存在しない高順位の特異ベクトル)を生じさせる可能性があることを明らかにし、それを継続学習シナリオ、つまり同じモデルが繰り返しファインチューニングされる場合の忘却と結び付けています。これは全面的な反証ではなく、特定の留意点です。1つのタスクに対して1回だけファインチューニングを行うのであれば、品質同等性に関する広範な証拠は依然として成り立ちます。ファインチューニングを連鎖的に行い、ベースモデルの汎用的な能力の維持を重視する場合は、この失敗モードに注意が必要です。
よくある質問
LoRA、QLoRA、フルファインチューニングの違いは何ですか?
フルファインチューニングはモデル内のすべてのパラメータを更新します。LoRAはベースモデルを固定し、代わりに小さな低ランクアダプター行列(パラメータ全体の約0.1〜2%)を訓練します。QLoRAはLoRAと同じことを行い、さらに固定されたベースモデルを4-bit NF4精度に量子化するため、アダプターの訓練中にベースが占めるメモリがはるかに少なくなります。結果として明確なメモリの階層が生まれます。フルファインチューニングが最も重く、LoRAはより軽く、QLoRAが最も軽いのです。
7BモデルをファインチューニングするにはどれくらいのVRAMが必要ですか?
7Bモデルの場合、Axolotlのデータによればフルファインチューニングは約60〜80GB、LoRAは16〜24GB、QLoRAは10〜14GBを必要とします。3つの中でQLoRAだけが、多くの単一の12〜24GBコンシューマー向けまたはプロシューマー向けGPUに一般的に収まります。7Bモデルのフルファインチューニングにはデータセンター級のメモリまたは複数のGPUが必要です。
QLoRAの品質はLoRAやフルファインチューニングより劣りますか?
それはタスクによります。ほとんどの指示追従と構造化出力の作業では、QLoRAはフル・ファインチューニングの数パーセント以内に収まり、Axolotlは通常のLoRAと比較して「量子化ノイズによるわずかな劣化」しかないと説明しています。数学のような複雑な推論タスクでは差が広がり、2023年のAnyscaleによるLlama 2の研究ではフル・ファインチューニングが一貫した優位性を示しました。
フル・ファインチューニングは本当にいつ価値があるのか?
フルファインチューニングは、事前学習、大きな分布シフト、そしてベンチマークが実際の品質差を示す推論が重要なタスクにおいて、そのコストに見合う価値があります。また、十分なGPUメモリやマルチGPU構成があり、最大限の品質が必要な場合にも取るべき道です。一般的なケース(既存モデルを特定の挙動やドメインに適応させる場合)では、LoRAまたはQLoRAがハードウェアのごく一部で品質のほとんどを与えてくれます。
ファインチューニングはモデルに新しい事実を教えるのか?
部分的にはそうです。ファインチューニングは、ベースモデルに既に潜在している知識を強化し、振る舞いを形作る点では信頼できますが、事前学習に完全に存在しなかった個別の事実を埋め込む点では信頼できません。ここには専門家間の本当の意見の相違があります。Unslothのドキュメントはファインチューニングが新しい知識を教えられると主張していますが、他のガイドはこれを最大の誤解だと呼んでおり、調和的な見解は、行動とスタイルにはファインチューニングを使い、特定の事実を思い出すことが目的の場合はリトリーバルに頼るというものです。
これが導く結論
手法の選択は1つのデフォルトと2つの脱出口に帰着します。QLoRAから始め、メモリが制約でなく速いステップを求めるならLoRAに上がり、分布シフト、事前学習、または推論ベンチマークがそれを強制する場合にのみフルファインチューニングに上がります。
手法が決まったら、次の決定はそれが示唆するハードウェアです。あなたの手法選択は、単一のコンシューマー向けカードを探しているのか、データセンター向けメモリを探しているのかをちょうど教えてくれました。AIワークロード向けに特定のカードを比較したい場合は、 H100 対 RTX 4090 ベンチマーク その分野をカバーしています。選んだ手法に合わせたGPUのサイジングと、実際のトレーニングジョブを実行するためのステップバイステップガイドは、それぞれ別のガイドです。