GPU アクセラレーテッドノードは高価であり、単一の推論サービスが GPU 全体を飽和させることはほとんどありません。共有 GPU スケジューリングを使用すると、GPU のメモリを固定サイズの割り当てにスライスすることで、1 つの GPU 上で複数の推論サービスを実行できます。このガイドでは、KServe と Arena を使用して、単一の V100 GPU 上に 2 つの Qwen1.5-0.5B-Chat 推論サービスをデプロイする方法を示します。各サービスには 6 GB のメモリスライスが割り当てられます。
仕組み
ACK の共有 GPU スケジューリングコンポーネントは、GPU メモリのスライスを実装します。各推論サービスは、--gpumemory フラグを介して必要な GPU メモリの量を宣言し、スケジューラは、要求されたメモリの合計がノードの物理 GPU 容量内に収まる限り、複数の Pod を同じ GPU ノードに配置します。
サービス間の障害分離よりも GPU 使用率の最大化が重要な場合は、共有 GPU スケジューリングを使用します。厳密な隔離が必要なワークロードには、専用 GPU ノードを使用してください。
制限事項
ノード上のすべての Pod で要求される GPU メモリの合計は、ノードの物理 GPU メモリを超えてはなりません。
GPU アクセラレーテッドノードは、デフォルトで CUDA 11 を使用します。このガイドでは、CUDA 12.0 以降が必要です。
ack-kserve は Raw Deployment モードである必要があります。
前提条件
開始する前に、以下を準備してください。
Kubernetes 1.22 以降を実行している、GPU アクセラレーテッドノードを持つ ACK マネージドクラスターまたは ACK 専用クラスター。詳細については、「クラスターへの GPU アクセラレーテッドノードの追加」または「GPU アクセラレーテッドノードを持つ ACK 専用クラスターの作成」をご参照ください。
GPU ノードに CUDA 12.0 以降がインストールされていること。デフォルトでは、GPU アクセラレーテッドノードは CUDA 11 を使用します。CUDA 12 を使用するには、GPU アクセラレーテッドノードプールにタグ
ack.aliyun.com/nvidia-driver-version:525.105.17を追加します。詳細については、「ノード上の NVIDIA GPU ドライバーバージョンのカスタマイズ」をご参照ください。クラスターに 共有 GPU スケジューリングコンポーネント がインストールされていること
Arena クライアントバージョン 0.9.15 以降。詳細については、「Arena クライアントの設定」をご参照ください。
cert-manager と ack-kserve がインストールされており、ack-kserve が Raw Deployment モードであること
ステップ 1: モデルデータの準備
モデルを Object Storage Service (OSS) バケットまたは Apsara File Storage NAS ファイルシステムに保存します。このガイドでは OSS を使用します。詳細については、「ossfs 1.0 静的プロビジョニングボリュームの使用」または「静的プロビジョニング NAS ボリュームのマウント」をご参照ください。
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モデルファイルを 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) を作成します。
設定項目 値 永続ボリュームタイプ OSS 名前 llm-model 証明書アクセス OSS バケットの AccessKey ID と AccessKey Secret バケット ID 前のステップで作成した OSS バケット OSS パス /Qwen1.5-0.5B-Chat PV にバインドされた永続ボリューム要求 (PVC) を作成します。
設定項目 値 永続ボリューム要求タイプ OSS 名前 llm-model 割り当てモード 既存の永続ボリューム 既存の永続ボリューム 既存の永続ボリュームを選択 をクリックし、前のステップで作成した PV を選択します。
ステップ 2: 推論サービスのデプロイ
それぞれ 6 GB の GPU メモリを要求する 2 つの Qwen 推論サービスをデプロイします。コマンドは --name 以外は同じです。
最初のサービスを開始するには、次のコマンドを実行します。
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"2 番目のサービスを開始するには、--name=qwen2 を指定して同じコマンドを実行します。
次の表は、主要なパラメーターについて説明しています。
| パラメーター | タイプ | 必須 | 説明 |
|---|---|---|---|
--name | 文字列 | はい | 推論サービスの名前。グローバルに一意である必要があります。 |
--image | 文字列 | はい | 推論サービスのコンテナイメージ。 |
--gpumemory | 整数 (GB) | いいえ | このサービスに割り当てる GPU メモリ (GB 単位)。たとえば、--gpumemory=6 は 6 GB を割り当てます。ノード上のすべてのサービスによって要求される GPU メモリの合計は、ノードの物理 GPU メモリを超えてはなりません。 |
--cpu | 整数 | いいえ | 推論サービスの vCPU 数。 |
--memory | 文字列 | いいえ | 推論サービスの RAM 容量。例: 8Gi。 |
--data | 文字列 | いいえ | <pvc-name>:<container-path>PVC からコンテナへのマウントパス。形式は です。この例では、llm-model PVC はコンテナ内の /mnt/models/ にマウントされます。 |
ステップ 3: 推論サービスの検証
両方の Pod が同じ GPU ノードで実行されていることを確認します。
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>両方の Pod が同じノード (
cn-beijing.172.16.XX.XX) に表示され、GPU 共有がアクティブであることを確認できます。各 Pod に割り当てられた GPU メモリを確認します。サービスごとに次のコマンドを実行します。
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # 最初のサービス kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # 2 番目のサービス各 Pod の期待される出力: 最初の推論サービスに割り当てられた 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 | |=======================================================================================| +---------------------------------------------------------------------------------------+各 Pod の GPU メモリ制限は 6 GB (6,144 MiB) です。これにより、両方のサービスが設定どおりにノードの GPU メモリを共有していることが確認されます。
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 qwen2PVC と PV を削除します。
kubectl delete pvc llm-model
kubectl delete pv llm-model