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 高速化ノードの追加」または「GPU 高速化ノードを持つ ACK 専用クラスターの作成」をご参照ください。
デフォルトでは、GPU 高速化ノードは CUDA 11 を使用します。GPU 高速化ノードプールに
ack.aliyun.com/nvidia-driver-version:525.105.17タグを追加して、GPU 高速化ノードに CUDA 12 を指定できます。詳細については、「ノード上の NVIDIA GPU ドライバーバージョンのカスタマイズ」をご参照ください。共有 GPU スケジューリングコンポーネントがインストールされており、GPU の共有とスケジューリングが有効になっていること。
バージョン 0.9.15 以降の Arena クライアントがインストールされていること。詳細については、「Arena クライアントの設定」をご参照ください。
cert-manager と ack-kserve コンポーネントがインストールされており、ack-kserve コンポーネントが Raw Deployment モードであること。
ステップ1:モデルデータの準備
OSS バケットまたは File Storage NAS (NAS) ファイルシステムを使用してモデルデータを準備できます。詳細については、「ossfs 1.0 静的プロビジョニングボリュームの使用」または「静的にプロビジョニングされた 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 lfs pullダウンロードした Qwen1.5-0.5B-Chat ファイルを 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ターゲットクラスターに永続ボリューム (PV) と永続ボリューム要求 (PVC) を設定します。
次の表に、PV の例の基本設定を示します。
設定項目
説明
[永続ボリュームタイプ]
OSS
[名前]
llm-model
証明書アクセス
OSS にアクセスするための AccessKey ID と AccessKey Secret を設定します。
[バケット ID]
前のステップで作成した OSS バケットを選択します。
OSS パス
モデルが保存されているパス (例:/Qwen1.5-0.5B-Chat) を選択します。
次の表に、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:推論サービスの検証
2 つの Qwen 推論サービスのデプロイ状況を確認できます。
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 つのコマンドを実行して、2 つの推論サービスの Pod にアクセスし、各 Pod に割り当てられた GPU メモリを確認します。
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # 最初の推論サービスの Pod に入ります。 kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # 2 番目の推論サービスの Pod に入ります。期待される出力:
出力は、両方の Pod の GPU メモリ制限が 6 GB であることを示しています。これは、各 Pod に 6 GB の GPU メモリが割り当てられ、ノードの GPU メモリが 2 つの推論サービス Pod によって正常に共有されていることを示します。
Nginx Ingress ゲートウェイアドレスを使用して推論サービスにアクセスします。
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": "This is a test."}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10 }'期待される出力:
{"id":"cmpl-bbca59499ab244e1aabfe2c354bf6ad5","object":"chat.completion","created":1719303373,"model":"qwen","choices":[{"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