
6,217 文字

これはコーディングチュートリアルで、任意のLLMをDeepseek R1スタイルの推論機能を持つモデルに変換する方法をお見せします。Deepseek R1で使用されたグループ相対方策最適化(GRPO)を使用します。これは私のオリジナルコードではなく、インターネットからコードを取得し、可能な限りクレジットを記載しています。100%うまく動作しない可能性があるので、これは実験的な試みとしてご理解ください。このビデオの最後では、私がどのように実施したか、そこから得た学びについてもお話しします。
最初に、コードの内容をお見せしたいと思います。コードを一つずつ見ていきましょう。これはqu5というGoogle Colabノートブックで、私はできる限りクレジットを記載した別バージョンを作成しました。ここを見ていただくと、オリジナルスクリプトの出処、その後に加わった別のColabの情報、そして最後に私たちが使用している特定のColabがどこから来たのかを記載しています。できる限り全てのクレジットを記載しましたので、全ての方々に感謝いたします。
出力に関して、どのように見えるかというと、このモデルのトレーニング前の出力はこのようになります。非常にシンプルな出力で、トレーニング部分があり、質問があってそれに対する回答があります。数学的なMLリーゾナーを作ろうとしているので、数学の問題を解くためのものです。トレーニング前のモデルではDeepseek R1のような動作はせず、質問に対して単純に回答を返すだけです。
しかし、トレーニング後は(私が連絡を取った人によると、無料のGoogle Colabではなくa100のような高性能マシンで2時間ほどかかったとのことです。私がお見せするコードは無料のColabで動作します)、モデルは内部推論を始めました。推論部分があり、その後に回答部分があります。全ての質問に対して推論部分があり、その後に回答部分が続きます。
これが元の作品です。今からお見せするのは、Google Colabの無料ノートブック(T4マシン)で実際に動作する若干修正されたバージョンです。このマシンでも動作しますが、同じものをトレーニングしようとすると時間がかかりすぎたので、後ほどトレーニングの詳細をお見せしますが、より大きなa100マシンに移行しました。
コードはかなりシンプルです。良いマシンをお持ちの場合は、VMを使用することを強くお勧めしますが、良いマシンをお持ちでない場合は、VMの部分はスキップできます。ここで重要なのは、Hugging Faceのtrlからグループ相対方策最適化(GRPO)の設定を使用することです。これは、Deepseek R1のトレーニングで使用された強化学習アルゴリズムの一部として使用された方策を可能な限り再現しようとしています。
システムプロンプトがあり、まずデータ、トレーニングデータセットを準備する必要があります。一つの大規模言語モデルを使用します。簡単に説明すると、私たちは一つのLLMを使用します。この場合、私はsmall LLMと呼ばれるモデルを使用しました。正しければ135MBのものを使用しました。大規模言語モデルを用意した後、データセットが必要になります。この場合、GSM 8Kという数学のデータセットを使用しますが、GSM 8Kを推論データセットになるように変換します。
監督付きファインチューニングなどは行わず、GRPOを使用しますが、GSM 8Kから異なる形式のデータセットを使用します。これが基本的に私たちが行おうとしていることです。コードを見ていくと、まずシステムプロンプトが必要です。システムプロンプトは基本的にこのようになっています:以下の形式で応答してください。reasoningタグの開始と終了、省略記号、answerタグの開始と終了です。
これがシステムプロンプトで、XMLクート形式です。reasoningタグの開始と終了があり、その中に推論が入り、そしてanswerタグの中に回答が入ります。これが基本的な基礎で、どのようなデータセットを選んでもこの形式で進めることができます。
次の部分は、既存のデータセットを取得し、この特定のトレーニングプロセスで理解できるように再フォーマットする方法です。会話形式に合わせようとしています。ヘルパー関数またはユーティリティ関数と呼ばれるものがあり、これを呼び出すことができます。データセットを読み込む場所で、GSM 8Kからデータセットを読み込み、システムプロンプトとデータセットの一部である質問を使用します。
GSM 8Kを見たことがない方のために簡単に説明すると、GSM 8Kは非常に人気のある数学のデータセットです。数学の質問と回答があり、説明はなく、単純に質問と回答だけです。しかし、私たちは望む形式に変換しようとしています。質問はここに、回答はここに入ります。
これを行った後、強化学習アルゴリズムにとって最も重要な部分の一つに進みます。強化学習アルゴリズムは基本的に、モデルが報酬を最大化するようにトレーニングプロセスを調整しようとします。この場合、5つ…いや、実際には6つの報酬関数を定義します。
簡単な言葉で説明すると、報酬関数の中で最も重要なのは、正確性報酬関数と呼ばれるものです。与えられた質問に対して正しい答えを求めます。これは基本的に、モデルが生成したものと正しい答えを比較し、答えが正しければ2を、正しくなければ0を与えます。これが最も重要な報酬関数です。
その他にも、トレーニングプロセスを導くための報酬関数があります。一つは数字報酬関数と呼ばれ、抽出された応答に数字が含まれているかどうかをチェックします。これは、モデルが出力を生成したときに数字が含まれているかどうかを確認するためです。
次に厳密なフォーマット報酬関数があり、その後にソフトフォーマット報酬関数があります。これは応答に省略記号が含まれているかどうか、XMLフォーマットが存在するかどうかを緩やかにチェックします。count XMLは基本的にXMLタグが存在するかどうかを理解しようとし、XML count報酬関数は各応答のXMLをカウントしようとします。
これらは異なる種類の報酬関数で、どのようなことを行っているかを理解するためにコードを見ることができます。例えば、count XMLを見ると、このタグを探し、このタグを探しています。これが存在する場合はスコアを与え、存在しない場合は単にそのままにします。
これらが報酬関数です。報酬関数は非常に重要な役割を果たします。これを数学的推論モデルではなく、別のものに変更する場合は、それに応じて報酬関数を設計する必要があります。しかし、この報酬関数は始めるのに十分だと思います。
これらの報酬関数を持った後、次に行うことは、使用したいモデルを定義し、モデルの保存場所といくつかのトレーニングパラメータを定義することです。私はHugging Faceのsmall LM 135百万パラメータモデルを使用しました。先ほどお見せした元の作者はqu5十億パラメータモデルを使用しました。
使用する基本モデルの品質も非常に重要な役割を果たします。私のベースモデルは非常に小さな135億パラメータモデルだったため、おそらく良い収束が得られなかった(つまり、適切に生成されなかった)かもしれません。そして、トレーニングプロセスを加速しようとしていました。これを過去3〜4時間行っていましたが、もし長い時間があり、より長いコンピュート時間がある場合は、Quin 2 2.5十億パラメータモデルのようなモデルを試すべきだと思います。
この特定の作者の場合、明らかに推論モデルに変換されました。これが、私の試みが失敗したにもかかわらず、このビデオを作ることにした正直な理由です。しかし、うまくいった試みについて別のビデオを作ることを希望しています。
モデルを定義します。モデルリンクはHugging Faceから来ています。任意のモデルを選ぶことができます。例えば、quen 2.5のように、ビジュアル言語モデルではなくテキスト生成モデルの一つを選び、この特定の場所でモデル名、組織名、モデル名を定義する必要があります。
次は非常にシンプルで、最終的なモデルファイルを保存したい出力ディレクトリと、実行名を定義するだけです。これを複数回行う場合は、バージョン管理ができるような実行番号やその名前が必要です。例えば、この場合は単純に実行番号です。
これはWeights & Biases(モデルモニターツール)で使用できます。そうすれば、自分が行った異なる実行を理解することができます。これらのすべてを見ることができます。理想的には異なる名前を付けるべきですが、私はここで同じ名前を使用しました。それが実行名です。
そして最も重要なのは、トレーニング引数です。これは基本的に、どのようなトレーニングを行いたいかを定義する方法を示します。Google Colabに適合させた人が行った変更の一つは、多くのことを管理するオプティマイザーを導入したことです。
学習率は、メモリ不足エラーにどの程度遭遇するかに基づいて調整したいものです。これらは標準的な数値なので、そのままにしておくことができます。もう一つ重要なのは、Google Colabはbfloat16をサポートしていないため、fp16を使用していますが、bfloat16をサポートするGPUを使用している場合は、これをbf16に変更することをお勧めします。
ここでも同様で、bf16に変更できます。そして、速度やメモリ不足エラーに関して変更すべき非常に重要な部分があります。GPUメモリが一杯になることを意味するCUDAメモリ不足エラーに遭遇する可能性がありますが、これがその部分です。
現在、デバイスごとのトレーニングバッチサイズは1で、勾配累積ステップは2となっています。これはおそらく最小限の設定で、これは1.5時間から2時間のトレーニング時間がかかることを意味します。バッチサイズを2のべき乗で増やすことができます。1、2、4、8、16、32、64などです。
私の実験では、80GBのVRAMマシンでも32以上には行けませんでした。バッチサイズの最大値は32でした。また、バッチサイズが大きすぎたため、学習率をあまり調整しなかったことで、モデルが収束しなかった可能性もあると少し疑問に思っていました。そのため、数回の試行の後で調整することを強くお勧めします。
その後は全て簡単です。生成数は基本的に報酬関数のためのもので、どれだけの生成を行いたいかを指定します。収束が起こっていない(つまり、モデルが良い性能を示していない)と思われる場合は、生成数を増やすことをお勧めします。時間がかかりすぎる場合は、生成数を減らして進めることをお勧めします。
残りはそのままにしておくことができます。Google Colabではうまく動作せず、より多くのメモリが必要なため、use VMをfalseに設定しました。最後に、メインのColabノートブックはreport to doneとなっていますが、理想的にはWeights & Biasesに送信したい場合(そのためには別のWeights & Biasesアカウントを作成する必要があります)、weights and biases wandbを有効にし、そこからトークンをコピーしてここに貼り付ける必要があります。これはかなり簡単なプロセスです。
その後、モデルを読み込み、GPUにモデルを移動します。ここでもbfloat16を使用している場合は、bfloat16を使用していることを確認してください。つまり、すべての場所で同じデータ型を使用してください。その後、トークナイザーなどを読み込みます。
この時点でGPOトレーナーを開始し、GPOトレーナー内にはモデル、トークナイザー、そして報酬関数があります。この報酬関数の中で、不要な報酬関数を削除したり、新しい報酬関数を追加したりすることができます。これらすべてを用意したら、トレーナーを開始します。
すると、これが何度も繰り返し表示されます。GSM 8Kから質問を取得し、応答を抽出し、これらが抽出された応答で、そしてモデルをトレーニングします。これが延々と続きます。例えば、この場合、作者が完全に終了すると、トレーニング損失が変動しているのが見え、最終的には質問を取得し、応答を返し、推論を行い、すべてをうまくこなして、最後に答えを返すようになります。
私の実験に関して、a100(高価なマシン)で実行しました。1時間あたり4〜5ドル、あるいはr podで3ドルほど使用しました。1時間実行しました。ある時点で、トレーニングXML報酬カウントが0以上に上がっているのが非常に短時間見えました。また、他の重要な指標であるトレーニング報酬も、ある時点で上昇しました。
トレーニング損失は下がり始め、下がるはずです。KLダイバージェンスは、トレーニング分布とモデル探索分布(新しい方策分布)がどれだけ異なるかを示します。これはあまり離れすぎてはいけませんが、異なっているという事実は、コードが実際に機能していることを意味します。
全体として、私の場合、モデルは推論能力を示すことはありませんでしたが、先ほど述べたように、多くの奇妙なこと、愚かな仕業が原因かもしれません。一つは、バッチサイズが大きすぎたこと、学習率を最適化しなかったこと、可能な限り早くフィットさせようとしたこと、異なるデータ型を試していたことです。
また、主要な問題として、選択した大規模言語モデルが135億(ミリオン)パラメータモデルで、大きなモデルではなかったことが挙げられます。小さなモデルでどの程度うまく機能するかを確認したかったのですが、引き続き実験を続けます。
このGoogle Colabノートブック、Weights & Biasesダッシュボード、そして元のノートブックをYouTubeの説明欄に共有します。全体として、これは魅力的な技術だと思います。ファインチューニングのファンで、誰もが話題にしているモデルのトレーニングや、任意のLLMをDeepseek R1スタイルの推論LLMに変換することに興味がある方は、5〜10ドルほど使って、どのような結果が得られるか試してみることをお勧めします。
これは本番環境向けのソリューションではなく、単にファインチューニングされたモデルが欲しい人向けのものでもありません。これは非常にハッカー的なアプローチで、純粋な実験です。私が実験したことを共有しているだけなので、自己責任で試してみてください。
これが皆さんのお役に立てば幸いです。今は午前3時ですが、多くの時間を費やした後でもまだ魅了されています。このビデオの直後にベッドに入るかもしれませんが、このような革新やGRPOについてどう感じるか教えてください。また別のビデオでお会いしましょう。ハッピープロンプティング!


コメント