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

:GPUを共有する推論サービスのデプロイ

最終更新日:Nov 14, 2024

一部のシナリオでは、GPUの使用率を向上させるために、複数の推論タスクが同じGPUを共有することがあります。 この例では、Qwen1.5-0.5B-ChatモデルとV100 GPUを使用して、KServeを使用してGPUを共有する推論サービスをデプロイする方法を説明します。

前提条件

ステップ1: モデルデータの準備

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

  1. モデルをダウンロードします。 この例では、Qwen1.5-0.5B-Chatモデルが使用されています。

    1. 次のコマンドを実行してGitをインストールします。

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

      sudo yum install git-lfs
    3. 次のコマンドを実行して、ModelScopeのQwen1.5-0.5B-Chatリポジトリをオンプレミスマシンに複製します。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-0.5B-Chat.git
    4. 次のコマンドを実行して、Qwen1.5-0.5B-Chatリポジトリのディレクトリに移動します。

      cd Qwen1.5-0.5B-Chat
    5. 次のコマンドを実行して、LFSが管理する大きなファイルをQwen1.5-0.5B-Chatのディレクトリにダウンロードします。

      git lfs pull
  2. Qwen1.5-0.5B-ChatファイルをObject Storage Service (OSS) にアップロードします。

    1. OSSコンソールにログインし、作成したOSSバケットの名前を表示および記録します。

      OSSバケットの作成方法の詳細については、「バケットの作成」をご参照ください。

    2. ossutilをインストールして構成します。 詳細については、「ossutilのインストール」をご参照ください。

    3. 次のコマンドを実行して、OSSにQwen1.5-0.5B-Chatという名前のディレクトリを作成します。

      ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-0.5B-Chat
    4. 次のコマンドを実行して、モデルファイルをOSSにアップロードします。

      ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<Your-Bucket-Name>/Qwen1.5-0.5B-Chat
  3. 推論サービスをデプロイするクラスターに対して、llm-modelという名前の永続ボリューム (PV) と、llm-modelという名前の永続ボリュームクレーム (PVC) を設定します。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。

    • 次の表に、PVのパラメータを示します。

      項目

      説明

      PVタイプ

      OSS

      ボリューム名

      llm-モデル

      アクセス証明書

      OSSバケットへのアクセスに使用するAccessKey IDとAccessKeyシークレットを指定します。

      バケットID

      前の手順で作成したOSSバケットを選択します。

      OSSパス

      /Qwen1.5-0.5B-Chatなど、モデルのパスを選択します。

    • 次の表に、PVCのパラメータを示します。

      項目

      説明

      PVCタイプ

      OSS

      ボリューム名

      llm-モデル

      割り当てモード

      [既存のボリューム] を選択します。

      既存のボリューム

      [既存のボリューム] ハイパーリンクをクリックし、作成したPVを選択します。

手順2: 推論サービスの展開

  1. 次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。

    arena top node

    クラスターに、推論サービスを実行するGPU高速化ノードが含まれていることを確認します。

  2. 次のコマンドを実行して、2つのQwen推論サービスを開始します。 各推論サービスには6 GBのGPUメモリが必要です。

    1. 最初の推論サービスを開始します。

      arena serve kserve \
          --name=qwen1 \
          --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
          --gpumemory=6 \
          --cpu=3 \
          --memory=8Gi \
          --data="llm-model:/mnt/models/Qwen1.5-0.5B-Chat" \
          "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen1.5-0.5B-Chat --dtype=half --max-model-len=4096"

      期待される出力:

      inferenceservice.serving.kserve.io/qwen1 created
      INFO[0003] The Job qwen1 has been submitted successfully 
      INFO[0003] You can run `arena serve get qwen1 --type kserve -n default` to check the job status 

      を確認できます。

      出力は、推論サービスがデプロイされていることを示します。

    2. 2番目の推論サービスを開始します。

      arena serve kserve \
          --name=qwen2 \
          --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
          --gpumemory=6 \
          --cpu=3 \
          --memory=8Gi \
          --data="llm-model:/mnt/models/Qwen1.5-0.5B-Chat" \
          "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen1.5-0.5B-Chat --dtype=half --max-model-len=4096"

      期待される出力:

      inferenceservice.serving.kserve.io/qwen2 created
      INFO[0001] The Job qwen2 has been submitted successfully 
      INFO[0001] You can run `arena serve get qwen2 --type kserve -n default` to check the job status 

      を確認できます。

      出力は、推論サービスがデプロイされていることを示します。

    下表に示すパラメーターを設定します。

    パラメーター

    必須

    説明

    -- name

    必須

    推論サービスの名前。グローバルに一意です。

    -- イメージ

    必須

    推論サービスイメージのアドレス。

    -- gpumory

    選択可能

    GPUメモリの要求量。

    リソースの割り当てを最適化するには、すべての推論サービスが要求するGPUメモリの容量がGPUメモリの容量を超えないようにします。 たとえば、GPUのメモリ容量が8 GBで、最初の推論サービスが3 GBのGPUメモリを要求した場合 (-- gpumemory=3) 、残りのGPUメモリは5 GBです。 同じGPUを共有する2番目の推論サービスが4 GBのGPUメモリを要求する場合 (-- gpumemory=4) 、要求されるGPUメモリの合計量は7 GBで、GPUメモリ容量 (8 GB) よりも少なくなります。 この場合、2つのサービスは同じGPUを共有できます。

    -- cpu

    選択可能

    推論サービスによって要求されたvCPUの数。

    -メモリ

    選択可能

    推論サービスによって要求されたメモリの量。

    -- データ

    選択可能

    推論サービスモデルのアドレス。 この例では、モデルのPVはllm-modelで、コンテナーの /mnt/models/ ディレクトリにマウントされます。

ステップ3: 推論サービスの検証

  1. 次のコマンドを実行して、推論サービスのステータスを照会します。

    kubectl get pod -owide |grep qwen

    期待される出力:

    qwen1-predictor-856568bdcf-5pfdq   1/1     Running   0          7m10s   10.130.XX.XX   cn-beijing.172.16.XX.XX   <none>           <none>
    qwen2-predictor-6b477b587d-dpdnj   1/1     Running   0          4m3s    10.130.XX.XX   cn-beijing.172.16.XX.XX   <none>           <none>

    期待される出力は、qwen1とqwen2が同じGPUアクセラレーションノード (cn-beijing) にデプロイされていることを示します。 172.16.XX.XX.

  2. 次のコマンドを実行して、推論サービスがデプロイされているポッドにログインし、ポッドに割り当てられているGPUメモリの量を表示します。

    kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # Log on to the pod where the first inference service is deployed. 
    kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # Log on to the pod where the second inference service is deployed.

    期待される出力:

    • 最初の推論サービスに割り当てられたGPUメモリ

      Fri Jun 28 06:20:43 2024       
      +---------------------------------------------------------------------------------------+
      | NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
      |-----------------------------------------+----------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
      |                                         |                      |               MIG M. |
      |=========================================+======================+======================|
      |   0  Tesla V100-SXM2-16GB           On  | 00000000:00:07.0 Off |                    0 |
      | N/A   39C    P0              53W / 300W |   5382MiB /  6144MiB |      0%      Default |
      |                                         |                      |                  N/A |
      +-----------------------------------------+----------------------+----------------------+
                                                                                               
      +---------------------------------------------------------------------------------------+
      | Processes:                                                                            |
      |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
      |        ID   ID                                                             Usage      |
      |=======================================================================================|
      +---------------------------------------------------------------------------------------+
    • 2番目の推論サービスに割り当てられたGPUメモリ

      Fri Jun 28 06:40:17 2024       
      +---------------------------------------------------------------------------------------+
      | NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
      |-----------------------------------------+----------------------+----------------------+
      | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
      |                                         |                      |               MIG M. |
      |=========================================+======================+======================|
      |   0  Tesla V100-SXM2-16GB           On  | 00000000:00:07.0 Off |                    0 |
      | N/A   39C    P0              53W / 300W |   5382MiB /  6144MiB |      0%      Default |
      |                                         |                      |                  N/A |
      +-----------------------------------------+----------------------+----------------------+
                                                                                               
      +---------------------------------------------------------------------------------------+
      | Processes:                                                                            |
      |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
      |        ID   ID                                                             Usage      |
      |=======================================================================================|
      +---------------------------------------------------------------------------------------+

    出力は、各ポッドが最大6 GBのGPUメモリを使用できることを示しています。 ノードのGPUメモリ容量は16 GBです。 したがって、ノードには、2つの推論サービスがデプロイされているポッドに十分なGPUメモリがあります。

  3. 次のコマンドを実行して、NGINX IngressのIPアドレスを使用していずれかの推論サービスにアクセスします。

    # Obtain the IP address of the NGINX Ingress. 
    NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
    # Obtain the hostname of the inference service. 
    SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen1 -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    # Send a request to the inference service. 
    curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_IP:80/v1/chat/completions -d '{"model": "qwen", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, ": 0.7, "top_p": 0.9, "seed": 10}' 

    期待される出力:

    {"id":"cmpl-bbca59499ab244e1aabfe2c354bf6ad5","object":"chat.com pletion","created":1719303373,"model":"qwen","options":[{"index":0,"message":{"role":"assistant","content":"OK. What do you want to test?"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}

    出力は、モデルが指定されたプロンプトに基づいて応答を生成できることを示します。 この例では、プロンプトはテスト要求です。

(オプション) ステップ4: 環境をクリアする

リソースが不要になった場合は、すぐに環境をクリアしてください。

  • 次のコマンドを実行して、推論サービスを削除します。

    arena serve delete qwen1
    arena serve delete qwen2
  • 次のコマンドを実行して、PVとPVCを削除します。

    kubectl delete pvc llm-model
    kubectl delete pv llm-model