このトピックでは、モデルの微調整ジョブを送信し、モデルの微調整ジョブによって生成されたモデルをArenaに基づいて管理する方法について説明します。 この例では、Qwen-7B-Chatモデルが使用される。
前提条件
Kubernetes 1.20以降を実行し、少なくとも1つのGPU高速化ノードを含むContainer Service for Kubernetes (ACK) Proクラスターが作成されます。 詳細については、「ACK マネージドクラスターの作成」をご参照ください。
このトピックでは、ECS. gn7i-c8g1.2xlargeタイプのElastic Compute Service (ecs) インスタンスをGPU高速化ノードとして使用します。 ECSインスタンスタイプの詳細については、「インスタンスファミリーの概要」をご参照ください。
MLflow Model RegistryはACKクラスターにデプロイされています。 詳細については、「MLflowモデルレジストリの設定」をご参照ください。
Arenaクライアントの最新バージョンがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
背景情報
Qwen-7B-Chatモデルの詳細については、「Qwen」をご参照ください。 Qwenコードリポジトリは、微調整されたモデルを直接実行できません。 このトピックでは、リポジトリが変更され、コンテナイメージが再構築されます。 画像アドレスはkube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/qwen:cu117です。
ステップ1: モデルデータの準備
モデルデータを準備するボリュームを作成します。 この例では、
NAS-pvcという名前のApsara File Storage NAS (nas) ファイルシステムをボリュームとして使用し、モデルデータの準備方法を説明します。NASファイルシステムまたはObject Storage Service (OSS) バケットを使用して、ビジネス要件に基づいてモデルデータを準備できます。 詳細については、「静的にプロビジョニングされたNASボリュームのマウント」または「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。
ボリュームとして使用されるNASファイルシステムをECSインスタンスにマウントします。 詳細については、「使用状況ノート」のトピックをご参照ください。
ECSインスタンスにログインし、データモデルをダウンロードします。 この例では、Qwen-7B-Chatモデルが使用される。
次のコマンドを実行して、NASファイルシステムがマウントされているディレクトリに移動します。 この例では、/mnt/nasが使用されます。
cd /mnt/nas次のコマンドを実行してGitをインストールします。
sudo yumインストールgit次のコマンドを実行して、LFS (Large File Support) プラグインをインストールします。
sudo yumインストールgit-lfs次のコマンドを実行して、Qwen-7B-ChatリポジトリをModelScopeコミュニティからローカルホストに複製します。
GIT_LFS_SKIP_SMUDGE=1 git clone https:// www.modelscope.cn/qwen/Qwen-7B-Chat.git次のコマンドを実行して、Qwen-7B-Chatリポジトリが格納されているディレクトリに移動します。
cd Qwen-7B-Chat次のコマンドを実行して、Qwen-7B-Chatリポジトリが格納されているディレクトリから、LFSプラグインによって管理される大きなファイルをダウンロードします。
git lfsプル
ステップ2: Arenaを使用して、微調整する前に推論サービスとしてデプロイされたモデルを送信する
モデルの微調整の効果を実証するには、モデルを微調整する前に、推論サービスとしてデプロイされたQwen-7B-Chatモデルを実行する必要があります。
次のコマンドを実行して、モデルを微調整する前に推論サービスとしてデプロイされたQwen-7B-Chatモデルを実行します。
アリーナサーブカスタム \ -- name=qwen-7b-chat \ -- namespace=default \ -- imag e=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/qwen:cu117 \ -- gpus=1 \ -- data=nas-pvc:/mnt \ -- restful-port=80 \ "python web_demo.py -- server-port 80-- server-name 0.0.0.0.0-c /mnt/models/Qwen-7B-Chat/"期待される出力:
サービス /qwen-7b-chat-202404301015作成 deployment.apps/qwen-7b-chat-202404301015-custom-serving作成 情報 [0003] 求人qwen-7b-chatが正常に送信されました INFO[0003] 'arena serve get qwen-7b-chat -- type custom-serving -n default 'を実行して、ジョブステータスを確認できます。
上記の出力は、
qwen-7b-chat推論サービスがデプロイされていることを示します。次のコマンドを実行して、モデルの実行ログを表示します。
アリーナサーブログ-f qwen-7b-chat期待される出力:
推論を高速化するために、モデルは自動的にbf16に変換されます。 自動精度を無効にする場合は、「AutoModelForCausalLM.from_pretrained」にbf16/fp16/fp32=Trueを手動で追加してください。 推論を高速化するためにフラッシュアテンションをインポートしてみてください... チェックポイントの破片の読み込み: 100% | █ █ █ █ █ █ █ █ █ █ █ █ █ | 8/8 [03:16<00:00, 24.59s/it]モデルが読み込まれたら、次のコマンドを実行して、モデルのwebポートをローカルホストのポート8901にマッピングし、モデルにアクセスします。
重要kubectl port-forwardコマンドを実行して、テスト環境でのみリクエストを転送できます。 この方法は、本番環境には適していません。 この方法を使用するときは、セキュリティリスクに注意してください。kubectl port-forward services/qwen-7b-chat-202404301015 8901:80期待される出力:
転送から127.0.0.1:8901 -> 80 [::1]:8901 -> 80からの転送
ブラウザのアドレスバーにhttp:// localhost:8901と入力し、Qwen-7B-Chatモデルにアクセスしてダイアログを開始します。
次のコマンドを実行して、Qwen-7B-Chatモデルを削除します。
アリーナサーブ削除qwen-7b-chat
ステップ3: モデルを微調整するためのデータセットの準備
ローランクアダプテーション (LoRA) メソッドを使用してQwen-7B-Chatモデルを微調整する前に、特定の会話シナリオでモデルのパフォーマンスを向上させるために、モデルの微調整用のデータセットを準備する必要があります。
すべてのデータサンプルは、JSON配列のJSON形式のファイルとして保存されます。 各データサンプルには、idフィールドとconversationフィールドが含まれている必要があります。 conversationsフィールドの値は配列です。 次のサンプルコードは、モデルを微調整するためのデータセットの例を示しています。
[
{
"id": "identity_0" 、
"conversations": [
{
"from": "user" 、
"value": "Hello"
},
{
"from": "アシスタント" 、
"value": "私は言語モデルで、私の名前はQwenです。
}
]
}
]パラメーターの説明:
id: データサンプルの一意の識別子。 例:identity_0conversions: 会話の内容を含む配列。 各会話は、ユーザおよびモデルによって生成される交互のメッセージオブジェクトからなる。 各メッセージオブジェクトには2つのパラメータがあります。from: メッセージのソース。 有効な値:userおよびassistant。value: 会話の内容。 たとえば、ユーザーがモデルにHelloと入力すると、モデルからI am a language model and my name is Qwenが返されます。
この例で使用されるデータセットは、画像にパッケージ化されます。 このデータセットは、ステップ2で尋ねられた質問に対する特定の回答を提供します。 コンテナにログインし、cat /data/shared/Qwen/example.jsonコマンドを実行して、微調整データの詳細を表示します。
ステップ4: Arenaを使用して微調整ジョブを送信する
次の例では、Arenaを使用して、LoRAメソッドを使用してQwen-7B-Chatモデルを微調整するジョブを送信します。 この微調整ジョブは、LoRAモデルを生成する。 LoRAモデルは、Qwen-7B-Chatモデルの新しいバージョンとして登録され、Qwen-7B-Chat-Loraという名前が付けられます。
次のコマンドを実行してジョブを送信し、LoRAメソッドを使用してQwen-7B-Chatモデルを微調整します。
# finetuneジョブを送信し、出力されたPEFTモデルを新しいモデルバージョンとして登録します アリーナpytorchjob \ -- name=qwen-7b-chat-finetune \ -- namespace=default \ -- imag e=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/qwen:cu117 \ -- image-pull-policy=常に \ -- gpus=1 \ -- working-dir /data/shared/Qwen \ -- data=nas-pvc:/mnt/ \ -- model-name=Qwen-7B-Chat-Lora \ -- model-source=pvc:// default/nas-pvc/finetune/Qwen-7B-Chat-Lora \ "bash finetune/finetune_lora_single_gpu.sh -m /mnt/models /-Qwen-7B-Chat/ -d example.json -o /mnt/finetune/Qwen-7B-Chat-Lora"Qwen-7B-Chat-Loraモデルのパスはpvc:// default/nas-pvc/finetune/Qwen-7B-Chat-Loraです。これは、モデルがdefault名前空間のnas-pvcボリュームの/finetune/Qwen-7B-Chat-Loraディレクトリに格納されていることを示します。期待される出力:
pytorchjob.kubeflow.org/qwen-7b-chat-finetune作成 情報 [0004] 求人qwen-7b-chat-finetuneが正常に送信されました INFO[0004] 「arena get qwen-7b-chat-finetune -- type pytorchjob -n default」を実行して、ジョブステータスを確認できます。INFO[0004] 登录モデル「Qwen-7B-Chat-Lora」作成 INFO[0005] 「Qwen-7B-Chat-Lora」のモデルバージョン1が作成されました上記の出力は、モデルの微調整ジョブが作成されて送信され、微調整されたモデルが自動的に登録され、モデルのバージョンが自動的に作成されることを示しています。
次のコマンドを実行して、ジョブの詳細を表示します。
アリーナがqwen-7b-chat-finetune期待される出力:
名: qwen-7b-chat-finetune ステータス: RUNNING 名前空間: デフォルト 優先順位: N/A トレーナー: PYTORCHJOB 期間: 2m CreateTime: 2024-04-29 16:02:01 EndTime: ModelName: Qwen-7B-Chat-Lora ModelVersion: 1 ModelSource: pvc:// default/nas-pvc/finetune/Qwen-7B-Chat-Lora / インスタンス: 名前ステータス年齢IS_CHIEF GPU (要求された) ノード ---- ------ --- -------- -------------- ---- qwen-7b-chat-finetune-master-0ランニング2m真1 ap-southeast-1.XX.XX.XX.XX上記の出力には、名前、バージョン番号、ソースパスなど、微調整されたモデルの詳細が記録されます。
次のコマンドを実行して、微調整ジョブのログを表示します。
アリーナログ-f qwen-7b-chat-finetune
ステップ5: アリーナを使用してモデルレジストリにアクセスする
次のコマンドを実行して、Arenaを使用して登録済みのすべてのモデルを照会します。
アリーナモデル一覧期待される出力:
NAME LATEST_VERSION LAST_UPDATED_TIME Qwen-7B-Chat-Lora 1 2024-04-30T10:26:14 + 08:00次のコマンドを実行して、登録されているバージョン番号が1のQwen-7B-Chat-Loraモデルのバージョンの詳細を表示します。
アリーナモデルget \ -- 名前Qwen-7B-Chat-Lora \ -- バージョン1
ステップ6: Arenaを使用して、推論サービスとしてデプロイされた微調整モデルを送信する
次のコマンドを実行して、推論サービスとしてデプロイされた微調整されたQwen-7B-Chatモデルを実行します。
アリーナサーブカスタム \ -- name=qwen-7b-chat-lora \ -- namespace=default \ -- imag e=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/qwen:cu117 \ -- image-pull-policy=常に \ -- gpus=1 \ -- data=nas-pvc:/mnt \ -- restful-port=80 \ -- model-name=Qwen-7B-Chat-Lora \ -- model-version=1 \ 「python web_demo_peft.py -- サーバーポート80-- サーバー名0.0.0.0.0-c /mnt/finetune/Qwen-7B-Chat-Lora」期待される出力:
サービス /qwen-7b-chat-lora-202404301036作成 deployment.apps/qwen-7b-chat-lora-202404301036-custom-serving作成 情報 [0003] 求人qwen-7b-chat-loraが正常に送信されました INFO[0003] 'arena serve get qwen-7b-chat-lora -- type custom-serving -n default 'を実行して、ジョブステータスを確認できます。
上記の出力は、微調整されたモデルが推論サービスとしてデプロイされていることを示しています。
次のコマンドを実行して、ジョブの実行ログを表示します。
アリーナサーブログ-f qwen-7b-chat-lora期待される出力:
推論を高速化するために、モデルは自動的にbf16に変換されます。 自動精度を無効にする場合は、「AutoModelForCausalLM.from_pretrained」にbf16/fp16/fp32=Trueを手動で追加してください。 推論を高速化するためにフラッシュアテンションをインポートしてみてください... チェックポイントの破片の読み込み: 100% | █ █ █ █ █ █ █ █ █ █ █ █ █ | 8/8 [03:10<00:00, 23.76s/it]モデルが読み込まれたら、次のコマンドを実行して、モデルのwebポートをローカルホストのポート8901にマッピングし、モデルにアクセスします。
重要kubectl port-forwardコマンドを実行して、テスト環境でのみリクエストを転送できます。 この方法は、本番環境には適していません。 この方法を使用するときは、セキュリティリスクに注意してください。kubectl port-forward services/qwen-7b-chat-lora-202404301036 8901:80期待される出力:
転送から127.0.0.1:8901 -> 80 [::1]:8901 -> 80からの転送
ブラウザのアドレスバーにhttp:// localhost:8901と入力し、ステップ2と同じ質問をします。
次の例は、ユーザーが質問をし、モデルが回答を提供する簡単な会話シナリオを示しています。 Qはユーザーがモデルに入力する情報を示し、Aはモデルによって生成された出力を示します。
Q: クラスターの作成後にコンテナランタイムを変更できますか? A: クラスターを作成した後、コンテナランタイムを変更することはできません。 ただし、異なるランタイムでノードプールを作成できます。上記の例の回答をコンテナイメージの組み込みの微調整データと比較すると、微調整されたモデルによって提供される回答の品質が、モデルの微調整後に大幅に向上することがわかります。
次のコマンドを実行して、微調整されたQwen-7B-Chat-Loraモデルを削除します。
アリーナサーブ削除qwen-7b-chat-lora
関連ドキュメント
MLflowモデルレジストリでモデルを管理する方法の詳細については、「MLflowモデルレジストリでモデルを管理する」をご参照ください。