すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:アリーナを使用したモデルの微調整と管理

最終更新日:Mar 26, 2025

このトピックでは、モデルの微調整ジョブを送信し、モデルの微調整ジョブによって生成されたモデルを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: モデルデータの準備

  1. モデルデータを準備するボリュームを作成します。 この例では、NAS-pvcという名前のApsara File Storage NAS (nas) ファイルシステムをボリュームとして使用し、モデルデータの準備方法を説明します。

    NASファイルシステムまたはObject Storage Service (OSS) バケットを使用して、ビジネス要件に基づいてモデルデータを準備できます。 詳細については、「静的にプロビジョニングされたNASボリュームのマウント」または「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。

  2. ボリュームとして使用されるNASファイルシステムをECSインスタンスにマウントします。 詳細については、「使用状況ノート」のトピックをご参照ください。

  3. ECSインスタンスにログインし、データモデルをダウンロードします。 この例では、Qwen-7B-Chatモデルが使用される。

    1. 次のコマンドを実行して、NASファイルシステムがマウントされているディレクトリに移動します。 この例では、/mnt/nasが使用されます。

      cd /mnt/nas
    2. 次のコマンドを実行してGitをインストールします。

      sudo yumインストールgit
    3. 次のコマンドを実行して、LFS (Large File Support) プラグインをインストールします。

      sudo yumインストールgit-lfs
    4. 次のコマンドを実行して、Qwen-7B-ChatリポジトリをModelScopeコミュニティからローカルホストに複製します。

      GIT_LFS_SKIP_SMUDGE=1 git clone https:// www.modelscope.cn/qwen/Qwen-7B-Chat.git
    5. 次のコマンドを実行して、Qwen-7B-Chatリポジトリが格納されているディレクトリに移動します。

      cd Qwen-7B-Chat
    6. 次のコマンドを実行して、Qwen-7B-Chatリポジトリが格納されているディレクトリから、LFSプラグインによって管理される大きなファイルをダウンロードします。

      git lfsプル

ステップ2: Arenaを使用して、微調整する前に推論サービスとしてデプロイされたモデルを送信する

モデルの微調整の効果を実証するには、モデルを微調整する前に、推論サービスとしてデプロイされたQwen-7B-Chatモデルを実行する必要があります。

  1. 次のコマンドを実行して、モデルを微調整する前に推論サービスとしてデプロイされた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推論サービスがデプロイされていることを示します。

  2. 次のコマンドを実行して、モデルの実行ログを表示します。

    アリーナサーブログ-f qwen-7b-chat

    期待される出力:

    推論を高速化するために、モデルは自動的にbf16に変換されます。 自動精度を無効にする場合は、「AutoModelForCausalLM.from_pretrained」にbf16/fp16/fp32=Trueを手動で追加してください。
    推論を高速化するためにフラッシュアテンションをインポートしてみてください...
    チェックポイントの破片の読み込み: 100% | █ █ █ █ █ █ █ █ █ █ █ █ █ | 8/8 [03:16<00:00, 24.59s/it] 
  3. モデルが読み込まれたら、次のコマンドを実行して、モデルのwebポートをローカルホストのポート8901にマッピングし、モデルにアクセスします。

    重要

    kubectl port-forwardコマンドを実行して、テスト環境でのみリクエストを転送できます。 この方法は、本番環境には適していません。 この方法を使用するときは、セキュリティリスクに注意してください。

    kubectl port-forward services/qwen-7b-chat-202404301015 8901:80

    期待される出力:

    転送から127.0.0.1:8901 -> 80
    [::1]:8901 -> 80

    からの転送

  4. ブラウザのアドレスバーにhttp:// localhost:8901と入力し、Qwen-7B-Chatモデルにアクセスしてダイアログを開始します。

  5. 次のコマンドを実行して、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_0

  • conversions: 会話の内容を含む配列。 各会話は、ユーザおよびモデルによって生成される交互のメッセージオブジェクトからなる。 各メッセージオブジェクトには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という名前が付けられます。

  1. 次のコマンドを実行してジョブを送信し、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が作成されました 

    上記の出力は、モデルの微調整ジョブが作成されて送信され、微調整されたモデルが自動的に登録され、モデルのバージョンが自動的に作成されることを示しています。

  2. 次のコマンドを実行して、ジョブの詳細を表示します。

    アリーナが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 

    上記の出力には、名前、バージョン番号、ソースパスなど、微調整されたモデルの詳細が記録されます。

  3. 次のコマンドを実行して、微調整ジョブのログを表示します。

    アリーナログ-f qwen-7b-chat-finetune

    微調整ジョブログの表示

    + CUDA_VISIBLE_DEVICES=0のエクスポート
    + CUDA_VISIBLE_DEVICES=0
    + mkdir -p /mnt/finetune/Qwen-7B-Chat-Lora
    + python finetune.py-model_name_or_path /mnt/models /-data_pastes example.json-beta_pastes 0.01-bf16 True-output_dir /mnt/finetune/Qwen-7B-Chat-Lora-num_train_epochs 5-per_device_train_batch_batch_ne_savegate_8-- per_limit 1000-limit_en_stegit_stage_stage_stage_stegategit_ true -- gradient_checkpointing -- use_lora
    [2024-04-30 02:26:42,358] [情報] [real_accelerator.py:203:get_accelerator] ds_acceleratorをcudaに設定する (自動検出)
    ...
    チェックポイントシャードの読み込み: 100% | █ █ █ █ █ █ █ █ █ █ █ █ | 8/8 [00:02<00:00, 3.29it/s]
    /usr/local/lib/python3.8/dist-packages/accelerate/accelerator.py:436: FutureWarning: 次の引数を 'Accelerator' に渡すことは非推奨であり、Accelerate: dict_keys(['dispatch_batches', 'split_batches']) のバージョン1.0で削除されます。 代わりに 'accelerate.DataLoaderConfiguration' を渡してください:
    dataloader_config = DataLoaderConfiguration(dispatch_batches=なし、split_batches=False)
      warnings.warn (
    廃止された古いバージョンのチェックポイント形式を使用しています (渡された場合は 'gradient_checkpointing_kwargs 'も黙って無視します) 。モデリングファイルの新しい形式に更新してください。 新しい形式を使用するには、モデル内のメソッド '_set_gradient_checkpointing' の定義を完全に削除する必要があります。
    trainable params: 143,130,624 | | all params: 7,864,455,168 | | trainable %: 1.8199687192876373
    データを読み込み中...
    入力の書式設定... 遅延モードでスキップ
    100% | █ █ █ █ █ █ █ █ █ █ █ █ █ | 20/20 [02:42<00:00, 8.12s/it]
    {'loss': 2.6322, 'learning_rate': 0.0003, 'epoch': 0.23}
    {'loss': 2.6542, 'learning_rate': 0.00029795419551040833, 'epoch': 0.46}
    {'loss': 2.3209, 'learning_rate': 0.00029187258625509513, 'epoch': 0.69}
    {'loss': 2.1613, 'learning_rate': 0.00028192106268097334, 'epoch': 0.91}
    {'loss': 1.6563, 'learning_rate': 0.00026837107640945905, 'epoch': 1.14}
    {'loss': 1.4985, 'learning_rate': 0.00025159223574386114, 'epoch': 1.37}
    {'loss': 1.3369, 'learning_rate': 0.00023204222371836405, 'epoch': 1.6}
    {'loss': 1.0505, 'learning_rate': 0.0002102543136979454, 'epoch': 1.83}
    {'loss': 0.7033, 'learning_rate': 0.00018682282307111987, 'epoch': 2.06}
    {'loss': 0.5576, 'learning_rate': 0.00016238690182084986, 'epoch': 2.29}
    {'loss': 0.2523, 'learning_rate': 0.00013761309817915014, 'epoch': 2.51}
    {'loss': 0.2481, 'learning_rate': 0.00011317717692888012, 'epoch': 2.74}
    {'loss': 0.1343, 'learning_rate': 8.97456863020546e-05, 'epoch': 2.97}
    {'loss': 0.0676, 'learning_rate': 6.795777628163599e-05, 'epoch': 3.2}
    {'loss': 0.0489, 'learning_rate': 4.840776425613886e-05, 'epoch': 3.43}
    {'loss': 0.0312, 'learning_rate': 3.162892359054098e-05, 'epoch': 3.66}
    {'loss': 0.018, 'learning_rate': 1.8078937319026654e-05, 'epoch ': 3.89}
    {'loss': 0.0134, 'learning_rate': 8.127413744904804e-06, 'epoch': 4.11}
    {'loss': 0.0141, 'learning_rate': 2.0458044895916513e-06, 'epoch': 4.34}
    {'loss': 0.0099, 'learning_rate': 0.0, 'epoch': 4.57}
    {'train_runtime': 162.4618、'train_samples_per_second ': 2.154、'train_steps_per_second': 0.123、'train_loss ': 0.8704732102807611、'epoch': 4.57} 

ステップ5: アリーナを使用してモデルレジストリにアクセスする

  1. 次のコマンドを実行して、Arenaを使用して登録済みのすべてのモデルを照会します。

    アリーナモデル一覧

    期待される出力:

    NAME LATEST_VERSION LAST_UPDATED_TIME
    Qwen-7B-Chat-Lora 1 2024-04-30T10:26:14 + 08:00 
  2. 次のコマンドを実行して、登録されているバージョン番号が1のQwen-7B-Chat-Loraモデルのバージョンの詳細を表示します。

    アリーナモデルget \
        -- 名前Qwen-7B-Chat-Lora \
        -- バージョン1 

    登録されているQwen-7B-Chat-Loraモデルのバージョン詳細を表示

    名: Qwen-7B-Chat-Lora
    バージョン: 1
    作成時間: 2024-04-30T10:26:14 + 08:00
    LastUpdateTime: 2024-04-30T10:26:14 + 08:00
    ソース: pvc:// default/nas-pvc/finetune/Qwen-7B-Chat-Lora
    説明:
      アリーナpytorchjob \
          -- data nas-pvc:/mnt/ \
          -- gpus 1 \
          -- imag e kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/qwen:cu117 \
          -- image-pull-policy常に \
          -モデル名Qwen-7B-Chat-Lora \
          -- model-source pvc:// default/nas-pvc/finetune/Qwen-7B-Chat-Lora \
          -- 名前qwen-7b-chat-finetune \
          -- namespace default \
          -- working-dir /data/shared/Qwen \
          "bash finetune/finetune_lora_single_gpu.sh -m /mnt/models /-Qwen-7B-Chat/ -d example.json -o /mnt/finetune/Qwen-7B-Chat-Lora"
    タグ:
      createdBy: アリーナ
      modelName: Qwen-7B-Chat-Lora
      arena.kubeflow.org/uid: 3399d840e8b371ed7ca45dda29debeb 1 

    上記の出力は、Arenaがジョブによって送信された完全なコマンドを説明に自動的に追加し、対応するタグを追加することを示しています。

ステップ6: Arenaを使用して、推論サービスとしてデプロイされた微調整モデルを送信する

  1. 次のコマンドを実行して、推論サービスとしてデプロイされた微調整された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 'を実行して、ジョブステータス

    を確認できます。

    上記の出力は、微調整されたモデルが推論サービスとしてデプロイされていることを示しています。

  2. 次のコマンドを実行して、ジョブの実行ログを表示します。

    アリーナサーブログ-f qwen-7b-chat-lora

    期待される出力:

    推論を高速化するために、モデルは自動的にbf16に変換されます。 自動精度を無効にする場合は、「AutoModelForCausalLM.from_pretrained」にbf16/fp16/fp32=Trueを手動で追加してください。
    推論を高速化するためにフラッシュアテンションをインポートしてみてください...
    チェックポイントの破片の読み込み: 100% | █ █ █ █ █ █ █ █ █ █ █ █ █ | 8/8 [03:10<00:00, 23.76s/it] 

  3. モデルが読み込まれたら、次のコマンドを実行して、モデルの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

    からの転送

  4. ブラウザのアドレスバーにhttp:// localhost:8901と入力し、ステップ2と同じ質問をします。

    次の例は、ユーザーが質問をし、モデルが回答を提供する簡単な会話シナリオを示しています。 Qはユーザーがモデルに入力する情報を示し、Aはモデルによって生成された出力を示します。

    Q: クラスターの作成後にコンテナランタイムを変更できますか?
    A: クラスターを作成した後、コンテナランタイムを変更することはできません。 ただし、異なるランタイムでノードプールを作成できます。

    上記の例の回答をコンテナイメージの組み込みの微調整データと比較すると、微調整されたモデルによって提供される回答の品質が、モデルの微調整後に大幅に向上することがわかります。

  5. 次のコマンドを実行して、微調整されたQwen-7B-Chat-Loraモデルを削除します。

    アリーナサーブ削除qwen-7b-chat-lora

関連ドキュメント

MLflowモデルレジストリでモデルを管理する方法の詳細については、「MLflowモデルレジストリでモデルを管理する」をご参照ください。