モデルのファインチューニング
AI モデルのファインチューニングは、独自のデータセットを使用して、GPU を備えたコンピューティング環境で事前学習済みモデルに対して**ファインチューニング**ジョブを実行できる一般的な手法です。AI Toolkit は現在、GPU を備えたローカルマシンまたはクラウド (Azure Container App) での SLM のファインチューニングをサポートしています。
ファインチューニングされたモデルはローカルにダウンロードして GPU で推論テストを行ったり、CPU でローカルに実行するために量子化したりできます。ファインチューニングされたモデルは、リモートモデルとしてクラウド環境にデプロイすることも可能です。
VS Code 用 AI Toolkit (プレビュー) を使用して Azure で AI モデルをファインチューニングする
VS Code 用 AI Toolkit は現在、Azure Container App のプロビジョニングをサポートしており、モデルのファインチューニングを実行し、クラウドで推論エンドポイントをホストできます。
クラウド環境をセットアップする
-
リモートの Azure Container Apps 環境でモデルのファインチューニングと推論を実行するには、サブスクリプションに十分な GPU 容量があることを確認してください。アプリケーションに必要な容量をリクエストするには、サポート チケットを送信してください。GPU 容量の詳細はこちら
-
HuggingFace でプライベート データセットを使用している場合や、ベースモデルにアクセス制御が必要な場合は、HuggingFace アカウントがあることと、アクセス トークンを生成していることを確認してください。
-
Mistral または Llama をファインチューニングする場合は、HuggingFace でライセンスに同意してください。
-
VS Code 用 AI Toolkit でリモート ファインチューニングと推論の機能フラグを有効にする
- [ファイル] -> [基本設定] -> [設定] の順に選択して、VS Code の設定を開きます。
- [拡張機能] に移動し、[AI Toolkit] を選択します。
- 「Azure Container Apps でファインチューニングと推論を実行する機能を有効にする」オプションを選択します。
- 変更を適用するために VS Code を再読み込みします。
ファインチューニング プロジェクトをスキャフォールドする
- コマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) で
AI Toolkit: Focus on Tools View
を実行します。 - モデル カタログにアクセスするには
Fine-tuning
に移動します。ファインチューニングするモデルを選択します。プロジェクトに名前を割り当て、マシン上の場所を選択します。次に、「プロジェクトの構成」ボタンをクリックします。 - プロジェクトの構成
- 「ローカルでファインチューニング」オプションを有効にしないでください。
- Olive の構成設定が、事前設定されたデフォルト値とともに表示されます。必要に応じて、これらの構成を調整して入力してください。
- [プロジェクトの生成] に進みます。この段階では WSL が活用され、新しい Conda 環境のセットアップが行われ、Dev Containers を含む将来の更新に備えます。
- 「ワークスペースでウィンドウを再起動」を選択して、ファインチューニング プロジェクトを開きます。
このプロジェクトは現在、VS Code 用 AI Toolkit 内でローカルまたはリモートのどちらでも動作します。プロジェクト作成時に「ローカルでファインチューニング」を選択した場合、クラウド リソースなしで WSL 内でのみ実行されます。それ以外の場合、プロジェクトはリモートの Azure Container App 環境での実行に制限されます。
Azure リソースのプロビジョニング
まず、リモート ファインチューニング用の Azure リソースをプロビジョニングする必要があります。コマンドパレットから AI Toolkit: Provision Azure Container Apps job for fine-tuning
を検索して実行します。このプロセス中に、Azure サブスクリプションとリソースグループを選択するように求められます。
出力チャネルに表示されるリンクからプロビジョニングの進行状況を監視します。
ファインチューニングの実行
リモート ファインチューニング ジョブを開始するには、コマンドパレットで AI Toolkit: Run fine-tuning
コマンドを実行します。
拡張機能は以下の操作を実行します
-
ワークスペースを Azure Files と同期します。
-
./infra/fintuning.config.json
で指定されたコマンドを使用して Azure Container App ジョブをトリガーします。
ファインチューニングには QLoRA が使用され、ファインチューニング プロセスでは、推論中にモデルが使用する LoRA アダプターが作成されます。
ファインチューニングの結果は Azure Files に保存されます。Azure File share の出力ファイルを探索するには、出力パネルに表示されているリンクを使用して Azure portal に移動します。または、直接 Azure portal にアクセスし、./infra/fintuning.config.json
で定義されている STORAGE_ACCOUNT_NAME
という名前のストレージアカウントと、./infra/fintuning.config.json
で定義されている FILE_SHARE_NAME
という名前のファイル共有を探すこともできます。
ログの表示
ファインチューニング ジョブが開始されたら、Azure portal にアクセスしてシステムログとコンソールログにアクセスできます。
または、VSCode の出力パネルでコンソールログを直接表示することもできます。
ジョブの開始には数分かかる場合があります。すでに実行中のジョブがある場合、現在のジョブは後で開始するためにキューに入れられることがあります。
Azure でログを表示およびクエリする
ファインチューニング ジョブがトリガーされた後、VSCode の通知から「Azure Portal でログを開く」ボタンを選択して、Azure でログを表示できます。
または、すでに Azure Portal を開いている場合は、「実行履歴」パネルから Azure Container Apps ジョブのジョブ履歴を検索してください。
ログには「コンソール」と「システム」の2種類があります。
- コンソールログは、
stderr
およびstdout
メッセージを含む、アプリからのメッセージです。これは、ストリーミングログのセクションですでに確認した内容です。 - システムログは、サービスレベルのイベントのステータスを含む、Azure Container Apps サービスからのメッセージです。
ログを表示およびクエリするには、「コンソール」ボタンを選択し、Log Analytics ページに移動してすべてのログを表示し、クエリを作成できます。
Azure Container Apps のログの詳細については、Azure Container Apps のアプリケーションログを参照してください。
VSCode でストリーミングログを表示する
ファインチューニング ジョブを開始した後、VSCode の通知にある「VS Code でストリーミングログを表示」ボタンを選択して、Azure でログを表示することもできます。
または、コマンドパレットで AI Toolkit: Show the running fine-tuning job streaming logs
コマンドを実行することもできます。
実行中のファインチューニング ジョブのストリーミングログが出力パネルに表示されます。
リソース不足のため、ジョブがキューに入れられることがあります。ログが表示されない場合は、しばらく待ってからコマンドを実行してストリーミングログに再接続してください。ストリーミングログはタイムアウトして切断されることがありますが、コマンドを再度実行することで再接続できます。
ファインチューニング済みモデルでの推論
リモート環境でアダプターがトレーニングされたら、シンプルな Gradio アプリケーションを使用してモデルと対話します。
Azure リソースのプロビジョニング
ファインチューニング プロセスと同様に、コマンドパレットから AI Toolkit: Provision Azure Container Apps for inference
を実行して、リモート推論用の Azure リソースをセットアップする必要があります。このセットアップ中に、Azure サブスクリプションとリソースグループを選択するように求められます。
既定では、推論用のサブスクリプションとリソースグループはファインチューニングに使用されたものと一致している必要があります。推論は同じ Azure Container App 環境を使用し、ファインチューニング手順中に生成された Azure Files に保存されているモデルとモデルアダプターにアクセスします。
推論のためのデプロイ
推論コードを修正したり、推論モデルをリロードしたい場合は、AI Toolkit: Deploy for inference
コマンドを実行してください。これにより、最新のコードが ACA と同期され、レプリカが再起動されます。
デプロイが正常に完了すると、モデルはこのエンドポイントを使用して評価する準備が整います。VSCode の通知に表示される「推論エンドポイントへ移動」ボタンを選択して、推論 API にアクセスできます。または、Web API エンドポイントは ./infra/inference.config.json
の ACA_APP_ENDPOINT
および出力パネルで確認できます。
推論エンドポイントが完全に機能するまでには数分かかる場合があります。
高度な使用法
ファインチューニング プロジェクトのコンポーネント
フォルダー | 内容 |
---|---|
infra |
リモート操作に必要なすべての構成が含まれています。 |
infra/provision/finetuning.parameters.json |
ファインチューニング用の Azure リソースをプロビジョニングするために使用される bicep テンプレートのパラメーターを保持します。 |
infra/provision/finetuning.bicep |
ファインチューニング用の Azure リソースをプロビジョニングするためのテンプレートが含まれています。 |
infra/finetuning.config.json |
AI Toolkit: Provision Azure Container Apps job for fine-tuning コマンドによって生成される構成ファイルです。他のリモート コマンドパレットの入力として使用されます。 |
Azure Container Apps でファインチューニング用のシークレットを構成する
Azure Container App シークレットは、HuggingFace トークンや Weights & Biases API キーなど、Azure Container Apps 内の機密データを安全に保存および管理するための方法を提供します。AI toolkit のコマンドパレットを使用すると、プロビジョニングされた Azure コンテナーアプリ ジョブ (./finetuning.config.json
に保存されている) にシークレットを入力できます。これらのシークレットは、すべてのコンテナーで**環境変数**として設定されます。
手順
-
コマンドパレットで、
AI Toolkit: Add Azure Container Apps Job secret for fine-tuning
と入力して選択します。 -
シークレット名と値を入力してください。シークレットの名前と値の入力を求められます。
たとえば、プライベートな HuggingFace データセットまたは Hugging Face アクセス制御が必要なモデルを使用している場合は、Hugging Face Hub での手動ログインが不要になるように、HuggingFace トークンを環境変数
HF_TOKEN
として設定してください。
シークレットを設定すると、Azure Container App で使用できるようになります。シークレットはコンテナーアプリの環境変数に設定されます。
ファインチューニングのための Azure リソース プロビジョニングの構成
このガイドは、AI Toolkit: Provision Azure Container Apps job for fine-tuning
コマンドを構成するのに役立ちます。
構成パラメーターは ./infra/provision/finetuning.parameters.json
ファイルで確認できます。詳細は以下の通りです。
パラメーター | 説明 |
---|---|
defaultCommands |
これは、ファインチューニング ジョブを開始するためのデフォルト コマンドです。./infra/finetuning.config.json で上書きできます。 |
maximumInstanceCount |
このパラメーターは、GPU インスタンスの最大容量を設定します。 |
timeout |
これは、Azure Container App ファインチューニング ジョブのタイムアウトを秒単位で設定します。デフォルト値は 10800 で、これは 3 時間に相当します。Azure Container App ジョブがこのタイムアウトに達すると、ファインチューニング プロセスは停止します。ただし、チェックポイントはデフォルトで保存されるため、再度実行された場合でも、ファインチューニング プロセスは最初からではなく、最後のチェックポイントから再開できます。 |
location |
これは、Azure リソースがプロビジョニングされる場所です。デフォルト値は、選択されたリソースグループの場所と同じです。 |
storageAccountName , fileShareName acaEnvironmentName , acaEnvironmentStorageName , acaJobName , acaLogAnalyticsName |
これらのパラメーターは、プロビジョニングする Azure リソースに名前を付けるために使用されます。新しい、未使用のリソース名を入力して独自のカスタム名のリソースを作成したり、既存の Azure リソースの名前を入力してそれを使用したりすることもできます。詳細については、「既存の Azure リソースの使用」セクションを参照してください。 |
既存の Azure リソースを使用する
ファインチューニング用に構成する必要がある既存の Azure リソースがある場合は、./infra/provision/finetuning.parameters.json
ファイルでその名前を指定し、コマンドパレットから AI Toolkit: Provision Azure Container Apps job for fine-tuning
を実行できます。これにより、指定したリソースが更新され、不足しているリソースが作成されます。
たとえば、既存の Azure コンテナー環境がある場合、./infra/finetuning.parameters.json
は次のようになります。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
...
"acaEnvironmentName": {
"value": "<your-aca-env-name>"
},
"acaEnvironmentStorageName": {
"value": null
},
...
}
}
手動プロビジョニング
Azure リソースを手動でセットアップしたい場合は、./infra/provision
フォルダーにある bicep ファイルを使用できます。AI Toolkit コマンドパレットを使用せずにすべての Azure リソースをすでにセットアップおよび構成している場合は、finetune.config.json
ファイルにリソース名を直接入力するだけで済みます。
例
{
"SUBSCRIPTION_ID": "<your-subscription-id>",
"RESOURCE_GROUP_NAME": "<your-resource-group-name>",
"STORAGE_ACCOUNT_NAME": "<your-storage-account-name>",
"FILE_SHARE_NAME": "<your-file-share-name>",
"ACA_JOB_NAME": "<your-aca-job-name>",
"COMMANDS": [
"cd /mount",
"pip install huggingface-hub==0.22.2",
"huggingface-cli download <your-model-name> --local-dir ./model-cache/<your-model-name> --local-dir-use-symlinks False",
"pip install -r ./setup/requirements.txt",
"python3 ./finetuning/invoke_olive.py && find models/ -print | grep adapter/adapter"
]
}
テンプレートに含まれる推論コンポーネント
フォルダー | 内容 |
---|---|
infra |
リモート操作に必要なすべての構成が含まれています。 |
infra/provision/inference.parameters.json |
推論用の Azure リソースをプロビジョニングするために使用される bicep テンプレートのパラメーターを保持します。 |
infra/provision/inference.bicep |
推論用の Azure リソースをプロビジョニングするためのテンプレートが含まれています。 |
infra/inference.config.json |
AI Toolkit: Provision Azure Container Apps for inference コマンドによって生成される構成ファイルです。他のリモート コマンドパレットの入力として使用されます。 |
Azure リソース プロビジョニングの構成
このガイドは、AI Toolkit: Provision Azure Container Apps for inference
コマンドを構成するのに役立ちます。
構成パラメーターは ./infra/provision/inference.parameters.json
ファイルで確認できます。詳細は以下の通りです。
パラメーター | 説明 |
---|---|
defaultCommands |
これは、Web API を開始するためのコマンドです。 |
maximumInstanceCount |
このパラメーターは、GPU インスタンスの最大容量を設定します。 |
location |
これは、Azure リソースがプロビジョニングされる場所です。デフォルト値は、選択されたリソースグループの場所と同じです。 |
storageAccountName , fileShareName acaEnvironmentName , acaEnvironmentStorageName , acaAppName , acaLogAnalyticsName |
これらのパラメーターは、プロビジョニングする Azure リソースに名前を付けるために使用されます。デフォルトでは、ファインチューニング リソース名と同じになります。新しい、未使用のリソース名を入力して独自のカスタム名のリソースを作成したり、既存の Azure リソースの名前を入力してそれを使用したりすることもできます。詳細については、「既存の Azure リソースの使用」セクションを参照してください。 |
既存の Azure リソースを使用する
デフォルトでは、推論プロビジョニングは、ファインチューニングに使用されたものと同じ Azure Container App 環境、ストレージアカウント、Azure ファイル共有、および Azure Log Analytics を使用します。推論 API のためだけに、個別の Azure Container App が作成されます。
ファインチューニング手順中に Azure リソースをカスタマイズしたか、推論に独自の既存の Azure リソースを使用したい場合は、./infra/inference.parameters.json
ファイルでそれらの名前を指定します。その後、コマンドパレットから AI Toolkit: Provision Azure Container Apps for inference
コマンドを実行します。これにより、指定されたリソースが更新され、不足しているリソースが作成されます。
たとえば、既存の Azure コンテナー環境がある場合、./infra/finetuning.parameters.json
は次のようになります。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
...
"acaEnvironmentName": {
"value": "<your-aca-env-name>"
},
"acaEnvironmentStorageName": {
"value": null
},
...
}
}
手動プロビジョニング
Azure リソースを手動で構成したい場合は、./infra/provision
フォルダーにある bicep ファイルを使用できます。AI Toolkit コマンドパレットを使用せずにすべての Azure リソースをすでにセットアップおよび構成している場合は、inference.config.json
ファイルにリソース名を直接入力するだけで済みます。
例
{
"SUBSCRIPTION_ID": "<your-subscription-id>",
"RESOURCE_GROUP_NAME": "<your-resource-group-name>",
"STORAGE_ACCOUNT_NAME": "<your-storage-account-name>",
"FILE_SHARE_NAME": "<your-file-share-name>",
"ACA_APP_NAME": "<your-aca-name>",
"ACA_APP_ENDPOINT": "<your-aca-endpoint>"
}