在使用Container Compute Service (ACS)算力時,您無需深入瞭解底層硬體,也無需涉及GPU節點管理和配置即可開箱即用。ACS部署簡單、支援隨用隨付,非常適合用於LLM推理任務,可以有效降低推理成本。本文介紹如何使用ACS GPU算力部署生產可用的QwQ-32B模型推理服務,並通過Open WebUI頁面進行展示。
背景介紹
QwQ-32B模型
vLLM
Open WebUI
前提條件
首次使用阿里雲Container Compute Service (ACS)時,需要為服務帳號授予系統預設角色。若且唯若該角色被正確授予後,ACS才能正常地調用相關服務(ECS、OSS、NAS、CPFS、SLB等),建立叢集以及儲存日誌等。具體操作,請參見首次使用容器計算服務。
已使用kubectl串連Kubernetes叢集。具體操作,請參見擷取叢集kubeconfig並通過kubectl工具串連叢集。
GPU執行個體規格和成本預估
在推理階段主要佔用顯存的是模型參數,可以通過以下公式計算。
模型參數量為:32B(即320億),精度資料類型位元組數為:預設精度16位浮點數 / 8位每位元組 = 2位元組。
除了載入模型佔用的顯存之外,還需要考慮運算時所需的KV Cache大小和GPU利用率,通常會預留一部分buffer,因此推薦使用80 GiB顯存以上的資源配置:GPU:1卡,CPU:16 vCPU,記憶體:128 GiB。您可以參考規格推薦表和GPU計算類型卡型規格來選擇合適的執行個體規格。關於如何計算ACS GPU執行個體產生的費用,請參見計費說明。
在使用ACS GPU執行個體時,執行個體規格同樣遵循ACS Pod規格規整邏輯。
ACS Pod預設提供30 GiB的免費的臨時儲存空間(EphemeralStorage),本文中使用的推理鏡像inference-nv-pytorch:25.02-vllm0.7.2-sglang0.4.3.post2-pytorch2.5-cuda12.4-20250305-serverless佔用約9.8 GiB。如果該儲存空間大小無法滿足您的需求,您可以自訂增加臨時儲存空間大小。詳細操作,請參見增加臨時儲存空間大小。
操作步驟
模型檔案:QwQ-32B。模型檔案大小約120G,通常下載和上傳模型檔案需要2-3小時,提交工單可以快速將模型檔案複製到您的OSS Bucket。
GPU型號:請將標籤
alibabacloud.com/gpu-model-series: <example-model>替換為ACS支援的GPU具體型號。詳細內容,請參見指定ACS GPU算力。
步驟一:準備QwQ-32B模型資料
大語言模型因其龐大的參數量,需要佔用大量的磁碟空間來儲存模型檔案。建議您使用NAS儲存卷或OSS儲存捲來持久化儲存模型檔案,以下步驟以使用OSS儲存QwQ-32B模型檔案作為樣本。
執行以下命令下載QwQ-32B模型。
說明請確認是否已安裝git-lfs外掛程式,如未安裝可執行
yum install git-lfs或者apt-get install git-lfs安裝。更多的安裝方式,請參見安裝git-lfs。git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/Qwen/QwQ-32B.git cd QwQ-32B git lfs pull在OSS中建立目錄,將模型上傳至OSS。
說明關於ossutil工具的安裝和使用方法,請參見安裝ossutil。
ossutil mkdir oss://<your-bucket-name>/models/QwQ-32B ossutil cp -r ./QwQ-32B oss://<your-bucket-name>/models/QwQ-32B建立PV和PVC。為目的地組群配置名為
llm-model的儲存卷PV和儲存聲明PVC。具體操作,請參見靜態掛載OSS儲存卷。控制台操作樣本
以下為樣本PV的基本配置資訊:
配置項
說明
儲存卷類型
OSS
名稱
llm-model
訪問認證
配置用於訪問OSS的AccessKey ID和AccessKey Secret。
Bucket ID
選擇上一步所建立的OSS Bucket。
OSS Path
選擇模型所在的路徑,如
/models/QwQ-32B。以下為樣本PVC的基本配置資訊:
配置項
說明
儲存宣告類型
OSS
名稱
llm-model
分配模式
選擇已有儲存卷。
已有儲存卷
單擊選擇已有儲存卷連結,選擇已建立的儲存卷PV。
kubectl操作樣本
以下為樣本YAML:
apiVersion: v1 kind: Secret metadata: name: oss-secret stringData: akId: <your-oss-ak> # 配置用於訪問OSS的AccessKey ID akSecret: <your-oss-sk> # 配置用於訪問OSS的AccessKey Secret --- apiVersion: v1 kind: PersistentVolume metadata: name: llm-model labels: alicloud-pvname: llm-model spec: capacity: storage: 30Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: llm-model nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: <your-bucket-name> # bucket名稱 url: <your-bucket-endpoint> # Endpoint資訊,如oss-cn-hangzhou-internal.aliyuncs.com otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: <your-model-path> # 本樣本中為/models/QwQ-32B/ --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llm-model spec: accessModes: - ReadOnlyMany resources: requests: storage: 30Gi selector: matchLabels: alicloud-pvname: llm-model
步驟二:部署模型
執行下列命令,基於vLLM模型推理架構部署QwQ-32B模型的推理服務。
該推理服務暴露與OpenAI相容的HTTP API。下列命令將模型參數檔案視作是一種特殊類型的資料集合,掛載到推理服務容器的指定位置(
/model/QwQ-32B)。--max-model-len設定了該模型最大可處理的Token長度,增大該配置項可獲得更好的模型對話效果,但是可能會佔用更多GPU顯存資源。說明egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/{image:tag}為公網鏡像地址,建議您使用VPC方式加速拉取AI容器鏡像,減少鏡像拉取的時間。kubectl apply -f- <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: qwq-32b alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: <example-model> name: qwq-32b namespace: default spec: replicas: 1 selector: matchLabels: app: qwq-32b template: metadata: labels: app: qwq-32b alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: <example-model> spec: volumes: - name: model persistentVolumeClaim: claimName: llm-model - name: dshm emptyDir: medium: Memory sizeLimit: 30Gi containers: - command: - sh - -c - vllm serve /models/QwQ-32B --port 8000 --trust-remote-code --served-model-name qwq-32b --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager image: egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:25.02-vllm0.7.2-sglang0.4.3.post2-pytorch2.5-cuda12.4-20250305-serverless name: vllm ports: - containerPort: 8000 readinessProbe: tcpSocket: port: 8000 initialDelaySeconds: 30 periodSeconds: 30 resources: limits: nvidia.com/gpu: "1" cpu: "16" memory: 128G volumeMounts: - mountPath: /models/QwQ-32B name: model - mountPath: /dev/shm name: dshm --- apiVersion: v1 kind: Service metadata: name: qwq-32b-v1 spec: type: ClusterIP ports: - port: 8000 protocol: TCP targetPort: 8000 selector: app: qwq-32b EOF
步驟三:部署Open WebUI
執行以下命令,建立Open WebUI應用及服務。
kubectl apply -f- << EOF apiVersion: apps/v1 kind: Deployment metadata: name: openwebui spec: replicas: 1 selector: matchLabels: app: openwebui template: metadata: labels: app: openwebui spec: containers: - env: - name: ENABLE_OPENAI_API value: "True" - name: ENABLE_OLLAMA_API value: "False" - name: OPENAI_API_BASE_URL value: http://qwq-32b-v1:8000/v1 - name: ENABLE_AUTOCOMPLETE_GENERATION value: "False" - name: ENABLE_TAGS_GENERATION value: "False" image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/open-webui:main name: openwebui ports: - containerPort: 8080 protocol: TCP volumeMounts: - mountPath: /app/backend/data name: data-volume volumes: - emptyDir: {} name: data-volume --- apiVersion: v1 kind: Service metadata: name: openwebui labels: app: openwebui spec: type: ClusterIP ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: openwebui EOF
步驟四:驗證推理服務
使用
kubectl port-forward在推理服務與本地環境間建立連接埠轉寄。說明請注意
kubectl port-forward建立的連接埠轉寄不具備生產層級的可靠性、安全性和擴充性,因此僅適用於開發和調試目的,不適合在生產環境使用。更多關於Kubernetes叢集內生產可用的網路方案的資訊,請參見Ingress管理。kubectl port-forward svc/openwebui 8080:8080預期輸出:
Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080訪問
http://localhost:8080,登入Open WebUI頁面。第一次登入需要組態管理員帳號和密碼。輸入提示詞,預期輸出如下圖所示。

(可選)步驟五:壓測推理服務
下載壓測資料集步驟需要訪問公網能力。具體操作,請參見為叢集開啟公網訪問能力或為Pod掛載獨立公網EIP。
執行以下命令建立壓測工具。
kubectl apply -f- <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: vllm-benchmark labels: app: vllm-benchmark spec: replicas: 1 selector: matchLabels: app: vllm-benchmark template: metadata: labels: app: vllm-benchmark spec: volumes: - name: llm-model persistentVolumeClaim: claimName: llm-model containers: - name: vllm-benchmark image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm-benchmark:v1 command: - "sh" - "-c" - "sleep inf" volumeMounts: - mountPath: /models/QwQ-32B name: llm-model EOF進入壓測Pod,下載壓測資料集。
# 執行以下命令進入Benchmark Pod PODNAME=$(kubectl get po -o custom-columns=":metadata.name"|grep "vllm-benchmark") kubectl exec -it $PODNAME -- bash # 下載壓測資料集 pip3 install modelscope modelscope download --dataset gliang1001/ShareGPT_V3_unfiltered_cleaned_split ShareGPT_V3_unfiltered_cleaned_split.json --local_dir /root/執行壓測。
# 執行壓測 input_length=4096,tp=4,output_lenght=512,concurrency=8,num_prompts=80 python3 /root/vllm/benchmarks/benchmark_serving.py \ --backend vllm \ --model /models/QwQ-32B \ --served-model-name qwq-32b \ --trust-remote-code \ --dataset-name random \ --dataset-path /root/ShareGPT_V3_unfiltered_cleaned_split.json \ --random-input-len 4096 \ --random-output-len 512 \ --random-range-ratio 1 \ --num-prompts 80 \ --max-concurrency 8 \ --host qwq-32b-v1 \ --port 8000 \ --endpoint /v1/completions \ --save-result \ 2>&1 | tee benchmark_serving.txt預期輸出:
Starting initial single prompt test run... Initial test run completed. Starting main benchmark run... Traffic request rate: inf Burstiness factor: 1.0 (Poisson process) Maximum request concurrency: 8 100%|██████████| 80/80 [07:44<00:00, 5.81s/it] ============ Serving Benchmark Result ============ Successful requests: 80 Benchmark duration (s): 464.74 Total input tokens: 327680 Total generated tokens: 39554 Request throughput (req/s): 0.17 Output token throughput (tok/s): 85.11 Total Token throughput (tok/s): 790.18 ---------------Time to First Token---------------- Mean TTFT (ms): 10315.97 Median TTFT (ms): 12470.54 P99 TTFT (ms): 17580.34 -----Time per Output Token (excl. 1st token)------ Mean TPOT (ms): 71.03 Median TPOT (ms): 66.24 P99 TPOT (ms): 95.95 ---------------Inter-token Latency---------------- Mean ITL (ms): 71.02 Median ITL (ms): 58.12 P99 ITL (ms): 60.26 ==================================================
(可選)步驟六:清理環境
如果不再需要使用本文檔中部署的模型推理服務,請及時清理環境。
清理模型推理工作負載和服務。
kubectl delete deployment qwq-32b kubectl delete service qwq-32b-v1 kubectl delete deployment openwebui kubectl delete service openwebui kubectl delete deployment vllm-benchmark清理PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model預期輸出:
persistentvolumeclaim "llm-model" deleted persistentvolume "llm-model" deleted
相關文檔
阿里雲Container Compute Service (ACS)已經整合到Container Service for Kubernetes,您可以通過ACK託管叢集Pro版快速使用ACS GPU容器算力。
以下為使用ACS GPU算力構建DeepSeek模型推理服務的系列內容:
ACS AI容器鏡像是提供給使用GPU執行個體的ACS叢集的專用容器鏡像。關於目前發行鏡像的更多資訊,請參見ACS AI容器鏡像版本發布記錄。