KTransformers框架实现了多种LLM推理优化,进一步减少了推理阶段的显存占用,从而提高推理性能和降低GPU资源成本。本文介绍如何在阿里云容器服务 Kubernetes 版中通过KTransformers实现高效部署671B参数的DeepSeek-R1-Q4_K_M量化模型推理服务。
背景介绍
前提条件
GPU实例规格和成本预估
本文使用DeepSeek R1-Q4_K_M(GGUF 4-bit)量化模型,模型参数量为671B,模型大小约为377GiB。在推理阶段主要占用显存的是模型参数,除了加载模型占用的显存之外,还需要考虑运算时所需的KV Cache大小和GPU使用率,通常会预留一部分buffer。而KTransformers框架实现了多种LLM推理优化,进一步降低了推理阶段的显存占用,因此推荐至少使用一台24GB * 4显存的GPU实例ecs.gn7i-c32g1.32xlarge
或ecs.ebmgn7i.32xlarge
。关于GPU实例规格和计费的详情,请参见GPU计算型实例规格族和GPU云服务器计费。
模型下载
大语言模型因其庞大的参数量,需要占用大量的磁盘空间来存储模型文件。建议您使用NAS存储卷或OSS存储卷来持久化存储模型文件,以下步骤以使用OSS存储DeepSeek R1-Q4_K_M模型文件作为示例。
使用以下命令通过
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"
下载配置文件,并移动到模型文件目录中。
git clone https://github.com/ubergarm/r1-ktransformers-guide.git mv r1-ktransformers-guide/* DeepSeek-R1-GGUF/
在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
创建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-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应用
执行以下命令,基于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相关的服务及其配套的Deployment和Job。
执行以下命令,查看推理服务的详细信息。
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
使用以下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
步骤三:访问服务
使用
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
访问
http://localhost:8080
,登录OpenWebUI页面。第一次登录需要配置管理员账号和密码。输入提示词,预期输出如下图所示。
(可选)删除推理服务
在执行删除操作前,请确保不再需要该服务及其相关资源。
执行以下命令,删除推理服务。
arena serve delete ktransformers
删除OpenWebUI应用。
kubectl delete deploy openwebui kubectl delete svc openwebui
执行以下命令,删除已创建的PV和PVC。
kubectl delete pvc llm-model kubectl delete pv llm-model
相关文档
以下为基于ACK部署DeepSeek模型推理服务的系列内容:
- 本页导读 (1)
- 背景介绍
- DeepSeek-R1模型
- KTransformers
- Arena
- 前提条件
- GPU实例规格和成本预估
- 模型下载
- 模型部署
- 步骤一:部署KTransformers应用
- 步骤二:部署OpenWebUI
- 步骤三:访问服务
- (可选)删除推理服务
- 相关文档