🦙チュートリアル:Llama-3 をファインチューニングして Ollama で使う方法
Ollama 上でローカルに動作する(ChatGPT のような)カスタマイズされた個人アシスタントを作成するための初心者向けガイド
このチュートリアルの終わりまでに、あなたはカスタムチャットボットを作成します、 Llama-3 をファインチューニングして を Unsloth 無料で実行できます。ローカルでは Ollama あなたのPC上で、または無料のGPUインスタンスで Google Colabを通じて実行できます。以下のように対話的にチャットボットと対話できます:

Unsloth はファインチューニングを大幅に簡単にし、ファインチューニング済みモデルを自動的にエクスポートすることができます Ollama 統合された自動 モデルファイル 作成機能!助けが必要な場合は、私たちのDiscordサーバーに参加できます: https://discord.com/invite/unsloth
コードをコピーまたは保存したい場合は、すべて以下で利用できます: Ollama Colab ノートブック。そこで直接使用するか、ローカル環境向けに適応できます: https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb
1. Unslothとは?
Unsloth は Llama-3、Mistral、Phi-3、Gemma のようなLLMのファインチューニングを2倍高速化し、メモリ使用量を70%削減し、精度の低下なしで行います!このチュートリアルでは無料GPUが提供されるGoogle Colabを使用します。無料ノートブックには以下からアクセスできます:
Ollama Llama-3 Alpaca (このチュートブックで使用するノートブック)
Googleアカウントへのログインも必要です!

2. Ollamaとは?
Ollama はあなた自身のコンピュータで言語モデルを簡単かつ迅速に動かすことを可能にします!バックグラウンドでLlama-3のような言語モデルを実行できるプログラムを静かに起動します。突然モデルに質問したくなったら、Ollamaにリクエストを送信すれば、すぐに結果を返してくれます!私たちは推論エンジンとしてOllamaを使用します!

3. Unsloth のインストール

Colabノートブックを使ったことがない場合、ノートブック自体の簡単な説明:
各「セル」の再生ボタン。 これをクリックしてそのセルのコードを実行します。いかなるセルもスキップせず、すべてのセルを時系列順に実行する必要があります。エラーが出た場合は、実行していなかったセルを再実行してください。再生ボタンをクリックしたくない場合は CTRL + ENTER を押すこともできます。
上部ツールバーの Runtime ボタン。 このボタンを使って「すべて実行」を選ぶと、ノートブック全体を一度に実行できます。これによりカスタマイズ手順はスキップされますが、最初の試行には良い場合があります。
Connect / Reconnect T4 ボタン。 ここをクリックすると、より高度なシステム統計を表示できます。
最初のインストール用セルは以下のようになっています:角かっこ [ ] 内の再生ボタンをクリックするのを忘れないでください。オープンソースのGithubパッケージを取得し、いくつかの他のパッケージをインストールします。

4. ファインチューニングするモデルの選択
ではファインチューニングするモデルを選びましょう!デフォルトではMeta / FacebookのLlama-3を選択しています。これは驚異の15兆トークンで訓練されています。トークンは英語の単語1つのようなものと考えてください。それはおよそ350,000冊分の厚い百科事典に相当します!他の人気モデルにはMistral、Phi-3(GPT-4出力で訓練)、GoogleのGemma(13兆トークン)などがあります。
Unsloth はこれらのモデルなどをサポートしています!実際、Hugging Faceのモデルハブからモデル名を入力して動作するか試すだけで動作するか確認できます。動作しない場合はエラーになります。

切り替え可能な他の設定が3つあります:
これはモデルのコンテキスト長を決定します。例えばGeminiは100万以上のコンテキスト長を持ち、Llama-3は8192のコンテキスト長を持ちます。任意の数を選択できますが、テスト目的では2048を推奨します。Unsloth は非常に長いコンテキストのファインチューニングもサポートしており、最良より4倍長いコンテキスト長を提供できることを示します。
これを None のままにしてください。ただし新しいGPUでは torch.float16 や torch.bfloat16 を選択できます。
私たちは4ビット量子化でファインチューニングを行います。これによりメモリ使用量が4倍削減され、実際に無料の16GBメモリGPUでファインチューニングが可能になります。4ビット量子化は重みを限られた数の値に変換してメモリ使用量を削減します。欠点として1〜2%の精度低下があります。わずかな精度向上を望む場合は H100 のような大きなGPUでこれを False に設定してください。

セルを実行すると、Unsloth のバージョン、使用しているモデル、GPUのメモリ量、その他いくつかの統計が出力されます。今は無視して構いません。
5. ファインチューニングのためのパラメータ

ファインチューニングをカスタマイズするには上の数値を編集できますが、すでにかなり妥当な数値を選んでいるので無視して構いません。
目標はこれらの数値を変更して精度を上げることですが、同時に 過学習に対抗することでもあります。過学習とはモデルがデータセットを丸暗記して新しい質問に答えられなくなることです。最終モデルには見たことのない質問にも答えられるようにし、暗記を避けたいのです。
ファインチューニング工程のランクです。大きな数はメモリをより多く使用し遅くなりますが、難しいタスクで精度を向上させる可能性があります。通常は 8(高速ファインチューニング向け)から最大128を推奨します。大きすぎると過学習を引き起こし、モデル品質を損なうことがあります。
すべてのモジュールをファインチューニングするよう選択しています。メモリ使用量を減らしたり学習を速くするためにいくつか削除することはできますが、これは強く推奨しません。全モジュールで学習してください!
ファインチューニングのスケーリング係数です。大きな数はデータセットに対してより多く学習させますが、過学習を促進する可能性があります。これをランクと等しく、
rまたはその倍にすることを推奨します。学習を速くするためにこれを0のままにしてください!過学習を多少減らせますが大きな効果はありません。
高速で過学習が少ない学習のためにこれを 0 のままにしておいてください!
オプションには
True,Falseおよび"unsloth"があります。私たちは"unsloth"を推奨します、なぜならメモリ使用量をさらに30%削減し、極めて長いコンテキストのファインチューニングをサポートするからです。詳細は以下をご覧ください: https://unsloth.ai/blog/long-context で詳細を確認できます。実験を決定論的にするための数値です。訓練やファインチューニングには乱数が必要なので、この数値を設定すると実験の再現性が得られます。
高度な機能で
lora_alpha = 16を自動的に設定します。必要ならこれを使用できます!LoRA 行列を重みの上位 r 個の特異ベクトルで初期化する高度な機能です。精度を多少改善する可能性がありますが、開始時にメモリ使用量が爆発的に増えることがあります。
6. Alpaca データセット

ここでは GPT-4 自身を呼び出して作成された Alpaca データセットを使用します。これは52,000件の指示と出力のリストで、Llama-1がリリースされたときに非常に人気があり、ベースLLMのファインチューニングでChatGPTに匹敵する性能を出せるようにしました。
Alpaca データセットの GPT4 バージョンにはここからアクセスできます: https://huggingface.co/datasets/vicgalle/alpaca-gpt4。古い最初のバージョンのデータセットはここにあります: https://github.com/tatsu-lab/stanford_alpaca。以下はデータセットのいくつかの例を示しています:

各行には3つの列があります—指示、入力、出力です。私たちは基本的に各行を下のような1つの大きなプロンプトに結合します。これを使って言語モデルをファインチューニングし、これによりChatGPTに非常に似た動作になります。このプロセスを私たちは 教師あり指示ファインチューニング.

と呼びます。
7. ファインチューニングのための複数列

しかし大きな問題は、ChatGPTスタイルのアシスタントでは1つの指示/1つのプロンプトしか許可されないことで、複数の列/入力は許されません。例えばChatGPTでは1つのプロンプトを提出する必要があり、複数のプロンプトは提出できません。
これは本質的に、ファインチューニングが機能するためには複数の列を1つの大きなプロンプトに「結合」しなければならないことを意味します!

例えば非常に有名な Titanic データセットには多くの列があります。あなたの仕事は年齢、乗客クラス、運賃などに基づいて乗客が生存したか死亡したかを予測することでした。これをそのままChatGPTに渡すことはできず、代わりにこの情報を1つの大きなプロンプトに「結合」する必要があります。

例えば、乗客のすべての情報を含む「結合された」単一のプロンプトでChatGPTに尋ねれば、乗客が生存したか死亡したかを推測または予測するように頼むことができます。 他のファインチューニングライブラリでは、すべての列を1つのプロンプトに結合してデータセットを手動で準備する必要がありますが、Unslothでは単に to_sharegpt
という関数を提供しており、これを一度に行います! Titanic のファインチューニングノートブックにアクセスするか、CSVまたはExcelファイルをアップロードしたい場合はこちら:

https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing
これはかなり複雑ですが、多くのカスタマイズを許可しているためいくつかのポイントがあります:
{}すべての列名を波括弧で囲む必要があります。これらは実際の CSV / Excel ファイルの列名です。
[[]]オプションのテキスト要素はで囲む必要があります。例えば列 "input" が空の場合、結合関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットで役立ちます。
出力またはターゲット/予測列をoutput_column_nameで選択してください。Alpaca データセットではこれは.
output

になります。
Age
23
18
7.25
Fare
S すると、望ましくない結果は次のようになります:.
The passenger embarked from S. Their age is 23. Their fare is すると、望ましくない結果は次のようになります:EMPTY
The passenger embarked from [[]]。Their age is 18. Their fare is $7.25.
代わりに列をオプションとして すると、望ましくない結果は次のようになります:.]]
で囲むことで、この情報を完全に除外できます。 すると、望ましくない結果は次のようになります:[[The passenger embarked from S.]] [[Their age is 23.]] [[Their fare is
[[The passenger embarked from
.]] [[Their age is 18.]] [[Their fare is $7.25.]]
は次のようになります:
The passenger embarked from S. Their age is 23.
Their age is 18. Their fare is $7.25.

8. マルチターン会話 気づいていなかったかもしれませんが、Alpaca データセットはシングルターンである一方、ChatGPT はインタラクティブでマルチターンで会話できます。例えば左側が私たちの望む形式ですが、右側の Alpaca データセットは単一の会話しか提供しません。ファインチューニングされたモデルにChatGPTのようなマルチターン会話を学ばせたいのです。 そこで私たちは

conversation_extension 出力またはターゲット/予測列を パラメータを導入しました。これは単一ターンのデータセットのランダムな行をいくつか選択して1つの会話に結合するものです。例えば3に設定するとランダムに3行を選択して1つに結合します!長く設定しすぎると訓練が遅くなりますが、チャットボットや最終ファインチューニングを大幅に改善する可能性があります!
次に を予測/出力列に設定します。Alpaca データセットでは出力列になります。 そして私たちはデータセットをファインチューニング用の正しい形式にするために

standardize_sharegpt
関数を使用します!常にこれを呼び出してください!

9. カスタマイズ可能なチャットテンプレート

これでファインチューニング自体のチャットテンプレートを指定できます。非常に有名な Alpaca フォーマットは以下の通りです: しかし先ほど述べたように、ChatGPTスタイルのファインチューニングは1つのプロンプトのみを要求するためこれは問題があるとされました。Unslothで全ての列を1つに結合できたので、実質的に下記のようなスタイルのチャットテンプレートを1つの入力列(instruction)と1つの出力で作成できます: ただし必ず {INPUT} というフィールドを指示用に、そして {OUTPUT} というフィールドをモデルの出力用に配置する必要があります。実際にはオプションで

{SYSTEM}

フィールドも許可しており、ChatGPTのようにシステムプロンプトをカスタマイズするのに役立ちます。以下はチャットテンプレートをカスタマイズできるいくつかのクールな例です: {OUTPUT} OpenAIモデルで使われる ChatML フォーマットの場合:

または Llama-3 自体のテンプレートを使用することもできます(これは Llama-3 の instruct バージョンを使用してのみ機能します):実際にオプションの Titanic のファインチューニングノートブックにアクセスするか、CSVまたはExcelファイルをアップロードしたい場合はこちら:

フィールドも許可しており、ChatGPTのようにシステムプロンプトをカスタマイズするのに便利です。
あるいは、CSV と Excel のアップロードを含むこの Colab ノートブックで乗客が死亡したか生存したかを予測する Titanic タスクのように:

10. モデルの訓練
上のパラメータを変更することは通常推奨しませんが、いくつかについて補足します:
gradient_accumulation_stepsper_device_train_batch_size = 2,GPUのメモリをより活用したい場合はバッチサイズを増やしてください。また学習をより滑らかにして過学習を防ぐためにもこれを増やします。ただしパディングの問題で実際には訓練時間が遅くなる可能性があるため通常は推奨しません。代わりに
は上記のバッチサイズを増やすのと同等ですが、メモリ消費には影響しません!訓練損失曲線を滑らかにしたい場合はこれを増やすことを推奨します。
max_steps = 60, # num_train_epochs = 1,高速な訓練のためにステップを60に設定しています。数時間かかるフル訓練を行う場合は代わりにmax_stepsをコメントアウトし、代わりにに置き換えてください。1に設定するとデータセットを1回完全に通過します。通常1〜3回のパスを推奨し、それ以上は過学習になります。

learning_rate = 2e-4,
ファインチューニングをよりゆっくりにして、より高い精度に収束させたい場合は学習率を下げてください。通常は 2e-4、1e-4、5e-5、2e-5 を試すことを推奨します。

訓練中に数値のログが表示されます。これは訓練損失で、モデルがどれだけデータから学んでいるかを示します。多くの場合、損失が0.5〜1.0付近であれば良い兆候ですが、データセットやタスクによります。損失が下がらない場合は設定を調整する必要があるかもしれません。損失が0に近づくと過学習の可能性があるので、検証も確認することが重要です。

11. 推論 / モデルの実行 トレーニングプロセスが完了したらモデルを実行してみましょう!黄色の下線部分を編集できます!実際、マルチターンチャットボットを作成したので、過去の会話を見たかのようにモデルを呼び出すこともできます: 補足:Unsloth 自体は 2倍高速な推論をネイティブに提供しています。常に FastLanguageModel.for_inference(model) を呼び出すのを忘れないでください。もしモデルにより長い応答を出させたい場合は、
max_new_tokens = 128
を256や1024のような大きな数に設定してください。結果が出るまでの待ち時間も長くなる点に注意してください! https://huggingface.co/settings/tokens そしてトークンを追加してください!

モデルを保存したら、再びUnslothを使ってモデル自体を実行できます!使用するのは FastLanguageModel を再度呼び出して推論を行います!

12. モデルの保存
最後に、ファインチューニングしたモデルをOllama自体にエクスポートできます!まずColabノートブックにOllamaをインストールする必要があります:

次に、ファインチューニングしたモデルを以下のようにllama.cppのGGUF形式にエクスポートします:

変換することを忘れないでください False から True 1行目だけにして、すべての行をに変更しないでください Trueそうしないと非常に長く待つことになります!通常は最初の行をに設定することを推奨します、 Trueそのため、ファインチューニングしたモデルを迅速ににエクスポートできます Q8_0 フォーマット(8ビット量子化)。また、人気のあるものとして q4_k_m.
にアクセスして、 https://github.com/ggerganov/llama.cpp GGUFについて詳しく学んでください。必要であればGGUFへのエクスポート方法を手動で説明した手順も用意しています: https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf
以下のような長いテキストのリストが表示されます — 5〜10分お待ちください!!

そして最後に、最終的には以下のようになります:

次に、Ollama自体をバックグラウンドで実行する必要があります。私たちは subprocess を使用します。Colabは非同期呼び出しを好まないためですが、通常は単にターミナル/コマンドプロンプトで ollama serve を実行します。

ファインチューニングしたモデルを小さな100MB程度のファイル(LoRAアダプタ)として保存できます。代わりに Hugging Face ハブにプッシュしてモデルをアップロードすることもできます!Hugging Face のトークンは モデルファイル 作成
モデルファイル 作成Unslothが提供するトリックは、私たちが自動的に モデルファイル を作成することです。これはOllamaが要求するものです!これは設定のリストで、ファインチューニングプロセスで使用したチャットテンプレートも含まれています!また、生成された モデルファイル を以下のように出力することもできます:

その後、私たちはOllama互換のモデルを作成するようOllamaに依頼します。使用するのは モデルファイル

から取得してください。
です。そして、ローカルマシン上/Colabの無料ノートブックでバックグラウンドで実行されているOllamaサーバー自体を呼び出して推論を行うことができます。黄色の下線部分は編集できることを忘れないでください。

13. Ollama へのエクスポート
14. 自動
15. Ollama 推論

16. インタラクティブな ChatGPT スタイル しかし実際にChatGPTのようにファインチューニング済みモデルを実行するにはもう少し作業が必要です。まず端末アイコンをクリックすると ターミナルがポップアップします。左のサイドバーにあります。

次に、ターミナルウィンドウの奇妙な出力を消すために ENTER を2回押す必要があるかもしれません。数秒待ってから次を入力してください:

ollama run unsloth_model
そして ENTER を押します。
最後に、CTRL + D でシステムを終了し、ENTER を押してチャットボットと会話することで、ファインチューニング済みモデルと実際のChatGPTのように対話できます! やりました!.
あなたは言語モデルのファインチューニングに成功し、Unsloth で2倍高速かつVRAMを70%節約してOllamaにエクスポートしました!しかもすべてGoogle Colabの無料環境で行いました! ここ報酬モデリングの方法、継続的事前学習、vLLMやGGUFへのエクスポート、テキスト補完、またはファインチューニングのコツやテクニックを学びたい場合は私たちの ここ.
Github
をご覧ください。 ここファインチューニングに関して助けが必要な場合は、私たちのDiscordサーバーにも参加できます、または Ollama に関する助けが必要な場合は彼らのサーバーにも参加できます: ここ.
最終更新
役に立ちましたか?

