全部產品
Search
文件中心

Container Compute Service:使用ACS GPU算力構建QwQ-32B模型推理服務

更新時間:May 14, 2025

在使用Container Compute Service (ACS)算力時,您無需深入瞭解底層硬體,也無需涉及GPU節點管理和配置即可開箱即用。ACS部署簡單、支援隨用隨付,非常適合用於LLM推理任務,可以有效降低推理成本。本文介紹如何使用ACS GPU算力部署生產可用的QwQ-32B模型推理服務,並通過Open WebUI頁面進行展示。

背景介紹

QwQ-32B模型

阿里雲最新發行的QwQ-32B模型,通過強化學習大幅度提升了模型推理能力。QwQ-32B模型擁有320億參數,其效能可以與DeepSeek-R1 671B參數的滿血版媲美。模型數學代碼等核心指標(AIME 24/25、livecodebench)以及部分通用指標(IFEval、LiveBench等)達到DeepSeek-R1滿血版水平,各指標均顯著超過同樣基於Qwen2.5-32B的DeepSeek-R1-Distill-Qwen-32B。更多模型資訊,請參考QwQ-32B

vLLM

vLLM是一個高效易用的大語言模型推理服務架構,vLLM支援包括通義千問在內的多種常見大語言模型。vLLM通過PagedAttention最佳化、動態批量推理(continuous batching)、模型量化等最佳化技術,可以取得較好的大語言模型推理效率。更多關於vLLM架構的資訊,請參見vLLM GitHub程式碼程式庫

Open WebUI

Open WebUI是一個可擴充、功能豐富且方便使用的自託管AI平台,設計為完全離線運行。它支援各種LLM運行器,如Ollama和與OpenAI相容的API,具有用於RAG的內建推理引擎,使其成為強大的AI部署解決方案。

前提條件

  • 首次使用阿里雲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執行個體產生的費用,請參見計費說明

說明

操作步驟

說明

您可以提交工單,快速擷取模型檔案和支援的GPU型號

  • 模型檔案: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模型檔案作為樣本。

  1. 執行以下命令下載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
  2. 在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
  3. 建立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

步驟二:部署模型

  1. 執行下列命令,基於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

  1. 執行以下命令,建立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

步驟四:驗證推理服務

  1. 使用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
  2. 訪問http://localhost:8080,登入Open WebUI頁面。

    第一次登入需要組態管理員帳號和密碼。輸入提示詞,預期輸出如下圖所示。

    image

(可選)步驟五:壓測推理服務

說明

下載壓測資料集步驟需要訪問公網能力。具體操作,請參見為叢集開啟公網訪問能力為Pod掛載獨立公網EIP

  1. 執行以下命令建立壓測工具。

    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
  2. 進入壓測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/
  3. 執行壓測。

    # 執行壓測 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     
    ==================================================
    

(可選)步驟六:清理環境

如果不再需要使用本文檔中部署的模型推理服務,請及時清理環境。

  1. 清理模型推理工作負載和服務。

    kubectl delete deployment qwq-32b
    kubectl delete service qwq-32b-v1
    kubectl delete deployment openwebui
    kubectl delete service openwebui
    kubectl delete deployment vllm-benchmark
  2. 清理PV和PVC。

    kubectl delete pvc llm-model
    kubectl delete pv llm-model

    預期輸出:

    persistentvolumeclaim "llm-model" deleted
    persistentvolume "llm-model" deleted

相關文檔