在ACK中使用KTransformers部署DeepSeek-R1模型

更新时间:2025-04-27 08:34:14

KTransformers框架实现了多种LLM推理优化,进一步减少了推理阶段的显存占用,从而提高推理性能和降低GPU资源成本。本文介绍如何在阿里云容器服务 Kubernetes 版中通过KTransformers实现高效部署671B参数的DeepSeek-R1-Q4_K_M量化模型推理服务。

背景介绍

DeepSeek-R1模型

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

KTransformers

KTransformers旨在通过先进的内核优化和放置/并行策略来增强Transformers性能。KTransformers是一个以Python为中心的灵活框架,其核心是可扩展性。通过用一行代码实现并注入优化模块,用户可以获得与Transformers兼容的接口、符合OpenAIOllamaRESTful API,以及一个简化的类似ChatGPTWeb界面。

Arena

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

前提条件

GPU实例规格和成本预估

本文使用DeepSeek R1-Q4_K_M(GGUF 4-bit)量化模型,模型参数量为671B,模型大小约为377GiB。在推理阶段主要占用显存的是模型参数,除了加载模型占用的显存之外,还需要考虑运算时所需的KV Cache大小和GPU使用率,通常会预留一部分buffer。而KTransformers框架实现了多种LLM推理优化,进一步降低了推理阶段的显存占用,因此推荐至少使用一台24GB * 4显存的GPU实例ecs.gn7i-c32g1.32xlargeecs.ebmgn7i.32xlarge。关于GPU实例规格和计费的详情,请参见GPU计算型实例规格族GPU云服务器计费

模型下载

大语言模型因其庞大的参数量,需要占用大量的磁盘空间来存储模型文件。建议您使用NAS存储卷或OSS存储卷来持久化存储模型文件,以下步骤以使用OSS存储DeepSeek R1-Q4_K_M模型文件作为示例。

  1. 使用以下命令通过modelscope将模型下载到本地。

    cd ~
    pip install modelscope
    modelscope download --model unsloth/DeepSeek-R1-GGUF --include "DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-*" --local_dir "./DeepSeek-R1-GGUF"
  2. 下载配置文件,并移动到模型文件目录中。

    git clone https://github.com/ubergarm/r1-ktransformers-guide.git
    mv r1-ktransformers-guide/* DeepSeek-R1-GGUF/
  3. OSS中创建目录,将模型上传至OSS。

    说明

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

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

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

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

    配置项

    说明

    存储卷类型

    OSS

    名称

    llm-model

    访问证书

    配置用于访问OSSAccessKey IDAccessKey Secret。

    Bucket ID

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

    OSS Path

    选择模型所在的路径,如/models/DeepSeek-R1-GGUF

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

模型部署

说明

关于基础镜像的详细内容,请参考KTransformers镜像的Dockerfile

步骤一:部署KTransformers应用

  1. 执行以下命令,基于KTransformers推理框架部署DeepSeek-R1-Q4_K_M量化模型的推理服务。

    arena serve custom \
    --name=ktransformers \
    --version=v1 \
    --gpus=4 \
    --replicas=1 \
    --restful-port=8080 \
    --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.7.2-ktransformer \
    --share-memory=30Gi \
    --data="llm-model:/models/DeepSeek-R1-GGUF" \
    "cd /vllm-workspace/ktransformers/;PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True python3 ./ktransformers/server/main.py --gguf_path /models/DeepSeek-R1-GGUF/DeepSeek-R1-Q4_K_M/ --model_path /models/DeepSeek-R1-GGUF/ --model_name unsloth/DeepSeek-R1-Q4_K_M --cpu_infer 65 --max_new_tokens 8192 --cache_lens 32768 --total_context 32768 --cache_q4 true --temperature 0.6 --top_p 0.95 --optimize_config_path ./ktransformers/optimize/optimize_rules/DeepSeek-V3-Chat.yaml --force_think --use_cuda_graph --host 0.0.0.0 --port 8080"

    预期输出:

    service/ktransformers-v1 created
    deployment.apps/ktransformers-v1-custom-serving created
    INFO[0004] The Job ktransformers has been submitted successfully
    INFO[0004] You can run `arena serve get ktransformers --type custom-serving -n default` to check the job status

    输出结果表明已经成功部署了一个与vLLM相关的服务及其配套的DeploymentJob。

  2. 执行以下命令,查看推理服务的详细信息。

    arena serve get ktransformers

    预期输出:

    $ arena serve get ktransformers
    # ================================
    Name:       ktransformers
    Namespace:  default
    Type:       Custom
    Version:    v1
    Desired:    1
    Available:  1
    Age:        2m
    Address:    192.168.XXX.XXX
    Port:       RESTFUL:8080
    GPU:        4
    
    Instances:
      NAME                                              STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                              ------   ---  -----  --------  ---  ----
      ktransformers-v1-custom-serving-XXXb549799-XXXbj  Running  2m   1/1    0         4    XX-XX-1.10.6.17.38

步骤二:部署OpenWebUI

  1. 使用以下YAML,创建OpenWebUI应用。

    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://ktransformers-v1:8080/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

步骤三:访问服务

  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,登录OpenWebUI页面。

    第一次登录需要配置管理员账号和密码。输入提示词,预期输出如下图所示。

    image

(可选)删除推理服务

在执行删除操作前,请确保不再需要该服务及其相关资源。

  1. 执行以下命令,删除推理服务。

    arena serve delete ktransformers
  2. 删除OpenWebUI应用。

    kubectl delete deploy openwebui
    kubectl delete svc openwebui
  3. 执行以下命令,删除已创建的PVPVC。

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

相关文档

以下为基于ACK部署DeepSeek模型推理服务的系列内容:

  • 本页导读 (1)
  • 背景介绍
  • DeepSeek-R1模型
  • KTransformers
  • Arena
  • 前提条件
  • GPU实例规格和成本预估
  • 模型下载
  • 模型部署
  • 步骤一:部署KTransformers应用
  • 步骤二:部署OpenWebUI
  • 步骤三:访问服务
  • (可选)删除推理服务
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等