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

ローカルで Ollama 上で動かすカスタマイズされたパーソナルアシスタント(ChatGPT のような)を作るための初心者向けガイド

このチュートリアルの最後までに、あなたはカスタムチャットボットを作成します、 Llama-3をファインチューニングする と一緒に Unslotharrow-up-right で無料で。ローカルでは Ollamaarrow-up-right を介してPC上で実行することも、 Google Colabarrow-up-rightの無料GPUインスタンスで実行することもできます。以下のように対話的にチャットボットとやり取りできます:

Unsloth はファインチューニングを非常に簡単にし、ファインチューニング済みモデルを自動的にエクスポートできるようにします、 Ollama 統合された自動 モデルファイル 作成!もし助けが必要なら、私たちのDiscordサーバーに参加できます: https://discord.com/invite/unslotharrow-up-right

circle-exclamation

1. Unslothとは?

Unslotharrow-up-right はLlama-3、Mistral、Phi-3、Gemmaなどの大規模言語モデルのファインチューニングを2倍速く、メモリ使用量を70%削減し、精度の劣化なしに行えます!このチュートリアルでは無料GPUを提供するGoogle Colabを使用します。以下から私たちの無料ノートブックにアクセスできます:

Googleアカウントでログインする必要もあります!

2. Ollamaとは?

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

3. Unslothのインストール

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

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

  2. 上部ツールバーのランタイムボタン。 このボタンを使って「すべて実行」を選ぶと、ノートブック全体を一度に実行できます。カスタマイズ手順をすべてスキップするので、最初の試行として良い場合があります。

  3. 接続 / 再接続 T4 ボタン。 より高度なシステム統計を見るにはここをクリックできます。

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

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

ではファインチューニングするモデルを選びましょう!デフォルトではMeta / FacebookのLlama-3を使用します。これはなんと15兆トークンで学習されています。トークンは英語の単語1つのようなものだと仮定してください。それはおおよそ35万冊分の分厚い百科事典に相当します!他の人気モデルにはMistral、GPT-4出力で学習したPhi-3、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倍削減され、実際に無料の16GBメモリGPUでファインチューニングが可能になります。4ビット量子化は重みを限られた数値の集合に変換してメモリ使用を減らすものです。その欠点は精度が1〜2%低下することです。もしH100のような大きなGPUを使うなら、このわずかな精度向上のためにFalseに設定してください。

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

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

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

目的はこれらの数値を変更して精度を上げることですが、同時に 過学習に対抗すること。過学習とは、言語モデルがデータセットを丸暗記してしまい、新しい質問に答えられなくなることです。最終モデルには見たことのない質問にも答えられることを望み、単なる暗記は避けたいです。

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

  2. ファインチューニングするすべてのモジュールを選択しています。メモリ使用量を減らしトレーニングを速くするために一部を削除することもできますが、これは強くは推奨しません。すべてのモジュールでトレーニングしてください!

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

  4. 高速なトレーニングのためにこれを0のままにしてください!過学習を減らせますが、その効果はそれほど大きくありません。

  5. これを0のままにしておくと、より高速で過学習の少ないトレーニングになります!

  6. オプションには True, False および "unsloth"があります。推奨は "unsloth" なぜならメモリ使用量をさらに30%削減し、非常に長いコンテキストのファインチューニングをサポートするからです。詳細は以下を参照してください: https://unsloth.ai/blog/long-contextarrow-up-right で詳細を確認できます。

  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-gpt4arrow-up-right。古い最初のバージョンのデータセットはここにあります: https://github.com/tatsu-lab/stanford_alpacaarrow-up-right。以下にデータセットのいくつかの例を示します:

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

と呼びます。

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

しかし大きな問題は、ChatGPTスタイルのアシスタントの場合、1つの指示/1つのプロンプトしか許可されず、複数列/複数入力を許可しないことです。例えばChatGPTでは1つのプロンプトを送信し、複数のプロンプトを送信するわけではありません。

これは本質的に、ファインチューニングが実際に機能するために複数の列を1つの大きなプロンプトに「結合」しなければならないことを意味します!

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

他のファインチューニングライブラリでは、すべての列を1つのプロンプトに手動でマージしてデータセットを準備する必要があります。Unslothでは、単に to_sharegpt という関数を提供しており、これが一度にこれを行います!

Titanicのファインチューニングノートブックにアクセスするか、CSVまたはExcelファイルをアップロードしたい場合は、ここに行ってください: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharingarrow-up-right

ここはより複雑ですが、多くのカスタマイズを許可するので、いくつかのポイントがあります:

  • すべての列名を波括弧で囲む必要があります {}。これらは実際のCSV / Excelファイル内の列名です。

  • オプションのテキスト要素はで囲む必要があります [[]]。例えば列 "input" が空の場合、マージ関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットに便利です。

  • 出力またはターゲット/予測列をで選択してください output_column_name。Alpacaデータセットでは、これは output.

になります。

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

例えば、データセットが多くの欠損データを含む次のような形だと仮定します:
出港地
年齢

運賃

23

18

7.25

S

  1. すると、結果として次のようにしたくはありません: 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は.

  2. 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は乗客は

から出港しました。彼らの年齢は18です。彼らの運賃は$7.25です。 [[]]代わりに、列をオプションとしてで囲むことにより、これらの情報を完全に除外できます。

  1. [[乗客はSから出港しました。]] [[彼らの年齢は23です。]] [[彼らの運賃は 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は.]]

  2. [[乗客は 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃はから出港しました。]] [[彼らの年齢は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つの入力列(指示)と1つの出力で以下のスタイルのチャットテンプレートを作成できます:

ただし、必ず {INPUT} フィールドを指示用に、 {OUTPUT} フィールドをモデルの出力用に置く必要があります。実際にはオプションで {SYSTEM} フィールドも許可しており、これはChatGPTのようにシステムプロンプトをカスタマイズするのに便利です。例えば以下はカスタマイズできるいくつかのクールな例です:

OpenAIモデルで使用されるChatMLフォーマットの場合:

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

あるいはCSV/Excelアップロードを含むこのColabノートブックのTitanic予測タスクのように: https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharingarrow-up-right

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を推奨します。

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

11. 推論 / モデルの実行

トレーニングが完了したらモデルを実行しましょう!黄色で下線が引かれた部分は編集できます。実際、多ターンのチャットボットを作成したので、過去にいくつかの会話を見たかのようにモデルを呼び出すこともできます、以下のように:

補足:Unsloth自体は 2倍速の推論 をネイティブに提供しているので、必ず忘れずに FastLanguageModel.for_inference(model)を呼んでください。 モデルにより長い応答を出力させたい場合は、 max_new_tokens = 128

を256や1024のような大きな数に設定してください。結果が返るまでの待ち時間が長くなることに注意してください!

12. モデルの保存 ファインチューニング済みモデルをLoRAアダプタという小さい100MB程度のファイルとして保存できます。モデルをアップロードしたい場合はHugging Faceハブにプッシュすることもできます!Hugging Faceのトークンは以下から取得してください:arrow-up-right https://huggingface.co/settings/tokens

そしてトークンを追加してください! モデルを保存した後、再びUnslothを使ってそのモデルを実行できます! FastLanguageModel

を再度使用して推論に呼び出してください!

13. Ollamaへのエクスポート

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

次に、ファインチューニング済みモデルをllama.cppのGGUF形式に以下のようにエクスポートします: False 念のため変換することを忘れないでください TrueTrue1行目だけにして、すべての行をに変更しないでください、そうしないと非常に長時間待つことになります!通常は最初の行を Trueに設定することを推奨します。これによりファインチューニング済みモデルを迅速に Q8_0 フォーマット(8ビット量子化)でエクスポートできます。私たちは他の多くの量子化方式へのエクスポートも許可しており、人気のあるものの1つは q4_k_m.

です。GGUFについて詳しくは https://github.com/ggerganov/llama.cpparrow-up-right を参照してください。GGUFへのエクスポート方法の手動手順が必要な場合はここにあります: https://github.com/unslothai/unsloth/wiki#manually-saving-to-ggufarrow-up-right

以下のような長いテキストの一覧が表示されます — 5〜10分お待ちください!!

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

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

14. 自動的な モデルファイル 作成

Unslothが提供するトリックは、Ollamaが必要とする モデルファイル を自動的に作成することです!これは設定のリストで、ファインチューニングプロセスで使ったチャットテンプレートが含まれます!また生成された モデルファイル を以下のように出力することもできます:

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

15. 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へのエクスポート、テキスト補完、あるいはファインチューニングのヒントやコツをもっと学びたい場合は、私たちの Githubarrow-up-right.

ファインチューニングで助けが必要な場合は、私たちのDiscordサーバーにも参加できます ここarrow-up-right。Ollamaのサポートが必要なら、彼らのサーバーにも参加できます ここarrow-up-right.

最後に、ここまで読んでついてきてくれてありがとう!これが言語モデルのファインチューニングの仕組みのいくつかを理解するのに役立ち、役に立ったことを願っています!

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

最終更新

役に立ちましたか?