本期内容出自九天老师的公开课内容,V0.24版颠覆式更新,不仅首次实现了CPU混合推理下DeepSeek R1&V3模型并发,而且还首次支持了OpenAI风格API调用,并大幅提升模型推理速度,真正达到了企业级应用门槛!话不多说,我们直接开始~
一、 DeepSeek-R1&V3高性能部署思路1.主流高性能部署方案截至目前,毫无疑问, DeepSeek模型最高性价比的部署方案有两个,其一是清华大学团队提出的 Ktransformers部署方案,
- ktransformers:github.com/kvcache-ai/…
其二则是Unsloth动态量化方案,
- Unsloth:github.com/unslothai/u…
尽管两套方案都是采用CPU+GPU混合推理,但有所不同的是, Ktransformers技术方案是在llama.cpp 上进行的大幅修改,从而加快了CPU推理速度,而Unsloth则主要是在模型量化层面下功夫,推出了1.58bit等一众量化程度较深、但同时推理性能较好的量化模型,而实际运行过程,底层仍然是使用 llama.cpp进行推理。在此前的公开课中,我们曾分别介绍过独家KTransformers技术实战 :www.bilibili.com/video/BV1ky… R1!》www.bilibili.com/video/BV1AL…
2.Ktransformers v0.24重大更新虽然Ktransformers能够高效完成推理加速,但受限于此前的技术架构,导致其无法进行并发,这也 是阻碍Ktransformers框架迈向工业化应用的核心因素。而就在4月2号的项目更新中, Ktransformers正 式推出了v0.24版,该版本在0.23基础上进行了1万多行的代码更新,不仅进一步提高了推理速度,而且 还增加了并发功能。新版Ktransformers v0.24更新公告如下: github.com/kvcache-ai/… v0.2.4 发布说明:我们非常高兴地宣布,期待已久的 KTransformers v0.2.4 现已正式发布!在这个版本中,我们对整 体架构进行了重大重构,更新了超过 1 万行代码,为社区带来了备受期待的多并发支持。本次重构借鉴了 sglang 的优秀架构,在 C++ 中实现了高性能的异步并发调度机制,支持如连续批 处理、分块预填充(chunked prefill)等特性。由于支持并发场景下的 GPU 资源共享,整体吞吐量也 在一定程度上得到了提升。1. 多并发支持
- 新增对多个并发推理请求的处理能力,支持同时接收和执行多个任务。
- 我们基于高性能且灵活的算子库 flashinfer 实现了自定义的 custom_flashinfer ,并实现了可变 批大小(variable batch size)的 CUDA Graph,这在提升灵活性的同时,减少了内存和 padding 的开销。
- 在我们的基准测试中, 4 路并发下的整体吞吐量提升了约 130%。
- 在英特尔的支持下,我们在最新的 Xeon6 + MRDIMM-8800 平台上测试了 KTransformers v0.2.4。通过提高并发度,模型的总输出吞吐量从 17 tokens/s 提升到了 40 tokens/s。我们观察 到当前瓶颈已转移至 GPU,使用高于 4090D 的显卡预计还可以进一步提升性能。
- 引擎架构优化借鉴 sglang 的调度框架,我们通过更新约 11,000 行代码,将 KTransformers 重构为一个更清晰的 三层架构,并全面支持多并发:
- Server(服务层) :处理用户请求,并提供兼容 OpenAI 的 API。
- Inference Engine(推理引擎) :负责模型推理,支持分块预填充。
- Scheduler(调度器) :管理任务调度与请求编排。通过 FCFS (先来先服务)方式组织排队请求, 打包为批次并发送至推理引擎,从而支持连续批处理。
3. 项目结构重组所有 C/C++ 代码现已统一归类至 /csrc 目录下。4. 参数调整我们移除了一些遗留和已弃用的启动参数,简化了配置流程。未来版本中,我们计划提供完整的参 数列表和详细文档,以便用户更灵活地进行配置与调试。
接下来我们就尝试借助Ktransformers v0.24进行DeepSeek-R1和V3模型的本地安装部署。3.Ktransformers运行所需硬件要求由于Ktransformers是采用CPU+GPU混合推理,因此对内存有较大要求,以下是不同量化模型在使 用Ktransformers运行时的基本硬件要求:而如果是运行DeepSeek-R1 1.58bit模型(IQ1_S),则需要14G显存+120G以上内存,而如果运行 1.73bit模型(IQ1_M),则需要14G显存+140G以上内存,而如果是2.22-bit(IQ2_XXS),则需要14G 显存+170G内存, 2.51-bit(Q2_K_XL)则需要14G显存+200G内存。
| 模型名称 | 精度(比特) | 显存需求 | 内存需求 |
|---|---|---|---|
| IQ1_S | 1.58-bit | 14GB | ≥120GB |
| IQ1_M | 1.73-bit | 14GB | ≥140GB |
| IQ2_XXS | 2.22-bit | 14GB | ≥170GB |
| Q2_K_XL | 2.51-bit | 14GB | ≥200GB |
| Q4_K_M | 4-bit | 14GB | ≥382GB |
| FP16 | FP16 | 14GB | 1TB |
DeepSeek模型组本地部署本地显存占用表:
- 更多低成本部署方案+硬件采购避坑指南!: www.bilibili.com/video/BV1K7…
- 公开课部署模型:本节公开课以部署1.58bit模型为例进行演示,对应的部署流程可以拓展到任意精 度的DeepSeek-R1模型(只需要下载对应的模型权重和配置即可)。
- 本节公开课配置:
。 PyTorch 2.5.1 , Python 3.12(ubuntu22.04) ,Cuda 12.4。 操作系统: Ubuntu 22.04。 GPU: H800 * 2 (实际只使用单卡14G显存)。 CPU:40 vCPU Intel(R) Xeon(R) Platinum 8458P。 内存 :200GB DDR4
- Ktransformers部署方案核心性能瓶颈:但凡涉及到CPU+GPU混合推理,核心的性能瓶颈都是CPU 和内存性能, Ktransformers也不例外。
- 课件代码领取:
二、 KTransformers v0.24部署与调用流程 1.KTransformers项目入门介绍 1.1 项目定位 KTransformers(发音为“Quick Transformers”)旨在通过先进的内核优化和计算分布/并行化策略 来增强你使用Transformers的体验。KTransformers 是一个灵活、以 Python 为中心的框架,其核心设计理念是可扩展性。用户仅需一 行代码,即可实现优化模块的集成,并享受到以下特性:
- 与 Transformers 兼容的接口
- 符合 OpenAI 和 Ollama 规范的 RESTful API
- 一个简化版的 ChatGPT 风格 Web UI(最新版已弃用)
项目定位将 KTransformers 打造成一个灵活的平台,供用户探索和实验创新的大模型推理优化技 术。因此,项目支持编写自定义脚本来实现模型权重的灵活卸载。1.2 项目参考资料
- GitHub主页:github.com/kvcache-ai/…
- 项目使用指南: kvcache-ai.github.io/ktransforme…
- KTransformers v0.24部署流程 KTransformers支持在Windows、 Linux等操作系统下,使用源码部署或者docker工具进行部署。考虑到更为一般的企业级应用场景,本次实验采用Linux系统作为基础环境进行演示,并采用源码部署的 方法进行部署。
- 创建虚拟环境
| conda create --name kt python=3.11 conda initsource ~/.bashrcconda activate kt |
|---|
- 安装基础依赖并验证
| # 安装依赖库conda install -c conda-forge libstdcxx-ng |
|---|
| # 验证 GLIBCXX 版本(应包含 3.4.32)strings /root/miniconda3/envs/kt/lib/libstdc++.so.6 | grep GLIBCXX | | ---------------------------------------------------------------------------------------------- |
注意,这里要选择自己的anaconda或者miniconda 的安装路径
- 安装系统依赖
| sudo apt update sudo apt install libtbb-dev libssl-dev libcurl4-openssl-dev libaio1 libaio- dev libfmt-dev libgflags-dev zlib1g-dev patchelf |
|---|
注意,以上是一行命令
- 构建 ktransformers
| # 若实用AutoDL,则需先开启学术加速 # source /etc/network_turbo# 然后选择数据盘# cd /root/autodl-tmp # 克隆仓库git clone github.com/kvcache-ai/… ktransformersgit submodule update --init --recursive |
|---|
其中submodule update命令是用于进行子模块的安装, kt的子模块包括llama.cpp、 prometheus- cpp等项目。等待安装完成后可在主目录下的 third_party文件夹中看到:完整库
- 设置NUMA
为了确保Ktransformers能顺利运行,我们还需要设置单NUMA模式运行。这里我们需要先确认下服务器上有几个NUMA节点(可以简单理解为有几块CPU),我们可以通过 如下命令进行查看
| lscpu | grep "NUMA" | | -------------------- |
此时服务器上有两个NUMA节点。此外,不同的服务器也可能出现其他个数节点情况。
- 若是NUMA = 1 ,运行以下命令:
| sudo env USE_BALANCE_SERVE=1 PYTHONPATH="(dirname PATH" bash ./install.sh |
|---|
- 若是NUMA >1 ,则运行以下命令:
| # 先安装libnuma-devsudo apt install libnuma-dev # 然后设置USE_NUMA=1export USE_NUMA=1 # 最后运行脚本sudo env USE_BALANCE_SERVE=1 PYTHONPATH="(dirname PATH" bash ./install.sh # 或直接运行# sudo env USE_BALANCE_SERVE=1 USE_NUMA=1 PYTHONPATH="(dirname PATH" bash ./install.sh |
|---|
其中运行的install.sh脚本如下:顺利运行后看到如下信息:
需要注意的是,新版Ktransformers整个编译过程等待时间相对较长,需要几十分钟甚至是一 个小时左右,请耐心等待编译完成。完成后看到如下图所示:
注意,如果出现类似Target "cmTC_abfec" requires the language dialect "CUDA20", but CMake does not know the compile flags to use to enable it. 报错,或者在编译的第三个阶段报错,则说明cmake版本太低,此时需要进行升级:
| pip install cmake --upgrade source ~/.bashrc |
|---|
然后再次进行编译即可。
- 查看ktransformers版本号
一切安装完成后,即可输入如下命令查看当前安装情况
| pip show ktransformers |
|---|
3.DeepSeek R1模型权重与配置文件下载本次实验使用官方推荐的DeepSeek R1 UD-IQ1_S,直接使用Unsloth压制的模型即可,模型下载地 址:
- 魔搭社区下载地址: www.modelscope.cn/models/unsl…
- HuggingFace下载地址: huggingface.co/unsloth/Dee…
模型权重较大,总共约130G左右。若使用HuggingFace进行下载,则需要一些网络工具。 AutoDL学术加速方法介绍: www.autodl.com/docs/networ…
- 【可选】借助 screen持久化会话
由于实际下载时间可能持续2个小时,因此最好使用screen开启持久化会话,避免因为关闭会话导 致下载中断。
| screen -S kt |
|---|
创建一个名为kt的会话。之后哪怕关闭了当前会话,也可以使用如下命令
| screen -r kt |
|---|
若未安装screen,可以使用 sudo apt install screen命令进行安装。
- 使用魔搭社区进行下载
使用modelscope进行权重下载,需要先安装魔搭社区
| pip install modelscope |
|---|
然后输入如下命令进行下载
| mkdir ./DeepSeek-R1-GGUF |
|---|
| modelscope download --model unsloth/DeepSeek-R1-GGUF --include 'Q4_K_M' --local_dir /root/autodl-tmp/DeepSeek-R1-GGUF |
|---|
相关文件可以在课件网盘中领取:
- 下载DeepSeek R1原版模型的配置文件
此外,根据KTransformer的项目要求,还需要下载DeepSeek R1原版模型的除了模型权重文件外 的其他配置文件,方便进行灵活的专家加载。因此我们还需要使用modelscope下载DeepSeek R1 模型除了模型权重( .safetensor)外的其他全部文件,可以按照如下方式进行下载
| mkdir ./DeepSeek-R1 |
|---|
| modelscope download --model deepseek-ai/DeepSeek-R1 --exclude '*.safetensors' --local_dir /root/autodl-tmp/DeepSeek-R1 |
|---|
下载后完整文件如下所示:
相关文件也可以在课程课件中领取:
- 成果汇总
这里最终我们是下载了DeepSeek UD-IQ1_S模型权重和DeepSeek R1的模型配置文件,并分别保存 在两个文件夹中:
- DeepSeek R1 UD-IQ1_S模型权重地址: /root/autodl-tmp/DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S
- DeepSeek R1的模型配置文件地址: /root/autodl-tmp/DeepSeek-R1
4.DeepSeek V3-0324 模型权重与配置文件下载接下来我们继续下载DeepSeek-V3-0324模型权重与配置文件。不同于R1模型是推理模型, V3-0324 模型是对话模型,但由于其出色的Agent能力(Function calling能力), V3-0324模型在很多场景下也有 很多实际应用需求。由于R1和V3模型架构完全相同,因此Ktransformers也是可以调用V3模型来进行响 应的。本次实验使用官方推荐的DeepSeek-V3-0324 Q2_K_XL(1.58bit模型目前不太稳定)模型,该模型 也是目前最稳定的动态量化模型,需要14G显存+170G内存即可调用。
- 魔搭社区下载地址: www.modelscope.cn/models/unsl…
- HuggingFace下载地址: huggingface.co/unsloth/Dee…
- 使用魔搭社区进行下载 输入如下命令进行下载
| mkdir ./DeepSeek-V3-0324-GGUF |
|---|
| modelscope download --model unsloth/DeepSeek-V3-0324-GGUF --include 'Q4_K_M' --local_dir /root/autodl-tmp/DeepSeek-V3-0324-GGUF |
|---|
- 下载DeepSeek V3原版模型的配置文件
| mkdir ./DeepSeek-V3-0324 |
|---|
| modelscope download --model deepseek-ai/DeepSeek-V3-0324 --exclude '*.safetensors' --local_dir /root/autodl-tmp/DeepSeek-V3-0324 |
|---|
下载后完整文件如下所示:
相关文件也可以在课程课件中领取:
- 成果汇总
这里最终我们是下载了DeepSeek V3 Q2_K_XL模型权重和DeepSeek V3的模型配置文件,并分别保 存在两个文件夹中:
- DeepSeek V3 Q2模型权重地址: /root/autodl-tmp/DeepSeek-V3/UD-Q2_K_XL
- DeepSeek V3 IQ2的模型配置文件地址: /root/autodl-tmp/DeepSeek-V3-0324
三、 KTransformer v0.24版调用DeepSeek运行流程 在安装完成了KTransformer v0.24,并下载好了模型权重和相应的模型配置之后,接下来即可尝试进行调用了。 KTransformer v0.24支持两种调用方法,分别借助 local_chat.py进行命令行本地对话, 以及实用 server/main.py开启服务,然后在默认10002端口进行OpenAI风格的API调用。这里我们重 点尝试使用后端服务模式调用DeepSeek模型。1.DeepSeek-R1调用流程部署完成后,即可使用如下命令开启后端服务,并在10002端口实现OpenAI风格API调用。这里需 要输入如下命令:
| python ktransformers/server/main.py --port 10002 --model_path /root/autodl-tmp/DeepSeek-R1 --gguf_path /root/autodl-tmp/DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S --optimize_config_path ktransformers/optimize/optimize_rules/DeepSeek-V3-Chat-serve.yaml --max_new_tokens 1024 --cache_lens 32768 --chunk_size 256 --max_batch_size 4 --backend_type balance_serve |
|---|
等待响应如下:然后即可在命令行输入如下命令进行调用:
| curl -X POST http://localhost:10002/v1/chat/completions -H "accept: application/json" -H "Content-Type: application/json" -d '{"messages": [{"role": "user", "content": "你好,好久不见"} ],"model": "DeepSeek-R1","temperature": 0.3,"top_p": 1.0,"stream": true }' |
|---|
即可获得如下响应:当然,我们也可以直接在Jupyter中尝试对其进行调用:
| from openai import OpenAI # 实例化客户端client = OpenAI(api_key="None",base_url="http://localhost:10002/v1") # 调用 deepseek-R1 模型response = client.chat.completions.create( model="DeepSeek-R1",messages=[{"role": "user", "content": "你好,好久不见 !"}]) # 输出生成的响应内容print(response.choices[0].message.content) |
|---|
响应结果如下所示:2.DeepSeek-V3-0324 调用流程可使用如下命令开启后端服务,并在10002端口实现OpenAI风格API调用。这里需要输入如下命令:
| python ktransformers/server/main.py --port 10002 --model_path /root/autodl-tmp/DeepSeek-V3-0324 --gguf_path /root/autodl-tmp/DeepSeek-V3-0324-GGUF/UD-Q2_K_XL \ --max_new_tokens 1024 --cache_lens 32768 --chunk_size 256 --max_batch_size 4 --backend_type balance_serve |
|---|
等待响应如下:然后即可在命令行输入如下命令进行调用:
| curl -X POST http://localhost:10002/v1/chat/completions -H "accept: application/json" -H "Content-Type: application/json" -d '{"messages": [{"role": "user", "content": "你好,好久不见"} ],"model": "DeepSeek-V3-0324","temperature": 0.3,"top_p": 1.0,"stream": true }' |
|---|
即可获得如下响应:当然,我们也可以直接在Jupyter中尝试对其进行调用:
| from openai import OpenAI # 实例化客户端 client = OpenAI(api_key="None", base_url="http://localhost:10002/v1") # 调用 deepseekv3 模型 response = client.chat.completions.create( model="DeepSeek-V3-0324", messages=[ {"role": "user", "content": "你好,好久不见!"} ] ) # 输出生成的响应内容 |
|---|
响应结果如下所示:
为每个人提供最有价值的技术赋能!【公益】大模型技术社区已经上线!
内容完全免费,涵盖20多套工业级方案 + 10多个企业实战项目 + 400万开发者筛选的实战精华~不定期开展大模型硬核技术直播公开课,对标市面千元价值品质,社区成员限时免费听喔!
📍完整视频讲解+学习课件+项目源码包获取⬇️请点击原文进入赋范大模型技术社区即可领取~