在某些情境下,您可能需要將多個模型推理任務共用在同一塊GPU以提高GPU的利用率。本文以模型類型為Qwen1.5-0.5B-Chat,GPU類型為V100卡為例,示範如何使用KServe部署GPU共用的模型推理服務。
前提條件
已建立託管GPU叢集或專有GPU叢集,且叢集版本需為1.22及以上,並指定CUDA版本為12.0及以上。具體操作,請參見為叢集添加異構計算節點池或建立專有GPU叢集。
建議GPU節點使用525版本驅動,您可以通過為GPU節點池添加標籤
ack.aliyun.com/nvidia-driver-version:525.105.17指定驅動版本為525.105.17。具體操作,請參見通過指定版本號碼自訂節點GPU驅動版本。已共用GPU調度組件,並開啟GPU共用調度能力。
已安裝Arena用戶端,且版本不低於0.9.15。具體操作,請參見配置Arena用戶端。
已安裝cert-manager和ack-kserve️組件,且ack-kserve️組件的部署模式為Raw Deployment。
步驟一:準備模型資料
您可以使用OSS或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 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為目的地組群配置名為llm-model的儲存卷PV和儲存聲明PVC。
以下為樣本PV的基本配置資訊:
配置項
說明
儲存卷類型
OSS
名稱
llm-model
訪問認證
配置用於訪問OSS的AccessKey ID和AccessKey Secret。
Bucket ID
選擇上一步所建立的OSS Bucket。
OSS Path
選擇模型所在的路徑,如/Qwen1.5-0.5B-Chat。
以下為樣本PVC的基本配置資訊:
配置項
說明
儲存宣告類型
OSS
名稱
llm-model
分配模式
選擇已有儲存卷。
已有儲存卷
單擊選擇已有儲存卷連結,選擇已建立的儲存卷PV。
步驟二:部署推理服務
啟動兩個Qwen推理服務,每個推理服務需使用6 GB顯存。
啟動第二個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 | 否 | 申請顯存大小(如 |
--cpu | 否 | 推理服務需要使用的CPU數。 |
--memory | 否 | 推理服務需要使用的記憶體數。 |
--data | 否 | 推理服務的模型地址,本文指定模型的儲存卷為 |
步驟三:驗證推理服務
查看兩個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上。分別執行以下兩條命令,進入兩個推理服務所在的Pod中,查看Pod所分配的GPU顯存大小。
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # 進入第一個推理服務所在的pod。 kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # 進入第二個推理服務所在的pod。預期輸出:
輸出結果表明,兩個Pod的顯存上限均為6 GB,表明每個Pod分配了6 GB的顯存。可以判斷出節點GPU顯存已被成功分配給了這兩個推理服務所在的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": "測試一下"}], "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":"好的,請問您需要測試什麼內容呢?"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}輸出結果表明模型可以根據給定的輸入(在這個例子中是一條測試訊息)產生相應的回複。
(可選)步驟四:清理環境
如果不再使用已建立的資源,請及時清理。
執行以下命令,刪除已部署的模型推理服務。
arena serve delete qwen1 arena serve delete qwen2執行以下命令,刪除已建立的PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model