在ACK Auto Mode中部署Qwen3.5-2B大模型推理服务

更新时间:
复制为 MD 格式

AI 推理场景中,GPU 资源的扩容速度直接影响业务高峰期间的服务可用性。ACK Auto Mode集群针对 GPU 弹性链路进行了专项优化,可自动完成 GPU 节点的扩容和基础运维。本文以Qwen3.5-2B为例,介绍如何在 ACK Auto Mode 集群中使用 GPU 算力快速部署大模型推理服务。

准备工作

  • 创建ACK Auto Mode 集群

  • 已创建符合条件的 GPU 智能托管节点池。

    展开查看

    1. ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择节点管理 > 节点池

    2. 节点池页面,单击创建节点池,然后在创建节点池对话框,完成节点池配置。

      主要配置如下。详细配置说明,请参见创建节点池

      • 托管配置:推荐使用智能托管模式。

      • 实例相关的配置项:选择实例配置方式指定实例规格,然后选择 GPU 云服务器,机型选择 V100、A10 或 T4。

      • 节点标签(Labels):添加标签 ack.aliyun.com/nvidia-driver-version:550.144.03,指定 NVIDIA 驱动版本为 550.144.03。

      • 容器镜像加速:建议开启,缩短模型镜像拉取时间。

步骤一:准备模型文件并挂载OSS

本步骤使用一台临时 ECS 实例从 ModelScope 下载 Qwen3.5-2B 模型文件,上传到 OSS Bucket,然后为集群配置 PV 和 PVC。模型以存储卷方式挂载到推理容器,避免每次容器启动时重复下载。

执行本步骤前,确认以下前提条件:

1. 下载Qwen3.5-2B模型

在临时 ECS 实例上执行以下操作,从 ModelScope 下载模型文件。

  1. 安装 Git。

    # 可执行 yum install git 或 apt install git 安装
    sudo yum install git
  2. 安装 Git LFS(Large File Storage)插件。

    # 可执行 yum install git-lfs 或 apt install git-lfs 安装
    sudo yum install git-lfs
  3. 初始化Git LFS,从 ModelScope 克隆 Qwen3.5-2B 仓库到本地(跳过 LFS 大文件,避免重复下载)。

    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen3.5-2B.git
  4. 进入目录,拉取 LFS 管理的模型大文件。

    cd Qwen3.5-2B/
    git lfs pull

2. 上传模型文件到OSS

  1. 在 OSS Bucket中创建存放模型的目录。

    <Your-Bucket-Name>替换为实际名称。

    ossutil mkdir oss://<Your-Bucket-Name>/models/Qwen3.5-2B
  2. 将本地模型文件上传至 OSS。

    ossutil cp -r ./Qwen3.5-2B oss://<Your-Bucket-Name>/models/Qwen3.5-2B

3. 配置OSS存储卷

为集群创建 PV 和 PVC,使 Pod 以只读方式挂载 OSS 中的模型目录。详情参见使用ossfs 2.0静态存储卷

  1. 选择鉴权方式(RRSAAccessKey)并准备访问凭证,以确保集群能够安全、合规地访问OSS Bucket资源。

    本示例以AccessKey鉴权为例。两种方式略有不同,详见使用ossfs 2.0静态存储卷
  2. 将此前获取的AccessKey存储为Secret,供PV使用。

    将 <yourAccessKeyID><yourAccessKeySecret> 替换为真实凭证。SecretNamespace需要和应用Namespace一致。

    kubectl create -n default secret generic oss-secret --from-literal='akId=<yourAccessKeyID>' --from-literal='akSecret=<yourAccessKeySecret>'
  3. 为目标集群创建 PV 和 PVC,将 OSS 中的模型目录以只读方式挂载。以下示例使用ossfs 2.0静态存储卷

    展开查看示例代码

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      # PV名称
      name: llm-model  
    spec:
      capacity:
        # 定义存储卷容量 (此值仅用于匹配PVC)
        storage: 30Gi  
      # 访问模式
      accessModes:  
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        # 与PV名称(metadata.name)保持一致
        volumeHandle: llm-model   
        # 使用此前创建的Secret
        nodePublishSecretRef:
          # 存储AK信息的Secret名称
          name: oss-secret  
          # 该Secret所在的命名空间
          namespace: default  
        volumeAttributes:
          fuseType: ossfs2
          # 替换为实际Bucket名称
          bucket: knative-llm  
          # 待挂载的子目录,留空则挂载根目录
          path: /models/Qwen3.5-2B
          # OSS Bucket所在地域的Endpoint
          url: "http://oss-cn-hangzhou-internal.aliyuncs.com"  
          otherOpts: "-o close_to_open=false"
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      # PVC名称
      name: llm-model 
      namespace: default
    spec:
      # 以下配置需要与PV一致
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 30Gi
      storageClassName: ""
      # 待绑定的PV
      volumeName: llm-model

步骤二:部署推理服务并验证

1. 创建DeploymentService

使用 vLLM 框架将 Qwen3.5-2B 模型以 Deployment 形式部署到集群,并通过 LoadBalancer 类型的 Service 对外暴露推理接口。

  1. ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择工作负载 > 无状态

  2. 单击使用YAML创建资源,提交以下 YAML 内容。

    提交后,若集群中 GPU 资源不足,Pod 会先进入 Pending 状态。ACK Auto Mode 会自动触发 GPU 节点扩容、创建新节点,并在节点初始化完成后将 Pod 调度到新节点运行,无需手动干预。当 Pod 进入 Running 状态时,模型服务部署完成。

    展开查看示例代码

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: qwen-2b
      labels:
        app: qwen
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: qwen
      template:
        metadata:
          labels:
            app: qwen
        spec:
          containers:
          - command:
            - vllm
            - serve
            - /models/Qwen3.5-2B       
            - --served-model-name
            - Qwen3.5-2B
            - --port
            - "8000"                 
            - --enforce-eager
            image: ac2-mirror-registry.cn-hangzhou.cr.aliyuncs.com/evaluate/vllm-openai:nightly-d00df624f313a6a5a7a6245b71448b068b080cd7
            imagePullPolicy: IfNotPresent
            name: vllm-container
            ports:
            - containerPort: 8000
              name: http1
              protocol: TCP
            readinessProbe:
              tcpSocket:
                port: 8000
              initialDelaySeconds: 5
              periodSeconds: 5
            resources:
              limits:
                cpu: "32"
                memory: 64Gi
                # GPU 数量上限
                nvidia.com/gpu: "1"
              requests:
                cpu: "8"
                memory: 32Gi
                # 每个 Pod 请求 1 块 GPU,与 limits 保持一致
                nvidia.com/gpu: "1"
            volumeMounts:
            # 与 command 中的模型路径保持一致
            - mountPath: /models/Qwen3.5-2B
              name: llm-model
          volumes:
          - name: llm-model
            persistentVolumeClaim:
              claimName: llm-model
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: qwen-2b
    spec:
      type: LoadBalancer
      ports:
        # 对外暴露的端口,需与 containerPort 一致
        - port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: qwen

    部署完成后,可在无状态页面查看应用状态。

2. 验证推理服务

  1. 获取 Service 暴露的公网 IP。

    export EXTERNAL_IP=$(kubectl get svc qwen-2b -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo ${EXTERNAL_IP}
  2. 发送推理请求,验证模型服务是否可用。

    将 IP 8.XX.XX.89替换为实际获取到的公网 IP。

    curl http://8.XX.XX.89:8000/v1/chat/completions \
      -H "Content-Type: application/json" \
      -d '{
        "model": "Qwen3.5-2B",
        "messages": [
          {
            "role": "user",
            "content": [
              {
                "type": "text",
                "text": "Kubernetes"
              }
            ]
          }
        ],
        "max_tokens": 200
      }'

    预期输出:

    {"id":"chatcmpl-98f158cdbbb38087","object":"chat.completion","created":1775043962,"model":"Qwen3.5-2B","choices":[{"index":0,"message":{"role":"assistant","content":"**Kubernetes** is an open-source container orchestration platform that automates deployment, scaling, management, and repair of containerized applications..."},"finish_reason":"length"}],"usage":{"prompt_tokens":14,"total_tokens":214,"completion_tokens":200}}

相关文档