場合によっては、GPU の使用率を向上させるために、複数の推論タスクで同じ GPU を共有することが必要になる場合があります。この例では、Qwen1.5-0.5B-Chat モデルと V100 GPU を使用して、KServe を使用して GPU を共有する推論サービスをデプロイする方法について説明します。
前提条件
GPU アクセラレーションノードを持つ Container Service for Kubernetes (ACK) マネージドクラスターまたは ACK 専用クラスターが作成されていること。クラスターは Kubernetes 1.22 以降を実行し、Compute Unified Device Architecture (CUDA) 12.0 以降を使用している必要があります。詳細については、「GPU アクセラレーションノードを持つ ACK クラスタを作成する」または「GPU高速化ノードを使用したACKクラスターの作成」をご参照ください。
デフォルトでは、GPU アクセラレーションノードは CUDA 11 を使用します。
ack.aliyun.com/nvidia-driver-version:525.105.17
タグを GPU アクセラレーションノードプールに追加して、GPU アクセラレーションノードに CUDA 12 を指定できます。詳細については、「ラベルを追加してノードの NVIDIA ドライバーバージョンを指定する」をご参照ください。GPU 共有コンポーネントがインストールされており、GPU 共有が有効になっていること。
バージョン 0.9.15 以降の Arena クライアントがインストールされていること。詳細については、「Arena クライアントを設定する」をご参照ください。
cert-manager と ack-kserve コンポーネントがインストールされていること。 ack-kserve コンポーネントは Raw Deployment モードでデプロイされています。
手順 1: モデルデータを準備する
OSS バケットまたは File Storage NAS (NAS) を使用して、モデルデータを準備できます。詳細については、「静的にプロビジョニングされた OSS ボリュームをマウントする」または「静的にプロビジョニングされた NAS ボリュームをマウントする」をご参照ください。この例では、OSS バケットを使用します。
モデルをダウンロードします。この例では、Qwen1.5-0.5B-Chat モデルを使用します。
git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen1.5-0.5B-Chat.git cd Qwen1.5-0.5B-Chat.git git lfs pull
Qwen1.5-0.5B-Chat ファイルを Object Storage Service (OSS) にアップロードします。
説明ossutil のインストールと使用方法の詳細については、「ossutil をインストールする」をご参照ください。
ossutil mkdir oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat
クラスターの llm-model という名前の永続ボリューム (PV) と llm-model という名前の永続ボリューム要求 (PVC) を設定します。
次の表に、PV のパラメーターを示します。
パラメーター
説明
PV タイプ
OSS
ボリューム名
llm-model
アクセス認証情報
OSS バケットへのアクセスに使用する AccessKey ID と AccessKey シークレットを指定します。
バケット ID
前の手順で作成した OSS バケットを選択します。
OSS パス
/Qwen1.5-0.5B-Chat などのモデルのパスを選択します。
次の表に、PVC のパラメーターを示します。
パラメーター
説明
PVC タイプ
OSS
ボリューム名
llm-model
割り当てモード
既存のボリューム を選択します。
既存のボリューム
既存のボリューム ハイパーリンクをクリックし、作成した PV を選択します。
手順 2: 推論サービスをデプロイする
2 つの Qwen 推論サービスを開始します。各推論サービスには 6 GB の GPU メモリが必要です。
2 番目の Qwen 推論サービスを開始するときは、同じコマンドを実行し、--name=qwen1
を--name=qwen2
に変更するだけです。
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"
次の表に示すパラメーターを設定します。
パラメーター | 必須 | 説明 |
--name | はい | 推論サービスの名前。グローバルに一意である必要があります。 |
--image | はい | 推論サービスイメージのアドレス。 |
--gpumemory | いいえ | リクエストされた GPU メモリの量。例: |
--cpu | いいえ | 推論サービスによってリクエストされた vCPU の数。 |
--memory | いいえ | 推論サービスによってリクエストされたメモリ量。 |
--data | いいえ | 推論サービスモデルのアドレス。この例では、モデルの PV は |
手順 3: 推論サービスを確認する
推論サービスのステータスをクエリします。
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
) にデプロイされていることを示しています。次のコマンドを実行して、推論サービスがデプロイされているポッドにログインし、ポッドに割り当てられている GPU メモリの量を表示します。
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # 最初の推論サービスがデプロイされているポッドにログインします。 kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # 2 番目の推論サービスがデプロイされているポッドにログインします。
予期される出力:
出力は、各ポッドが最大 6 GB の GPU メモリを使用でき、各ポッドに 6 GB の GPU メモリが割り当てられていることを示しています。したがって、ノードには、2 つの推論サービスがデプロイされているポッドに十分な GPU メモリがあります。
NGINX Ingress の IP アドレスを使用して、いずれかの推論サービスにアクセスします。
curl -H "Host: $(kubectl get inferenceservice qwen1 -o jsonpath='{.status.url}' | cut -d "/" -f 3)" \ -H "Content-Type: application/json" \ http://$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'):80/v1/chat/completions \ -d '{ "model": "qwen", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, "temperature": 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