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

更新时间:2025-03-19 03:19:13

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

背景介绍

DeepSeek-R1模型

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

KServe

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

Arena

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

前提条件

GPU实例规格和成本预估

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

以一个默认精度为FP167B模型为例,模型参数量为: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. 创建PVPVC。为目标集群配置名为llm-model的存储卷PV和存储声明PVC。具体操作,请参见使用OSS静态存储卷

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

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

    配置项

    说明

    存储卷类型

    OSS

    名称

    llm-model

    访问证书

    配置用于访问OSSAccessKey IDAccessKey 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"

您可以通过Grafana大盘来观测基于vLLM部署的LLM推理服务。首先将vLLMGrafana JSON model导入到Grafana,然后创建LLM推理服务的可观测大盘。导入的JSON model请参见vLLM官方网站。具体导入操作,请参见如何导出和导入Grafana仪表盘。配置后Dashboard大盘如下图所示:

image

导入Grafana大盘操作步骤

导入大盘

  1. 登录ARMS控制台

  2. 在左侧导航栏,单击接入管理

  3. 已接入环境页签中选择容器环境,通过ACK集群名称搜索环境,然后点击进入目标环境。

    image

  4. 在组件管理页签中,复制并保存集群ID,点击进入大盘目录

    image

  5. Dashboards页签右侧,点击Import按钮。

    image

  6. 复制grafana.json文件内容,粘贴到Import via panel json区域,然后点击Load按钮。

    说明

    您也可以通过上传JSON文件的方式导入大盘。

    image

  7. 保持默认设置,点击Import,即可完成LLM推理服务可观测大盘的导入。

大盘数据验证

  1. 使用已保存的集群ID或者Prometheus实例ID搜索数据源,然后选择目标数据源。

    image

  2. 发送若干请求访问推理服务,模拟推理业务流量,验证LLM推理服务的可观测大盘数据,如Token Throughput等。

    image

弹性扩缩容

在部署与管理KServe模型服务时,可能会遇到动态负载波动。KServe通过KubernetesHPA技术和ACKack-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模型文件
  • 步骤二:部署推理服务
  • 步骤三:验证推理服务
  • 可观测性
  • 导入Grafana大盘操作步骤
  • 弹性扩缩容
  • 模型加速
  • 灰度发布
  • GPU共享推理
  • 相关文档