基于 Knative 在 ACK Auto Mode 集群中部署 Qwen3.5-4B 大语言模型推理服务

更新时间:
复制 MD 格式

ACK Auto Mode集群支持Auto Mode节点池,结合 Knative Serving 的按需弹性能力,可将 Qwen3.5-4B 大模型部署为按需使用的 Serverless 推理服务。部署后,无需手动运维管理 GPU 资源,适用于对 GPU 成本敏感和运维复杂度有要求的模型推理场景。

整体链路如下:

  • ACK Auto Mode集群:负责 GPU 节点的创建与释放,节点生命周期由Auto Mode节点池管理。

  • Knative Serving:支持按请求并发数(concurrency)或每秒请求数(rps)扩缩 Pod

步骤一:创建 ACK Auto Mode 集群并配置 GPU 节点池

1. 创建集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击创建集群,在ACK 托管集群页面,启用Auto Mode。

    image

  3. 按照页面指引确认配置后,单击创建集群

    如需了解详细说明,请参见创建ACK Auto Mode 集群

2. 创建GPU节点池

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

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

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

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

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

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

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

3. 部署 Knative 组件

参见部署 Knative 组件完成部署。

步骤二:准备模型文件并上传 OSS

本步骤使用一台临时 ECS 实例从 ModelScope 下载 Qwen3.5-4B 模型文件,再通过ossutil 将文件上传至 OSS Bucket,后续通过存储卷挂载到推理容器,避免每次启动推理容器时重复下载模型。

开始前,请确认已完成以下准备工作:

1. 下载 Qwen3.5-4B 模型文件

在临时 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. 从 ModelScope 克隆 Qwen3.5-4B 仓库到本地(跳过 LFS 大文件,避免重复下载)。

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

    cd Qwen3.5-4B
    git lfs pull

2. 上传模型文件到 OSS

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

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

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

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

3. 配置 OSS 存储卷

  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
        nodePublishSecretRef:
          # 存储 AccessKey 信息的 Secret 名称
          name: oss-secret
          # Secret 所在命名空间
          namespace: default
        volumeAttributes:
          fuseType: ossfs2
          # 替换为实际 Bucket 名称
          bucket: <Your-Bucket-Name>
          # 待挂载的子目录,留空则挂载根目录
          path: /models/Qwen3.5-4B
          # OSS Bucket 所在地域的 Endpoint
          url: "http://oss-cn-hangzhou-internal.aliyuncs.com"
          otherOpts: "-o close_to_open=false"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      # PVC 名称
      name: llm-model
      namespace: default
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 30Gi
      storageClassName: ""
      # 待绑定的 PV 名称
      volumeName: llm-model

步骤三:部署 Knative 服务并验证

1. 创建 Knative Service

  1. ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择应用 > Knative

  2. 服务管理页签,单击使用模板创建,然后选择示例模板自定义,按照页面指引完成 Knative Service 的部署。

    展开查看示例代码

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      labels:
        release: qwen
      name: qwen
      namespace: default
    spec:
      template:
        metadata:
          annotations:
            # 最小副本数,保持至少 1 个副本常驻,避免冷启动
            autoscaling.knative.dev/minScale: "1"
            # 最大副本数,限制 GPU 资源消耗上限
            autoscaling.knative.dev/maxScale: "2"
          labels:
            release: qwen
        spec:
          containers:
          - command:
            - vllm
            - serve
            - /models/Qwen3.5-4B
            - --served-model-name
            - Qwen3.5-4B
            - --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
                nvidia.com/gpu: "1"
              requests:
                cpu: "16"
                memory: 32Gi
                nvidia.com/gpu: "1"
            volumeMounts:
            - mountPath: /models/Qwen3.5-4B
              name: llm-model
          volumes:
          - name: llm-model
            persistentVolumeClaim:
              claimName: llm-model

    参数

    说明

    autoscaling.knative.dev/metric

    扩缩容指标。可取值:

    • concurrency(默认):并发数。

    • rps:每秒请求数。

    autoscaling.knative.dev/target

    扩缩容阈值,触发扩缩容的指标目标值。

    autoscaling.knative.dev/minScale

    最小副本数,需为 ≥ 0 的整数。KPA 支持设置为 0(即允许缩容至零)。

    autoscaling.knative.dev/maxScale

    最大副本数,限制扩容上限。

2. 验证服务部署

  1. 服务管理页签,确认服务就绪,并获取默认域名和访问网关地址。

    页面提示:服务访问前需将域名与访问网关进行 Host 绑定。访问网关地址形如 alb-xxx.aliyuncsslb.com,服务默认域名形如 qwen.default.example.com

  2. 向推理服务发送测试请求。

    xx.40.85.xx 替换为实际访问网关地址,qwen.default.example.com 替换为实际默认域名。

    curl http://xx.40.85.xx:80/v1/chat/completions \
      -H "Host: qwen.default.example.com" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "Qwen3.5-4B",
        "messages": [
          {
            "role": "user",
            "content": [
              {
                "type": "text",
                "text": "介绍杭州"
              }
            ]
          }
        ],
        "max_tokens": 200
      }'

    预期输出如下:

    {
      "id": "chatcmpl-20dfb4c8-d1ab-48bc-9f1a-78b84c6c8adf",
      "object": "chat.completion",
      "created": 1772602897,
      "model": "Qwen3.5-4B",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "杭州(Hangzhou),简称"杭",是位于中国浙江省的副省级城市..."
          },
          "finish_reason": "length"
        }
      ],
      "usage": {
        "prompt_tokens": 14,
        "completion_tokens": 200,
        "total_tokens": 214
      }
    }