基于ACK部署DeepSeek蒸馏模型推理服务

更新时间:2025-03-07 09:49

本文介绍如何在阿里云容器服务ACK中使用KServe部署生产可用的DeepSeek模型推理服务。

背景介绍

DeepSeek-R1模型

DeepSeek-R1模型是DeepSeek推出的第一代推理模型,旨在通过大规模强化学习提升大语言模型的推理能力。实验结果表明,DeepSeek-R1在数学推理、编程竞赛等多个任务上表现出色,不仅超过了其他闭源模型,而且在某些任务上接近或超越了OpenAI-O1系列模型。DeepSeek-R1在知识类任务和其他广泛的任务类型中也表现出色,包括创意写作、一般问答等。DeepSeek还将推理能力蒸馏到小模型上,通过对已有模型(Qwen、Llama等)微调提升模型推理能力。蒸馏后的14B模型显著超越了现有的开源模型QwQ-32B,而蒸馏后的32B和70B模型均刷新纪录。 更多关于DeepSeek模型的信息,请参见DeepSeek AI GitHub仓库

KServe

KServe是一个开源的云原生模型服务平台,旨在简化在Kubernetes上部署和运行机器学习模型的过程,支持多种机器学习框架、具备弹性扩容能力。KServe通过定义简单的YAML文件,提供声明式的API来部署模型,使得配置和管理模型服务变得更加容易。关于KServe开源项目的更多信息,请参见KServe

Arena

Arena是基于Kubernetes的机器学习轻量级解决方案,支持数据准备、模型开发、模型训练、模型预测的完整生命周期,提升数据科学家的工作效率。同时和阿里云的基础云服务深度集成,支持GPU共享、CPFS等服务,可以运行阿里云优化的深度学习框架,最大化利用阿里云异构设备的性能和成本的效益。更多关于Arena的信息,请参见Arena GitHub代码库

前提条件

GPU实例规格和成本预估

在推理阶段主要占用显存的是模型参数,可以通过以下公式计算。

以一个默认精度为FP16的7B模型为例,模型参数量为:7B(即70亿),精度数据类型字节数为:默认精度16位浮点数 / 8位每字节 = 2字节。

除了加载模型占用的显存之外,还需要考虑运算时所需的KV Cache大小和GPU使用率,通常会预留一部分buffer,因此推荐使用24GiB显存的GPU实例ecs.gn7i-c8g1.2xlargeecs.gn7i-c16g1.4xlarge。关于GPU实例规格和计费的详情,请参见GPU计算型实例规格族GPU云服务器计费

模型部署

步骤一:准备DeepSeek-R1-Distill-Qwen-7B模型文件

  1. 执行以下命令从ModelScope下载DeepSeek-R1-Distill-Qwen-7B模型。

    说明

    请确认是否已安装git-lfs插件,如未安装可执行yum install git-lfs或者apt-get install git-lfs安装。更多的安装方式,请参见安装git-lfs

    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B.git
    cd DeepSeek-R1-Distill-Qwen-7B/
    git lfs pull
  2. 在OSS中创建目录,将模型上传至OSS。

    说明

    关于ossutil工具的安装和使用方法,请参见安装ossutil

    ossutil mkdir oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B
    ossutil cp -r ./DeepSeek-R1-Distill-Qwen-7B oss://<your-bucket-name>/models/DeepSeek-R1-Distill-Qwen-7B
  3. 创建PV和PVC。为目标集群配置名为llm-model的存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷

    控制台操作示例
    kubectl操作示例

    以下为示例PV的基本配置信息:

    配置项

    说明

    存储卷类型

    OSS

    名称

    llm-model

    访问证书

    配置用于访问OSS的AccessKey ID和AccessKey Secret。

    Bucket ID

    选择上一步所创建的OSS Bucket。

    OSS Path

    选择模型所在的路径,如/models/DeepSeek-R1-Distill-Qwen-7B

    以下为示例PVC的基本配置信息:

    配置项

    说明

    存储声明类型

    OSS

    名称

    llm-model

    分配模式

    选择已有存储卷。

    已有存储卷

    单击选择已有存储卷链接,选择已创建的存储卷PV。

    以下为示例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/DeepSeek-R1-Distill-Qwen-7B/
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: llm-model
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 30Gi
      selector:
        matchLabels:
          alicloud-pvname: llm-model

步骤二:部署推理服务

  1. 执行下列命令,启动名称为deepseek的推理服务。

    arena serve kserve \
        --name=deepseek \
        --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.6.6 \
        --gpus=1 \
        --cpu=4 \
        --memory=12Gi \
        --data=llm-model:/models/DeepSeek-R1-Distill-Qwen-7B \
        "vllm serve /models/DeepSeek-R1-Distill-Qwen-7B --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager"

    参数解释如下表所示:

    参数

    是否必选

    说明

    参数

    是否必选

    说明

    --name

    提交的推理服务名称,全局唯一。

    --image

    推理服务的镜像地址。

    --gpus

    推理服务需要使用的GPU卡数。默认值为0。

    --cpu

    推理服务需要使用的CPU数量。

    --memory

    推理服务需要使用的内存数量。

    --data

    服务的模型地址,本文指定模型为上一步创建的存储卷llm-model,挂载到容器中的/models/目录下。

    预期输出:

    inferenceservice.serving.kserve.io/deepseek created
    INFO[0003] The Job deepseek has been submitted successfully
    INFO[0003] You can run `arena serve get deepseek --type kserve -n default` to check the job status

步骤三:验证推理服务

  1. 执行下列命令,查看KServe推理服务的部署情况。

    arena serve get deepseek

    预期输出:

    Name:       deepseek
    Namespace:  default
    Type:       KServe
    Version:    1
    Desired:    1
    Available:  1
    Age:        3m
    Address:    http://deepseek-default.example.com
    Port:       :80
    GPU:        1
    
    
    Instances:
      NAME                                 STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                 ------   ---  -----  --------  ---  ----
      deepseek-predictor-7cd4d568fd-fznfg  Running  3m   1/1    0         1    cn-beijing.172.16.1.77

    输出结果表明,KServe推理服务部署成功。

  2. 执行以下命令,使用获取到的Nginx Ingress网关地址访问推理服务。

    # 获取Nginx ingress的IP地址。
    NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
    # 获取Inference Service的Hostname。
    SERVICE_HOSTNAME=$(kubectl get inferenceservice deepseek -o jsonpath='{.status.url}' | cut -d "/" -f 3)
    # 发送请求访问推理服务。
    curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_IP:80/v1/chat/completions -d '{"model": "deepseek-r1", "messages": [{"role": "user", "content": "Say this is a test!"}], "max_tokens": 512, "temperature": 0.7, "top_p": 0.9, "seed": 10}'

    预期输出:

    {"id":"chatcmpl-0fe3044126252c994d470e84807d4a0a","object":"chat.completion","created":1738828016,"model":"deepseek-r1","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n\n</think>\n\nIt seems like you're testing or sharing some information. How can I assist you further? If you have any questions or need help with something, feel free to ask!","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":9,"total_tokens":48,"completion_tokens":39,"prompt_tokens_details":null},"prompt_logprobs":null}

可观测性

在生产环境中LLM推理服务的可观测性是至关重要的,可以有效提前发现和定位故障。vLLM框架提供了许多LLM推理指标,具体指标请参见Metrics文档。KServe也提供了一些指标来帮助您监控模型服务的性能和健康状况。我们在Arena工具中集成了这些能力,您只需要在提交应用时增加--enable-prometheus=true参数即可。

arena serve kserve \
    --name=deepseek \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.6.6 \
    --gpus=1 \
    --cpu=4 \
    --memory=12Gi \
    --enable-prometheus=true \
    --data=llm-model:/models/DeepSeek-R1-Distill-Qwen-7B \
    "vllm serve /models/DeepSeek-R1-Distill-Qwen-7B --port 8080 --trust-remote-code --served-model-name deepseek-r1 --max-model-len 32768 --gpu-memory-utilization 0.95 --enforce-eager"

配置后Dashboard大盘如下图所示:

image

弹性扩缩容

在部署与管理KServe模型服务过程中,需应对模型推理服务面临的高度动态负载波动。KServe通过集成Kubernetes原生的HPA(Horizontal Pod Autoscaler)技术以及ACK提供的ack-alibaba-cloud-metrics-adapter组件,实现了根据CPU使用率、内存占用情况、GPU使用率以及自定义性能指标,自动灵活地调整模型服务Pod的规模,以确保服务效能与稳定性。详细内容,请参见为服务配置弹性扩缩容

模型加速

随着技术的发展,AI应用的模型数据越来越大,但是通过存储服务(如OSS、NAS等)拉取这些大文件时可能会出现长时间的延迟和冷启动问题。您可以利用Fluid显著提升模型加载速度,从而优化推理服务的性能,特别是对于基于KServe的推理服务而言。详细内容,请参见使用Fluid实现模型加速

灰度发布

在生产环境中应用发布更新是最为常见的操作,为了保证业务平稳、降低变更风险,灰度发布必不可少。ACK支持多种灰度发布策略,如根据流量百分比灰度,根据请求Header灰度等。详细内容,请参见实现推理服务的灰度发布

GPU共享推理

DeepSeek-R1-Distill-Qwen-7B模型仅需14 GB显存,如果您使用更高规格的GPU机型如A100等,可以考虑使用GPU共享推理技术,提升GPU使用率。GPU共享技术可以将一个GPU进行切分,多个推理服务共享一个GPU,从而提升GPU使用率。详细内容,请参见部署GPU共享推理服务

相关文档

  • 本页导读 (1)
  • 背景介绍
  • DeepSeek-R1模型
  • KServe
  • Arena
  • 前提条件
  • GPU实例规格和成本预估
  • 模型部署
  • 步骤一:准备DeepSeek-R1-Distill-Qwen-7B模型文件
  • 步骤二:部署推理服务
  • 步骤三:验证推理服务
  • 可观测性
  • 弹性扩缩容
  • 模型加速
  • 灰度发布
  • GPU共享推理
  • 相关文档
文档反馈