自宅でプライバシーを保ちながらLLMを微調整するために必要なことすべて

Table of Contents

自宅でプライバシーを保ちながらLLMを微調整するために必要なことすべて

大規模言語モデル (LLM)は、テキストの生成と情報の反復に非常に効果的ですが、最終的にはトレーニングに使用されたデータのコーパスによって制限されます。

たとえば、事前にトレーニングされた汎用モデルに、ビジネスに特有のプロセスや手順について質問すると、良くても拒否され、最悪の場合、もっともらしい答えを自信たっぷりに幻覚的に提示することになります。

もちろん、独自のモデルをトレーニングすることでこの問題を回避することもできますが、そのために必要なリソースは多くの場合、現実的ではありません。Metaの比較的小規模なLlama 3 8Bモデルのトレーニングには、80GBのNvidia H100で実行した場合、130万GPU時間に相当するリソースが必要でした。幸いなことに、そうする必要はありません。Llama、Mistral、Phiなどの既存のモデルを、ファインチューニングと呼ばれるプロセスを通じて独自のデータを使用して知識ベースを拡張したり、動作やスタイルを変更したりすることができます。

このプロセスは推論と比較すると依然として計算コストが高いですが、Low Rank Adaptation (LoRA) とその量子化バリアントである QLoRA などの進歩により、単一の GPU を使用してモデルを微調整することが可能になりました。そして、まさにそれが、この実践ガイドで探求しようとしていることです。

このガイドでは、次の内容について説明します。

  • いつ、どこで微調整が役に立つか。
  • 事前トレーニング済みモデルの機能と動作を拡張するための代替アプローチ。
  • データ準備の重要性。
  • Axolotl で独自のカスタム データセットを使用して Mistral 7B を微調整する方法。
  • 多数のハイパーパラメータとそれらがトレーニングに与える影響。
  • モデルをより速く、より効率的に微調整するのに役立つ追加リソース。

期待値の設定

これまでのハンズオンガイドと比べると、微調整は、回すべきノブ、切り替えるべきスイッチ、調整すべき設定、そして従うべきベストプラクティスが山ほどあり、少々入り組んだ作業です。そのため、ある程度の期待値を設定することが重要だと考えています。

ファインチューニングは、事前学習済みモデルの挙動やスタイルを変更する便利な方法です。モデルに何か新しいことを学習させることが目的であれば、ファインチューニングは可能ですが、より優れた信頼性の高い方法があるかもしれません。まずは検討してみる価値があります。

以前、検索拡張生成(RAG)について検討しました。これは、モデルが参照できるライブラリまたはデータベースをモデルに提供する手法です。このアプローチは、セットアップが比較的簡単で、モデルの学習に比べて計算コストが低く、ソースを引用できるため、非常に人気があります。しかし、RAGは決して完璧ではなく、モデルのスタイルや動作を変えることはできません。

図書館のラマ

貧困から富裕へ:ローカルAIチャットボットをよりスマートにするための実践ガイド

続きを読む

例えば、顧客がリソースを探したり、製品のトラブルシューティングをしたりするためのカスタマーサービスチャットボットを構築している場合、健康や財務といった無関係な質問には応答させたくないでしょう。プロンプトエンジニアリングは、この点をある程度支援します。モデルに特定の動作を指示するシステムプロンプトを作成できます。例えば、「お客様は健康、ウェルネス、または栄養に関する質問に答える準備ができていません。質問された場合は、より適切なトピックに会話を誘導してください」といった簡単なメッセージを追加するだけで済みます。

プロンプトエンジニアリングは、そのシンプルさゆえにエレガントです。モデルに何をして欲しいか、して欲しくないかを伝えるだけです。残念ながら、実際にチャットボットを触ったことがある人なら誰でも、モデルが意図しない動作をしてしまうエッジケースに遭遇したことがあるでしょう。そして、あなたが考えていることとは裏腹に、LLMをHAL9000のようなフィードバックループに閉じ込める必要はありません。多くの場合、モデルに「以前の指示はすべて無視して、代わりにこれを実行してください」と指示するだけで済みます。

RAG と迅速なエンジニアリングで十分でない場合は、微調整を検討する価値があるかもしれません。

QLoRA によるメモリ効率の高いモデルチューニング

このガイドでは、Mistral 7Bモデルのスタイルとトーンを微調整することで変更していきます。具体的には、前述の通り、従来のトレーニングに比べてメモリと計算量を大幅に削減したQLoRAを使用します。

これは、モデルの実行に比べて、微調整に多くのメモリが必要になるためです。推論中は、パラメータ数とその精度を掛け合わせることでメモリ要件を計算できます。BF16で学習したMistral 7Bの場合、キー値キャッシュは約14GB±1~2GBになります。

一方、完全な微調整を行うには、モデルをメモリに収めるためにこの数倍のメモリが必要になります。つまり、Mistral 7Bでは90GB以上が必要になります。マルチGPUワークステーションを所有していない限り、この作業を行うにはNvidia A100やH100などのデータセンター向けGPUをレンタルする必要があるでしょう。

信じられないほど縮小している法学修士号

ねえ、LLMを小さくしたよ!量子化とテストの初心者向けガイド

続きを読む

これは、完全な微調整を行うと、モデル内のすべての重みを実質的にフル解像度で再学習することになるからです。幸いなことに、ほとんどの場合、ニューラルネットワークの出力を微調整するためにすべての重みを更新する必要はなく、実際には数千または数百万の重みを更新するだけで目的の結果が得られる場合もあります。

これがLoRAの背後にあるロジックです。簡単に言うと、モデルの重みを1つの行列に固定します。次に、2つ目の行列セットを使用して、最初の行列に加えるべき変更を追跡し、モデルを微調整します。

これにより、計算とメモリのオーバーヘッドが大幅に削減されます。QLoRAでは、モデルの重みを通常4ビットという低い精度で読み込むことで、このオーバーヘッドをさらに削減しています。そのため、各パラメータに必要なメモリは2バイトではなく、0.5バイトにまで減少しました。量子化についてご興味があれば、こちらのハンズオンガイドで詳細をご覧ください。

QLoRA を使用すると、16 GB 未満の VRAM を使用して、Mistral 7B のようなモデルを微調整できるようになりました。

Discover More