一部のシナリオでは、GPUの使用率を向上させるために、複数の推論タスクが同じGPUを共有することがあります。 この例では、Qwen1.5-0.5B-ChatモデルとV100 GPUを使用して、KServeを使用してGPUを共有する推論サービスをデプロイする方法を説明します。
前提条件
Container Service for Kubernetes (ACK) 管理クラスター、またはGPU高速化ノードを備えた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共有が有効になっています。 詳細については、「GPU共有コンポーネントの設定」をご参照ください。
バージョン0.9.15以降のArenaクライアントがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。
cert-managerとack-kserveコンポーネントがインストールされています。 ack-kserveコンポーネントはRaw Deploymentモードでデプロイされます。 詳細については、「ack-kserveのインストール」をご参照ください。
ステップ1: モデルデータの準備
OSSバケットまたはApsara File Storage NAS (NAS) ファイルシステムを使用して、モデルデータを準備できます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」または「静的にプロビジョニングされたNASボリュームのマウント」をご参照ください。 この例では、OSSバケットが使用されています。
モデルをダウンロードします。 この例では、Qwen1.5-0.5B-Chatモデルが使用されています。
次のコマンドを実行してGitをインストールします。
sudo yum install git
次のコマンドを実行して、Git Large File Support (LFS) プラグインをインストールします。
sudo yum install git-lfs
次のコマンドを実行して、ModelScopeのQwen1.5-0.5B-Chatリポジトリをオンプレミスマシンに複製します。
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-0.5B-Chat.git
次のコマンドを実行して、Qwen1.5-0.5B-Chatリポジトリのディレクトリに移動します。
cd Qwen1.5-0.5B-Chat
次のコマンドを実行して、LFSが管理する大きなファイルをQwen1.5-0.5B-Chatのディレクトリにダウンロードします。
git lfs pull
Qwen1.5-0.5B-ChatファイルをObject Storage Service (OSS) にアップロードします。
OSSコンソールにログインし、作成したOSSバケットの名前を表示および記録します。
OSSバケットの作成方法の詳細については、「バケットの作成」をご参照ください。
ossutilをインストールして構成します。 詳細については、「ossutilのインストール」をご参照ください。
次のコマンドを実行して、OSSにQwen1.5-0.5B-Chatという名前のディレクトリを作成します。
ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-0.5B-Chat
次のコマンドを実行して、モデルファイルをOSSにアップロードします。
ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<Your-Bucket-Name>/Qwen1.5-0.5B-Chat
推論サービスをデプロイするクラスターに対して、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: 推論サービスの展開
次のコマンドを実行して、クラスターで使用可能なGPUリソースを照会します。
arena top node
クラスターに、推論サービスを実行するGPU高速化ノードが含まれていることを確認します。
次のコマンドを実行して、2つのQwen推論サービスを開始します。 各推論サービスには6 GBのGPUメモリが必要です。
最初の推論サービスを開始します。
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番目の推論サービスを開始します。
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: 推論サービスの検証
次のコマンドを実行して、推論サービスのステータスを照会します。
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 # 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.
期待される出力:
出力は、各ポッドが最大6 GBのGPUメモリを使用できることを示しています。 ノードのGPUメモリ容量は16 GBです。 したがって、ノードには、2つの推論サービスがデプロイされているポッドに十分なGPUメモリがあります。
次のコマンドを実行して、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