このテクニック一つでDeepSeek R1のようなLLMに変身💥 無料で自分だけのDeepLlamaを訓練しよう💥

この記事は約15分で読めます。

8,352 文字

This ONE TRICK Turns your LLM like DeepSeek R1💥 Train your own DeepLlama for Free! 💥
Reasoning in Unsloth! DeepSeek’s R1 research revealed an “aha moment” where R1-Zero autonomously learned to allocate mor...

Googleコラボのノートブックで1〜2時間待てるなら、あるいは3〜5ドル程度を投資できるなら15〜20分で、あなただけの推論モデルを無料で訓練することができます。既存のモデル、今回の場合は30億パラメータのモデルを使って、DeepSeek R1スタイルの推論モデルに訓練する方法をご紹介します。このモデルは質問に対して、考察し、熟考し、最終的に答えを返すという推論タグを理解します。
これは多くの研究者のおかげで可能になり、最終的にunslothがメモリ効率の良いチュートリアルとしてまとめ上げました。このチュートリアルに従って進めていきましょう。YouTubeの説明欄からすぐにアクセスできるGoogleコラボのノートブックを共有します。変更を加える必要はありませんが、カスタマイズしたい場合にどのような変更ができるか、また私がこの作業中に遭遇した失敗についても説明します。私はこれに多くの時間とGPUクレジットを費やしたので、このチュートリアルには多くの情報とニュアンスが含まれています。
まず、これがGoogleコラボのノートブックです。このノートブックはT4マシンで動作しますが、Google Colab Proをお持ちの場合は、より上位のティアを使用できます。最初に必要なのは、unslothとVMをインストールすることです。お使いのコンピュータに基づいて実行するために必要な他のものもすべてインストールされます。
diffusersは4090や他のローカルマシン、例えばModel LabsやRpodで実行する場合にインストールが必要です。しかし、Googleコラボで実行する場合はdiffusersをインストールする必要はありません。TRLは主にGRPOアルゴリズム(Group Relative Policy Optimization)のためのもので、これは今回Quinモデルの訓練に使用する強化学習アルゴリズムです。
unslothモデル用のパッチも必要で、unslothからモデルをロードするためのfast_language_modelとpack_fast_rlをインポートし、GRPOアルゴリズムにパッチを当てます。次のステップでは、Quin 2.53Bパラメータモデルをロードします。今回はinstモデルをロードしますが、baseモデルでも同じように試してみることを強くお勧めします。異なる実験を行って、baseモデルに対してどのような改善が得られるかを確認できます。
現在Googleコラボ上で実行しているため、デフォルトのモデルとして30億パラメータモデルを使用していることに注意してください。より長時間の計算や大きな計算リソースがある場合は、80億パラメータモデルや70億パラメータモデルを使用する方が良いでしょう。Llama 70億パラメータモデルを使用することもできます。
より良い結果を得るには、より大きなモデルを使用し、より多くのパラメータを訓練することです。これは二つの方法で改善できますが、より多くの計算リソースが必要になります。一つはシーケンス長を増やすことです。最大シーケンス長を増やすと推論の痕跡が長くなり、より良くなることがわかっています。より長い推論とより良い推論を望む場合は、最大シーケンス長を1024かそれ以上に設定できます。
しかし、多くの計算リソースがなく、長時間待ちたくない場合は、512や256から始めて様子を見ることをお勧めします。同じことがLORAのランクにも当てはまります。大きくすれば良いですが、処理は遅くなります。これはトレードオフの関係です。2の倍数で変更する必要があり、この場合は64を選択しています。
私はH100でこのノートブックを実行し、約20分かかりました。H100は1時間あたり約3ドル、ストレージを含めても3.5ドルほどです。つまり、これは2ドル未満の作業で、LORAも保存できるので、毎回Googleコラボのノートブックで使用することができます。
この時点で、すべてをインポートし、準備が整いました。モデルをロードしていきます。重要なポイントの一つは、高速推論のためのVMを有効にすることです。使用しているマシンがVMをサポートしている場合は有効にします。VMをサポートしていない場合はfalseに設定します。LLMをpickleすべきではないなどのバグに遭遇する可能性がありますが、これらのエラーは主にVMに起因します。
遭遇するエラーの種類に応じて、VMを無効にするか有効にするかを決めます。VMがない場合はfalseにし、VMがある場合はそのまま実行して様子を見てください。二つ目は、量子化モデルをロードしようとしていることです。これはQLORA微調整のような概念です。モデルを量子化モデルとしてロードするには、load_in_4bitをtrueに設定する必要があります。これをfalseにすると、モデルは4ビットではなく16ビットでロードされます。
最後に、CUDAのメモリ不足に遭遇したり、LLMエンジンをpickleすべきでないなどのエラーが発生した場合は、この数値を減らすことを強くお勧めします。この数値が大きいほど、より多くのGPU計算リソースが必要になり、CUDAメモリ不足に遭遇する可能性が高くなります。CUDAメモリ不足に遭遇した場合はこの数値を減らし、メモリ不足に遭遇しない場合は増やすことができます。
Googleコラボに関する注意点として、初回実行時にはすべてのパッケージをインストールする必要がありますが、その後の再実行時にCUDAメモリ不足に遭遇した場合は、ランタイムを再起動するだけでセッションがクリアされ、異なるパラメータで最初から実行できます。これにより、どのようなパラメータセットが適切かを理解するのに役立ちます。
これで基本的にベースモデルをロードしました。この場合、Quin 2.53Bパラメータのinstrモデルを使用していますが、数学モデルではなく一般モデルです。異なるモデルを選択して同じ作業を行うこともできます。注意が必要なのは、そのモデルに合致するターゲットモジュールを確認することです。LORAのターゲットモジュールは、インターネットで簡単に見つけることができます。
特定のモデルやLocal-Llamaを検索すると、この場合はすべてのターゲットモジュールを使用して最大の効果を得ようとしていることがわかります。エラーが発生した場合は、いくつかのLORAターゲットモジュールを減らして、LORAを訓練し、より少ない微調整とトレーニングでも推論が実際に機能するかどうかを確認できます。
これがモデル1の基本的な部分です。これらすべての準備が整ったら、4ビット量子化でロードされたQuin 2.53Bのinstructモデルが利用可能になります。LORAトレーニングの方法を定義し、LORAトレーニングのためのすべてのターゲットモジュールが設定されました。
次は非常に重要なデータ準備に入ります。これを最初にまとめたのはWill CCBです(フルネームは不確かです)。Hugging Faceのデータセットからデータセットをロードできます。この場合、OpenAIのオープンソースGSM 8Kデータセットを使用しています。これはモデルの数学的推論を改善できるデータセットですが、私も現在、命令微調整のような他の微調整プロセスにこのコードを適用できないか検討しています。
現時点では、数学関連のデータに対して優れた効果を発揮します。システムプロンプトが必要で、これは全体のテンプレートがどのように見えるべきかを示します。推論とその後に答えがあり、XML形式で記述されています。完璧な推論のためには、推論の開始タグと終了タグ、そして答えの開始タグと終了タグが必要です。推論の開始タグと終了タグの間で、熟考やその他のプロセスが行われます。
ヘルパー関数があり、これによってGSM 8Kを読み込み、最終的に微調整に使用できる会話テンプレート形式でデータセットを作成します。通常の微調整には特定の形式が必要で、私たちはGSM 8Kデータを取り、このような形式に変換して理解できるようにしています。
強化学習アルゴリズムで最も重要な部分の一つは、報酬関数の適切な設定です。ここには6つの報酬関数があります。正確性報酬関数、int報酬関数、厳密な形式報酬関数、柔軟な形式報酬関数、XMLタグのカウント、XMLカウント報酬関数です。私のトレーニングプロセスでは6つすべての報酬関数を使用しましたが、2つから始めて様子を見ることをお勧めします。
私の場合、これを2回行いました。500ステップのうち、250ステップを1回、もう250ステップを1回行いました。メトリクスがどのように変化したかを確認できます。XMLカウント報酬関数が変化し、正確性報酬関数は特に注目すべき点です。これがスパイクを示し、他のメトリクスがまったく変化しない場合、おそらくモデルは形式を学習しようとしていますが、必ずしも推論や推論の一般化を学習していません。
例えば、以前に50億パラメータの小さなモデルで試した際、トレーニング中に正確性報酬関数の値は上昇しましたが、トレーニング後にLORAを使用してモデルに推論させた際、まったく推論が行われませんでした。そのため、30億パラメータモデルを選択することになりました。報酬関数モデルを見ることは非常に重要なメトリクスです。
また、何かが機能していることを確認するために、KLダイバージェンスにも注目できます。これは、分布が以前のモデル分布からどれだけ異なっているかを示します。差が大きすぎるのは良くありませんが、強化学習が何かを行っていることを示しています。これらは注目すべき点ですが、2つの報酬関数、例えば正確性と形式で試してみることをお勧めします。
これらの報酬関数はすべて、正しい行動に対してモデルにインセンティブを与え、間違いに対してペナルティを与えるように設計されています。この場合、多くのペナルティは課していませんが、間違いに対してはペナルティを与えます。正しいXML推論タグがある場合、この特定の報酬関数がスコアを獲得し、答え自体が正しい場合(形式だけでなく答え自体が正しい場合)、正確性報酬関数がスコアを獲得します。
DeepSeekが望んでいたように、精度と形式のバランスを取ることができます。これらがすべて完了したら、これらを書く必要はありません。異なる問題や異なるデータセットに対してこれを行う場合に理解できるように説明しています。実際、ここでヘルパー関数を見ると、Hugging Faceのデータセットからデータセットをロードしていることがわかります。
最も簡単な実験の一つは、GSM 8Kの代わりにUltraChatやUltraFeedbackなどの異なるデータセットを試してみることです。これが完了したら、トレーニングパラメータを定義する部分に移ります。これは通常の微調整と非常に似ています。VMを使用する場合はここで有効にし、VMを使用しない場合はfalseにします。
これらのステップは直接進めることができます。BFloat16がサポートされている場合はBFloat16を使用できますが、ColabはBFloat16をサポートしていないと思われるので、自動的にFP16にデフォルトされます。BFloat16は計算サイズに若干の利点があります。
メモリ不足エラーが発生した場合に調整できる非常に重要なメトリクスは、トレーニングに使用するバッチサイズです。重要なのは、このバッチサイズとこの数値の積が4の倍数である必要があることです。バッチサイズは4、2、1、2、4、8、16、32、64などにできます。
8GB VRAMと80GB VRAM H100で試しましたが、80GBでも32で実行できず、8や16でも実行できませんでした。8で実行できるはずでしたが、何が起きているのかわかりませんでした。トレーニングバッチサイズを調整すると、トレーニングプロセスをより速く行うことができます。より大きなマシンを使用する場合は、同じサイズを使用せず、より大きなサイズを使用してください。
Googleコラボでエラーが発生した場合は、すぐに1に設定して同じ処理を実行します。次に世代数ですが、これもメモリ消費量を増加させます。メモリ不足が発生した場合は、この数値を減らすことができます。残りの設定はそのままで構いませんが、長いコンテキストモデルを使用する場合は、異なる設定を試すことができます。
重要なポイントとして、完全なトレーニングを行いたい場合はトレーニングエポック数を1に設定しますが、部分的なトレーニングを行いたい場合はエポック数を指定する必要はありません。ここでは、30億パラメータモデルまたはやや大きなモデルを250ステップでトレーニングしますが、100〜150ステップの場合、トレーニングプロセスはかなり不安定で、スパイクが見られないかもしれません。
例えば、私の場合、50億パラメータモデルをトレーニングした際、100ステップまでほとんど変化が見られませんでした。すべてが100ステップ以降に始まり、同様にここでもカウントの増加は150ステップ以降でスパイク状になっています。250ステップをお勧めしますが、80億パラメータモデルのような大きなモデルの場合は150ステップでの実験も躊躇しないでしょう。
保存したいステップ数を設定し、同じ最大勾配ノルムを使用します。Weights and Biasesを使用したい場合は使用できます。私はモデルのモニタリングとレポートにWeights and Biasesを使用しましたが、そうでない場合はnoneと設定できます。Weights and Biasesを使用する場合は、事前にpip installする必要がありますが、このノートブックには含まれていないと思います。そうでない場合はnoneで進めてください。
unslothには利用可能な報酬関数が用意されているので、それを確認できます。実行名を設定することもできます。実行名は、Weights and Biasesを使用している場合に実行を識別するのに役立ちます。私は眠かったので、なぜかQuin Babyと名付けました。
unslothを使用している場合、トレーニング損失、報酬(理想的には上昇するはず)、KLダイバージェンスの変化、完了長の変動が確認できます。すべてが完了したら、トレーニング引数が固定され、GRPOトレーナーを設定します。ここで、微調整するモデル、トークナイザーとして使用するモデル、特定の方向にモデルを導くために使用する報酬関数、上で定義したトレーニング引数、上で作成したトレーニングデータセットを指定します。
unslothは非常に高速です。これを行う最も簡単な方法の一つがunslothです。3-4日前に同じことを試みましたが、多くの苦労がありました。unslothは非常に簡単にしてくれました。ご覧のように、トレーニングプロセスが開始され、私の場合は250ステップを実行し、H100で21分43秒かかりました。このマシンは1時間あたり約3ドルです。
報酬が上昇し始め、ある時点で安定し、250ステップ後には、すべての質問に対して推論タグが出現するようになります。質問があり、推論タグがあり、推論の終了タグがあり、答えのタグがあり、答えの終了タグがあります。モデルが改善しようとしているのが分かります。
しかし、このサイズのモデルでも、厳密な形式は全く発生しませんでした。DeepSeekで話題になった「アハ体験」は、この特定の報酬関数では全く起こりませんでした。最初の実行で全てが正しく動作するわけではないので、多くの試行錯誤が必要です。そのため、Googleコラボノートブックから始めて、より大きな計算マシンに移行することをお勧めします。
すべてが完了したら、250ステップでチェックポイントを保存します。ここでは、同じモデル(4ビット量子化されたQuin 2.53Bパラメータモデル)に質問を投げかけ、モデルがどのように応答するかを確認しました。この場合、「イチゴには何時間あるのか」という質問をしただけですが、これは訓練前のモデルがどの程度良いかを理解するためのランダムな質問です。
次に、訓練したLORAを保存します。私たちが行ったのは、量子化されたLORAで、LORAアダプターを別々に保存します。これはローカルコンピュータにダウンロードして保存できます。2つのファイルがダウンロードされ、保存できます。それらのファイルをお見せできます。adapter_modelとadapter_configという2つのファイルがあります。
これらは、モデルを訓練した後にダウンロードできる2つのファイルです。save_loraを実行すると、コンピュータにgrpo_save_loraというフォルダが作成され、これらの2つのファイルが保存されます。このファイルは、この場合のQuinモデルのようなモデルと常に使用でき、ローカルコンピュータで適用して実行したり、Googleコラボで実行したりできます。
素晴らしいパフォーマンスが得られなくても、LORAを常に保存することをお勧めします。そうしないと、同じトレーニングプロセスを何度も繰り返す必要があります。そのLORAを適用すると、同様の設定で「10kgの飛行機と5kgのトラベルバッグ2つではどちらが大きいですか」という質問をしたとき、推論タグが登場し始めます。
DeepSeek R1のような670億パラメータの専門家混合モデルと30億パラメータモデルを比較するのは馬鹿げていますが(将来的にはそうなるかもしれませんが、今日ではありません)、推論の側面が現れてきているのが分かります。開始タグがあり、終了タグがありますが、答えの終了タグはまだありませんが、その方向に進んでいます。
「10kgの飛行機と5kgのトラベルバッグ2つの重さを比較する必要があります。飛行機の重さは10kg、5kgのトラベルバッグ2つの合計重量は次のように計算されます:5 + 5 = 10。飛行機と2つのトラベルバッグの重さは同じ10kgです」という推論が終わり、答えとして「飛行機と2つのトラベルバッグは同じ10kgの重さで、重量の面ではどちらも大きくありません」と返答しました。
これはトリックですが、正しい答えを出しました。注目すべきは、これはQuinの数学モデルでもプログラミングモデルでもなく、通常のQuinモデルで、数学データセットで訓練したところ、うまく機能しているということです。これがDeepSeekで議論されていた「アハ体験」の一つです。
これは、独自の推論モデルを訓練する最も簡単な方法の一つです。MistralやQuin、Llama、54(1400万パラメータモデル)など、どのLLMでも選択できます。この時点で、モデルを保存できます。Hugging Faceトークンを取得する必要があり、取得後はHugging Faceにモデルを保存することもできます。
GGUFやllama.cppに変換して保存することもでき、oLlamaやLM Studio、Janなどの一部として使用できます。全体として、これは週末に2-3時間を費やすのに最適な楽しいプロジェクトです。グラフが上下するのを見るのは楽しいですが、それを見る必要はなく、実行して映画やドラマを見ることもできます。
毎日新しい研究が出てきて、プロンプトだけで推論のような応答を引き出す別の方法を見つけた人もいます。私もそれを調べていますが、現時点で無料のリソースを使用して独自の推論モデルを訓練したい場合、これは最も簡単で安価な方法の一つです。3ドルを投資できれば、この全体を20分で完了でき、モデルを楽しんでパフォーマンスを確認できます。
これが役立てば幸いです。Googleコラボノートブックとunslothのブログ投稿、興味のある方のためにWeights and Biasesへのリンクを共有しています。それでは、また別の動画でお会いしましょう。ハッピープロンプティング!

コメント

タイトルとURLをコピーしました