For the complete documentation index, see llms.txt. This page is also available as Markdown.

🦙チュートリアル: Llama-3 をファインチューニングして Ollama で使う方法

Ollama 上でローカル実行する、カスタマイズされた個人アシスタント(ChatGPT のようなもの)を作成するための初心者向けガイド

このチュートリアルの終わりまでに、あなたはカスタムチャットボットを作成します。 Llama-3 をファインチューニングして かつ Unsloth 無料で。これはローカルで Ollama を介してあなたのPC上で、または無料のGPUインスタンス上で Google Colab。以下のようにチャットボットと対話的にやり取りできるようになります:

Unsloth を使うとファインチューニングがずっと簡単になり、ファインチューニング済みモデルを自動的に Ollama へ、統合された自動 Modelfile 作成機能付きでエクスポートできます!助けが必要なら、私たちのDiscordサーバーに参加できます: https://discord.com/invite/unsloth

1. Unsloth とは?

Unsloth は、Llama-3、Mistral、Phi-3、Gemma などのLLMのファインチューニングを2倍高速にし、メモリ使用量を70%削減し、しかも精度低下なしで実現します!このチュートリアルでは、無料GPUを提供する Google Colab を使用します。以下から無料ノートブックにアクセスできます:

また、Google アカウントにログインする必要があります!

2. Ollama とは?

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

3. Unsloth をインストールする

Colab ノートブックを使ったことがない場合は、ノートブック自体の簡単な説明です:

  1. 各「セル」にある再生ボタン。 これをクリックすると、そのセルのコードが実行されます。どのセルも飛ばしてはいけず、すべてのセルを時系列順に実行する必要があります。エラーが発生した場合は、以前に実行しなかったセルを再実行してください。再生ボタンをクリックしたくない場合は、CTRL + ENTER を押すこともできます。

  2. 上部ツールバーの Runtime ボタン。 このボタンを使って「Run all」を押し、ノートブック全体を一度に実行することもできます。これにより、すべてのカスタマイズ手順はスキップされますが、最初の試しとしては良い方法です。

  3. Connect / Reconnect T4 ボタン。 ここをクリックすると、より高度なシステム統計を確認できます。

最初のインストール用セルは以下のようになっています: 角括弧 [ ] の中の PLAY ボタンをクリックするのを忘れないでください。私たちはオープンソースの Github パッケージを取得し、他のいくつかのパッケージもインストールします。

4. ファインチューニングするモデルを選択する

では次に、ファインチューニング用のモデルを選びましょう!デフォルトでは Meta / Facebook の Llama-3 を選択しています。これはなんと15兆の「トークン」で訓練されています。1トークンは英単語1語のようなものだと考えてください。これはおよそ35万冊分の分厚い百科事典に相当します!他の人気モデルには、Mistral、Phi-3(GPT-4 の出力を使って訓練)、Google の Gemma(13兆トークン!)などがあります。

Unsloth はこれらのモデルやさらに多くのモデルをサポートしています!実際、Hugging Face モデルハブのモデル名を入力するだけで、動作するかどうか確認できます!動作しない場合はエラーになります。

切り替え可能な他の設定が3つあります:

  1. これはモデルのコンテキスト長を決定します。たとえば Gemini は100万を超えるコンテキスト長を持っていますが、Llama-3 は 8192 のコンテキスト長です。私たちは任意の数値を選べるようにしていますが、テスト目的では 2048 に設定することをおすすめします。Unsloth は非常に長いコンテキストのファインチューニングもサポートしており、最高水準より4倍長いコンテキスト長を提供できることも示しています。

  2. これは None のままにしてください。ただし、新しい GPU では torch.float16 または torch.bfloat16 を選択できます。

  3. 私たちは4ビット量子化でファインチューニングを行います。これによりメモリ使用量が4分の1になり、実際に無料の16GBメモリGPUでファインチューニングできるようになります。4ビット量子化は本質的に重みを限られた数の値に変換してメモリ使用量を減らします。その欠点は、精度が1〜2%低下することです。H100 のような大きな GPU では、このわずかな追加精度が欲しいなら False に設定してください。

セルを実行すると、Unsloth のバージョン、使用しているモデル、GPU のメモリ量、その他いくつかの統計が表示されます。今のところは無視してください。

5. ファインチューニングのパラメータ

ここでファインチューニングをカスタマイズできます。上の数値を編集できますが、すでにかなり妥当な数値を選んでいるので、無視しても構いません。

目標は、これらの数値を変更して精度を上げることですが、同時に 過学習を抑えることでもあります。過学習とは、言語モデルにデータセットを暗記させてしまい、新しい未知の質問に答えられなくなることです。私たちは最終モデルに、見たことのない質問へ答えさせたいのであって、暗記させたいわけではありません。

  1. ファインチューニング処理のランクです。数値が大きいほどメモリを多く使い遅くなりますが、難しいタスクでは精度が向上する可能性があります。通常は 8(高速なファインチューニング向け)や最大 128 のような数を推奨します。大きすぎる数値は過学習を引き起こし、モデルの品質を損なう可能性があります。

  2. 私たちはファインチューニング対象としてすべてのモジュールを選択しています。いくつか外せばメモリ使用量を減らし、学習を速くできますが、これはあまりおすすめしません。すべてのモジュールで学習させてください!

  3. ファインチューニングのスケーリング係数です。数値が大きいほど、ファインチューニングがデータセットについてより多くを学習しますが、過学習を促進することがあります。私たちはこれをランク rと同じか、その2倍にすることを推奨します。

  4. より高速に学習するため、これは 0 のままにしてください!過学習を減らせますが、それほど大きくはありません。

  5. より高速で過学習の少ない学習のため、これは 0 のままにしてください!

  6. 選択肢には True, False および "unsloth"が含まれます。私たちは "unsloth" を推奨します。メモリ使用量をさらに30%削減し、非常に長いコンテキストのファインチューニングをサポートするためです。詳しくはこちらをお読みください: https://unsloth.ai/blog/long-context 詳細について。

  7. これは決定論的な実行を決める数値です。学習やファインチューニングには乱数が必要なので、この数値を設定すると実験を再現可能にできます。

  8. 高度な機能で、 lora_alpha = 16 を自動的に設定します。必要ならこれを使えます!

  9. 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つの列、つまり instruction、input、output があることがわかります。基本的には各行を以下のような1つの大きなプロンプトに結合します。そしてこれを使って言語モデルをファインチューニングすると、ChatGPT に非常に近いものになりました。私たちはこのプロセスを 教師あり指示ファインチューニング.

7. ファインチューニング用の複数列

しかし大きな問題は、ChatGPT 風のアシスタントでは 1 instruction / 1 prompt しか扱えず、複数列 / 複数入力は許可されないことです。たとえば 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.

たとえば Titanic データセットでは、以下のように各列 / テキスト片がオプションになる大きな結合プロンプト形式を作成できます。

たとえば、データセットが大量の欠損データを含んでこのようになっているとします:

Embarked
Age
Fare

S

23

18

7.25

すると、結果を次のようにはしたくありません:

  1. その乗客は S から乗船しました。年齢は 23 歳です。運賃は .

  2. その乗客は から乗船しました。年齢は 18 歳です。運賃は $7.25 です。

その代わり、列をオプションとして [[]]で囲むことで、この情報を完全に除外できます。

  1. [[その乗客は S から乗船しました。]] [[年齢は 23 歳です。]] [[運賃は .]]

  2. [[その乗客は から乗船しました。]] [[年齢は 18 歳です。]] [[運賃は $7.25 です。]]

は次のようになります:

  1. その乗客は S から乗船しました。年齢は 23 歳です。

  2. 年齢は 18 歳です。運賃は $7.25 です。

8. マルチターン会話

気づかなかったかもしれませんが、Alpaca データセットはシングルターンです。一方、ChatGPT の利用は対話的で、複数ターンで会話できます。たとえば、左側が私たちの望むものですが、右側の Alpaca データセットは単一の会話しか提供しません。ファインチューニング済み言語モデルには、どうにかして ChatGPT のようなマルチターン会話を学ばせたいのです。

そこで私たちは conversation_extension パラメータを導入しました。これは本質的に、シングルターンのデータセットからランダムな行をいくつか選び、それらを1つの会話に結合するものです!たとえば 3 に設定すると、3行をランダムに選んで1つに結合します!長くしすぎると学習は遅くなりますが、チャットボットや最終的なファインチューニング結果がずっと良くなる可能性があります!

次に output_column_name を予測 / 出力列に設定します。Alpaca データセットでは output 列になります。

その後、 standardize_sharegpt 関数を使って、ファインチューニングに正しい形式へデータセットを整えます!必ずこれを呼び出してください!

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

これで、ファインチューニング自体のチャットテンプレートを指定できます。非常に有名な Alpaca 形式は以下です:

ですが、ChatGPT 風のファインチューニングでは1つのプロンプトだけが必要なので、これは良くないアイデアだと言いましたよね?Unsloth を使ってすべてのデータセット列を1つに結合することに成功したので、基本的に以下のような、1つの入力列(instruction)と1つの出力を持つスタイルのチャットテンプレートを作成できます:

必要なのは、 {INPUT} というフィールドを instruction 用に置き、さらに {OUTPUT} というフィールドをモデルの出力用に置くことだけです。実際には、オプションの {SYSTEM} フィールドも利用可能で、これは ChatGPT のようにシステムプロンプトをカスタマイズするのに便利です。たとえば、以下はチャットテンプレートをカスタマイズできるクールな例です:

OpenAI モデルで使われる ChatML 形式の場合:

あるいは、Llama-3 自体のテンプレートも使えます(これは Llama-3 の instruct 版を使う場合にのみ機能します): 実際には、オプションの {SYSTEM} フィールドも利用可能で、これは ChatGPT のようにシステムプロンプトをカスタマイズするのに便利です。

または、CSV と Excel のアップロードを含むこの Colab ノートブックで、乗客が死亡したか生存したかを予測する必要がある Titanic 予測タスクでは: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

10. モデルを学習させる

ではモデルを学習させましょう!通常、より長いステップでファインチューニングしたい場合や、大きなバッチサイズで学習したい場合を除き、以下は編集しないことをおすすめします。

通常、上のパラメータを変更することはおすすめしませんが、そのいくつかを補足すると:

  1. GPU のメモリをもっと活用したい場合は、バッチサイズを増やしてください。また、これを増やすと学習がより滑らかになり、過学習しにくくなります。ただし、パディングの問題で実際には学習が遅くなることがあるため、通常はおすすめしません。代わりに通常は、 gradient_accumulation_steps を増やすよう勧めています。これは単にデータセットに対してより多くのパスを行うだけです。

  2. 上のバッチサイズ自体を増やすのと同等ですが、メモリ消費には影響しません!通常、より滑らかな学習損失曲線が欲しい場合に、これを増やすことをおすすめしています。

  3. 高速学習のため、ステップ数を 60 に設定しています。数時間かかる完全な学習を行う場合は、代わりに max_stepsをコメントアウトし、 num_train_epochs = 1に置き換えてください。1 に設定すると、データセット全体を1回通すことを意味します。通常は1〜3回のパスを推奨し、それ以上はファインチューニングが過学習するためおすすめしません。

  4. ファインチューニングをより遅くしたいが、より高い精度に収束する可能性を高めたい場合は、学習率を下げてください。通常、試す数値として 2e-4、1e-4、5e-5、2e-5 をおすすめします。

学習中には数字のログが表示されます。これは training loss で、モデルがデータセットからどれだけうまく学習しているかを示します。多くの場合、0.5 から 1.0 程度の loss は良い兆候ですが、データセットやタスクに依存します。loss が下がらない場合は、設定を調整する必要があるかもしれません。loss が 0 になる場合は過学習を意味する可能性があるため、検証も確認することが重要です。

11. 推論 / モデルの実行

では、学習プロセスが完了したのでモデルを実行してみましょう!黄色の下線部分は編集できます!実際、マルチターンのチャットボットを作成したので、以下のように過去の会話を見たかのようにモデルを呼び出すこともできます:

念のため言うと、Unsloth 自体は 2倍高速な推論 もネイティブに提供しているので、必ず FastLanguageModel.for_inference(model)を呼び出すのを忘れないでください。モデルにより長い応答を出力させたい場合は、 max_new_tokens = 128 を 256 や 1024 のような大きめの数に設定してください。もちろん結果を待つ時間も長くなることに注意してください!

12. モデルの保存

これで、ファインチューニング済みモデルを以下のような LoRA アダプタと呼ばれる小さな 100MB ファイルとして保存できます。モデルをアップロードしたい場合は、代わりに Hugging Face hub に push することもできます!Hugging Face トークンを取得するのを忘れないでください: https://huggingface.co/settings/tokens そしてトークンを追加してください!

モデルを保存したあと、再び Unsloth を使ってモデル自体を実行できます! FastLanguageModel をもう一度使って推論を呼び出しましょう!

13. Ollama へのエクスポート

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

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

変換の注意 FalseTrue にするのは1行だけで、すべての行を Trueに変更しないでください。さもないと、とても長い時間待つことになります!通常は最初の行を Trueに設定することをおすすめします。そうすれば、ファインチューニングしたモデルをすばやく Q8_0 形式(8ビット量子化)へエクスポートできます。さらに、さまざまな量子化手法の一覧へもエクスポートでき、よく使われるものの1つが q4_k_m.

こちらへ移動して https://github.com/ggml-org/llama.cpp GGUF について詳しく学んでください。GGUF への手動エクスポート方法についての説明もこちらにあります: https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf

下のような長いテキストの一覧が表示されますが、5〜10分ほど待ってください!!

そして最後に、いちばん最後は下のようになります:

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

14. 自動 Modelfile 作成

Unsloth が提供するトリックは、私たちが自動で Modelfile を作成することです。これは Ollama が必要とするものです!これは設定の一覧であり、ファインチューニング時に使用したチャットテンプレートも含まれています!また、 Modelfile を下のように出力することもできます:

その後、 Modelfile

15. Ollama 推論

を使って、Ollama と互換性のあるモデルを作成するよう Ollama に指示します。これで、推論のためにモデルを呼び出すことができます。自分のローカルマシン / 無料の Colab ノートブック上でバックグラウンド実行している Ollama サーバーそのものを呼び出したい場合に使ってください。黄色で下線が引かれた部分は編集できます。

16. 対話型 ChatGPT スタイル

ただし、ファインチューニング済みモデルを実際に ChatGPT のように動かすには、もう少し作業が必要です!まずターミナルアイコンをクリックしてください するとターミナルが表示されます。左側のサイドバーにあります。

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

最後に、実際の ChatGPT のようにファインチューニング済みモデルと対話できます!システムを終了するには CTRL + D を押し、チャットボットと会話するには ENTER を押してください!

やりました!

言語モデルのファインチューニングに成功し、Unsloth によって 2倍高速、VRAM 使用量 70% 削減で Ollama にエクスポートできました!しかもこれらすべてを Google Colab ノートブック上で無料で行えました!

報酬モデリングのやり方、継続事前学習、vLLM や GGUF へのエクスポート、テキスト補完、またはファインチューニングのコツやテクニックについてさらに学びたい場合は、私たちの Github.

ファインチューニングで助けが必要な場合は、私たちの Discord サーバーにも参加できます こちら。Ollama について助けが欲しい場合は、彼らのサーバーにも参加できます こちら.

最後に、ここまで読んでついてきてくださったことに感謝します!この内容が、言語モデルのファインチューニングの仕組みの一端を理解する助けとなり、役に立ったことを願っています!

Alpaca データセットの例にアクセスするには、 こちらをクリックしてください。また、CSV / Excel ファインチューニングガイドは こちら.

最終更新

役に立ちましたか?