私はしばらくの間、地元のモデルを実験してきましたが、それらをアクセシブルにするための進歩はエキサイティングです。最初のエクスペリエンスは素晴らしいものが多く、 Gemma 3 270M などの多くのモデルは、一般的なハードウェアで実行できるほど軽量です。この広範な展開の可能性は大きな魅力です。
しかし、これらの小さなモデルを使用して有意義で特殊なアプリケーションを構築しようとすると、複雑なタスクに必要なパフォーマンスを達成する上で常に課題に直面してきました。たとえば、 さまざまなモデルのツール呼び出し効率をテストした最近の実験では、多くのローカル モデル (およびいくつかのリモート モデル) が必要なパフォーマンス ベンチマークを満たすのに苦労していることが観察されました。この認識が私の戦略の転換を促しました。
私は、小規模で汎用的なモデルに頼るだけでは、特定の要求の厳しいタスクで真に効果的な結果を達成するには不十分な場合が多いことを理解するようになりました。さらに大きなモデルでは、許容可能なレベルのパフォーマンスと効率に到達するには多大な労力が必要になる場合があります。
それでも、ローカルモデルの可能性は、脇に置くにはあまりにも説得力があります。利点は重要です。
- プライバシー
- オフライン機能
- トークン使用コストなし
- 「過負荷」エラーメッセージはもうありません
そこで私は代替手段を探し始め、そのとき、モデルの微調整をより高速かつアクセスしやすくするために設計されたプロジェクトである Unsloth に出会いました。人気が高まっている(スターの歴史)ことで、興味が湧いてみたくなりました。
この投稿では、Python のセットアップを壊すことなく機密情報を編集するために、サブ1GB モデルを微調整する方法について説明します。Docker Offload と Unsloth を使用すると、ベースライン モデルから Docker Hub 上の移植可能で共有可能な GGUF アーティファクトに 30 分以内に移行できます。この投稿の第 2 部では、モデルを微調整する詳細な手順を共有します。
モデルの微調整の課題
モデルを微調整するための適切な環境を設定することは、...苦しい。壊れやすく、間違いを起こしやすく、正直なところ、少し怖いこともあります。私はいつも何らかの形でPython環境を壊しているようで、トレーニングを開始する前に依存関係やランタイムバージョンと格闘するだけで何時間も無駄にしています。
幸いなことに、 Unsloth の人々は、 すぐに使用できる Docker イメージを使用してこれを解決しました。すべてのセットアップに時間(と忍耐)を無駄にする代わりに、コンテナを実行するだけですぐに開始できます。
もちろん、ハードウェア要件はまだあります。私は MacBook Pro で作業していますが、Unsloth は MacBook をネイティブにサポートしていないため、通常はそれが問題になります。
しかし、ここで Docker Offload の出番です。Offload を使用すると、ローカル ワークフローを維持しながら、 クラウド内の GPU ベースのリソースをスピンアップ し、NVIDIA アクセラレーションを活用できます。つまり、ラップトップと戦うことなく、モデルを微調整するために必要なものがすべて揃ったということです。
頑張りましょう。
UnslothとDockerを使用してローカルでモデルを微調整する方法
1GB 未満のモデルは、個人を特定できる情報 (PII) を確実にマスクできますか?
テスト入力は次のとおりです。
This is an example of text that contains some data.
The author of this text is Ignacio López Luna, but everybody calls him Ignasi.
His ID number is 123456789.
He has a son named Arnau López, who was born on 21-07-2021.
必要な 出力:
This is an example of text that contains some data.
The author of this text is [MASKED] [MASKED], but everybody calls him [MASKED].
His ID number is [MASKED].
He has a son named [MASKED], who was born on [MASKED].
Docker Model Runner を使用して Gemma3270 M でテストしたところ、出力は次のようになります。
[PERSON]
明らかに、使用できません。微調整の時が来ました。
ステップ 1: サンプル プロジェクトのクローンを作成する
git clone https://github.com/ilopezluna/fine-tuning-examples.git
cd fine-tuning-examples/pii-masking
このプロジェクトには、 AI Privacy4 の pii-masking-400 k データセット を使用して Gemma を微調整するためのすぐに使用できる Python3 スクリプトが含まれています。
ステップ 2: Docker オフロードを開始する (GPU を使用)
docker offload start
- アカウントを選択します。
- GPUサポートについて尋ねられたら、「 はい 」と答えます(NVIDIA L4でバックアップされたインスタンスが取得されます)。
ステータスの確認:
docker offload status
Docker オフロード クイックスタート ガイドを参照してください。
ステップ 3: Unsloth コンテナを実行する
Unslothの公式イメージには、Jupyterといくつかのサンプルノートブックが含まれています。次のように開始できます。
docker run -d -e JUPYTER_PORT=8000 \
-e JUPYTER_PASSWORD="mypassword" \
-e USER_PASSWORD="unsloth2024" \
-p 8000:8000 \
-v $(pwd):/workspace/work \
--gpus all \
unsloth/unsloth
次に、コンテナにシェルをアタッチしましょう。
docker exec -it $(docker ps -q) bash
コンテナ内の有用なパス:
- /workspace/unsloth-notebooks/ →ノートブックの微調整の例
- /workspace/work/ をマウントされた作業ディレクトリ→
Docker Offload (内部に Mutagen を使用) のおかげで、フォルダー /workspace/work/ はクラウド GPU とローカル開発マシンの間で同期を維持します。
ステップ 4:微調整
スクリプト finetune.py は、Unslothを中心に構築された小さなトレーニングループです。その目的は、ベース言語モデルを取得し、LoRAによる教師あり微調整を使用して新しいタスクに適応させることです。この例では、モデルは、テキスト内の個人を特定できる情報 (PII) をマスクする方法を教えるデータセットでトレーニングされます。
LoRAはプロセスを軽量化し、モデルのすべてのパラメータを更新する代わりに、小さなアダプタ層を追加し、それらのみをトレーニングします。つまり、微調整は迅速に実行され、単一の GPU に収まり、後でベース モデルにマージして戻すことができるコンパクトな重みのセットが生成されます。
実行すると、次のようになります。
unsloth@46b6d7d46c1a:/workspace$ cd work
unsloth@46b6d7d46c1a:/workspace/work$ python finetune.py
Unsloth: Will patch your computer to enable 2x faster free finetuning.
[...]
スクリプトは、ベースモデルをロードし、データセットを準備し、短い教師あり微調整パスを実行し、結果のLoRA重みをマウントされた/workspace/work/フォルダーに保存します。Docker Offloadのおかげで、これらの結果はローカルマシンにも自動的に同期されます。
トレーニングの実行全体は、最新の GPU で 20 分以内に完了するように設計されており、新しいマスキング動作を "学習" し、次のステップで変換する準備ができているモデルが残ります。
データセットの構築方法、それが重要な理由、LoRA の構成方法の詳細については、このブログのパート 2 をご覧ください。
ステップ 5:GGUFに変換する
この時点で、微調整されたモデル成果物が /workspace/work/ の下に配置されます。
Docker Hub および Docker Model Runner で使用するためにモデルをパッケージ化するには、 モデルを GGUF 形式にする必要があります。(Unslothはまもなくこれを直接サポートしますが、今のところ手動で変換します。
unsloth@1b9b5b5cfd49:/workspace/work$ cd ..
unsloth@1b9b5b5cfd49:/workspace$ git clone https://github.com/ggml-org/llama.cpp
Cloning into 'llama.cpp'...
[...]
Resolving deltas: 100% (45613/45613), done.
unsloth@1b9b5b5cfd49:/workspace$ python ./llama.cpp/convert_hf_to_gguf.py work/result/ --outfile work/result.gguf
[...]
INFO:hf-to-gguf:Model successfully exported to work/result.gguf
次に、ファイルがローカルに既に存在することを確認します (これは、突然変異源を利用した自動ファイル同期プロセスが完了したことを示します)。
unsloth@46b6d7d46c1a:/workspace$ exit
exit
((.env3.12) ) ilopezluna@localhost pii-masking % ls -alh result.gguf
-rw-r--r--@ 1 ilopezluna staff 518M Sep 23 15:58 result.gguf
この時点で、Docker オフロードを停止できます。
docker offload stop
ステップ 6: Docker Hub でパッケージ化して共有する
次に、微調整されたモデルをパッケージ化して Docker Hub にプッシュしましょう。
((.env3.12) ) ilopezluna@localhost pii-masking % docker model package --gguf /Users/ilopezluna/Projects/fine-tuning-examples/pii-masking/result.gguf ignaciolopezluna020/my-awesome-model:version1 --push
Adding GGUF file from "/Users/ilopezluna/Projects/fine-tuning-examples/pii-masking/result.gguf"
Pushing model to registry...
Uploaded: 517.69 MB
Model pushed successfully
モデルの配布の詳細については、 モデルのパッケージ化に関する Docker ブログを参照してください。
ステップ 7: 結果を試してみてください!
最後に、Docker Model Runner を使用して微調整されたモデルを実行します。
docker model run ignaciolopezluna020/my-awesome-model:version1 "Mask all PII in the following text. Replace each entity with the exact UPPERCASE label in square brackets (e.g., [PERSON], [EMAIL], [PHONE], [USERNAME], [ADDRESS], [CREDIT_CARD], [TIME], etc.). Preserve all non-PII text, whitespace, ' ' and punctuation exactly. Return ONLY the redacted text. Text: This is an example of text that contains some data. The author of this text is Ignacio López Luna, but everybody calls him Ignasi. His ID number is 123456789. He has a son named Arnau López, who was born on 21-07-2021"
This is an example of text that contains some data. The author of this text is [GIVENNAME_1] [SURNAME_1], but everybody calls him [GIVENNAME_1]. His ID number is [IDCARDNUM_1]. He has a son named [GIVENNAME_1] [SURNAME_1], who was born on [DATEOFBIRTH_1]
元の Gemma 3 270M 出力と比較してください。
((.env3.12) ) ilopezluna@F2D5QD4D6C pii-masking % docker model run ai/gemma3:270M-F16 "Mask all PII in the following text. Replace each entity with the exact UPPERCASE label in square brackets (e.g., [PERSON], [EMAIL], [PHONE], [USERNAME], [ADDRESS], [CREDIT_CARD], [TIME], etc.). Preserve all non-PII text, whitespace, ' ' and punctuation exactly. Return ONLY the redacted text. Text: This is an example of text that contains some data. The author of this text is Ignacio López Luna, but everybody calls him Ignasi. His ID number is 123456789. He has a son named Arnau López, who was born on 21-07-2021"
[PERSON]
微調整されたモデルは はるかに便利で、現在では誰でも試せるようにDocker Hubですでに公開されています。
Dockerによるモデルの微調整が重要な理由
この実験は、地元の小さなモデルが「おもちゃ」や好奇心としてとどまる必要はないことを示しています。適切なツールを使用すると、現実世界の問題に対する 実用的で専門的なアシスタント になることができます。
- 速度: Unsloth と Docker Offload を使用して、1GB 未満のモデルの微調整には 20 分もかかりませんでした。これは、反復と実験に十分な速度です。
- アクセシビリティ: GPU のないマシンでも、Docker Offload は追加のハードウェアなしで GPU ベースのトレーニングのロックを解除しました。
- 移植性: パッケージ化されると、モデルは簡単に共有でき、Docker のおかげでどこでも実行できます。
- ユーティリティ: 微調整されたモデルは、曖昧または役に立たない回答を生成する代わりに、1 つのジョブを確実に実行し、PII をマスキングし、多くのワークフローですぐに価値がある可能性があります。
これが、小さな汎用モデルを 焦点を絞った信頼性の高いツールに変える、モデルの微調整の力です。また、Dockerのエコシステムでは、それを実現するために巨大なワークステーションを持つML研究者である必要はありません。トレーニング、テスト、パッケージ化、共有はすべて、使い慣れた Docker ワークフローで行うことができます。
したがって、次回 「小さなモデルは役に立たない」と思ったら、少し微調整すれば、絶対に役に立つ可能性があることを思い出してください。
これにより、小さなローカルモデルが「興味深いデモ」から実 用的で使いやすいツールになります。
私たちはこれを一緒に構築しています!
Docker Model Runner は、その中核となるコミュニティ フレンドリーなプロジェクトであり、その将来はあなたのような貢献者によって形作られます。このツールが役立つと思われる場合は、 GitHubリポジトリにアクセスしてください。私たちに星を付けてサポートを示し、プロジェクトをフォークして独自のアイデアを試し、貢献してください。ドキュメントの改善、バグの修正、新機能のいずれであっても、すべての貢献が役に立ちます。モデル展開の未来を一緒に築きましょう!
GPU オンデマンド → の Docker オフロードから開始
さらに詳しく
- Model Runner の一般提供のお知らせを確認する
- Model Runner GitHub リポジトリにアクセスしてください。
- Compose で AI アプリとエージェントの構築が簡単になる方法をご覧ください。
- Unsloth Docker イメージの詳細については、Unsloth のドキュメント を参照してください。