news 2026/9/13 16:43:16

KTransformers 混合推理实战:在 24GB 显存台式机上运行 671B 的 DeepSeek-R1/V3

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KTransformers 混合推理实战:在 24GB 显存台式机上运行 671B 的 DeepSeek-R1/V3

KTransformers 混合推理实战:在 24GB 显存台式机上运行 671B 的 DeepSeek-R1/V3

【免费下载链接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations项目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers

本篇基于仓库中的 DeepSeek-R1/V3 中文教程,完整还原 KTransformers 如何在单张 24GB 显存(4090D)+ 382GB~1TB 内存的台式机上,通过 CPU/GPU 异构卸载运行 671B 参数的 DeepSeek-R1/V3 量化模型。读完你将掌握local_chat.py单并发与server/main.py多并发两类运行方式、balance_serve后端与注入规则(optimize_rules)的配置方法,以及 AMX 内核与"选择性专家激活"两大加速手段的落地细节。

一、方案前提:为什么 24GB 显存能跑 671B 模型

DeepSeek-V3/R1 有 671B 参数、256 个路由专家,单卡显然放不下。KTransformers 的核心思路是按 DeepSeek 的 MoE 架构做职责切分:把计算密集、但参数庞大的专家(experts)矩阵乘法卸载到 CPU 内存,把MLA 注意力与 KVCache 卸载到 GPU。文档在"一些解释"一节把这一点归纳为:

与传统的基于层或 KVCache 卸载(如 llama.cpp 中的)不同,我们将专家计算卸载到 CPU,将 MLA/KVCache 卸载到 GPU,与 DeepSeek 的架构完美对齐,实现最佳效率。

这套切分之所以成立,是因为 DeepSeek 的 MLA 算子本身是计算密集型——"虽然全部在 CPU 上运行是可行的,但将繁重的计算任务卸载到 GPU 上能带来巨大的性能提升"。而 CPU 侧选择 Intel 平台,文档给出的理由是"英特尔目前是唯一支持 AMX 类似指令的 CPU 供应商,与仅支持 AVX 的替代方案相比,性能显著更好"。

先决条件(硬件基准)

文档声明的"最佳性能测试"配置为:

  • CPU:Intel(R) Xeon(R) Gold 6454S,1T 内存(2 个 NUMA 节点),每插槽 32 核心,共 2 插槽 / 2 NUMA 节点
  • GPU:4090D 24GB 显存
  • 内存:标准 DDR5-4800 服务器内存(1TB)

说明:不同量化与版本对内存/显存下限不同,见下文基准章节。单插槽 32 核心 + 382GB 内存是 V0.2 的最低门槛;V0.3-Preview(BF16 在线量化)则上升到 644GB 内存。

二、基准测试结果

以下数据与命令均来自原文档,用于横向对比 KTransformers 与 llama.cpp 在同一台双插槽 64 核心机器上的表现。

V0.2(Q4_K_M 量化,382GB 内存)

设置:

  • Model:DeepseekV3-q4km(int4)
  • CPU:Xeon Gold 6454S,每插槽 32 核心,2 插槽,2 NUMA 节点
  • GPU:4090D 24GB 显存
  • 测试在充分预热后进行

内存占用:

  • 单插槽:382GB 内存,至少 14GB 显存
  • 双插槽:1T 内存,至少 14GB 显存

基准测试结果("6 个专家"情形属于 V0.3 预览版内容):

Prompt(500 tokens)双插槽 Ktrans(6 个专家)双插槽 Ktrans(8 个专家)单插槽 Ktrans(6 个专家)单插槽 Ktrans(8 个专家)llama.cpp(8 个专家)
预填充(Prefill)token/s97.3282.9465.1454.2110.31
解码(Decode)token/s13.6912.20810.3038.734.51

最高加速比:解码 3.03 倍,预填充 9.44 倍。

V0.3-Preview(BF16 在线量化,AMX + 选择性专家)

设置:

  • Model:DeepseekV3-BF16(在线量化为 CPU 的 int8 和 GPU 的 int4)
  • CPU:Xeon Gold 6454S,每插槽 32 核心,2 插槽,2 NUMA 节点
  • GPU:(1~4)× 4090D 24GB 显存(更长的 prompt 需要更多显存)

内存占用:644GB 内存,至少 14GB 显存。

基准测试结果:

Prompt 长度1K2K4K8K
KTrans(8 个专家)Prefill token/s185.96255.26252.58195.62
KTrans(6 个专家)Prefill token/s203.70286.55271.08207.20

KTrans V0.3 的预填充比 V0.2 快 3.45 倍,比 llama.cpp 快 27.79 倍;解码速度与 V0.2(6 个专家版)相同,故省略。

文档将主要加速来源归结为两点:

  • 英特尔 AMX 指令集+ 专门设计的缓存友好内存布局;
  • 专家选择策略:根据离线配置文件结果选择更少的专家。

对减少激活专家数量而质量不变的判断,文档原文是:

从我们对 DeepSeekV2、DeepSeekV3 和 DeepSeekR1 的研究中,当我们略微减少推理中的激活专家数量时,输出质量没有变化。但解码和预填充的速度加快了,这令人鼓舞。

三、运行方式

仓库现状说明:本文教程对应的是 v0.2 / v0.3 时期的仓库布局。当前仓库已重构——旧版ktransformersPython 包整体移入archive/ktransformers/,高性能 CPU 内核独立为kt-kernel/,顶层 install.sh 也改写为 "sglang + kt-kernel" 一键安装脚本。因此下文命令中的路径以当前仓库实际位置为准:local_chat.pyserver/main.py、注入规则与旧版安装脚本都位于archive/下,AMX 专家内核位于 kt-kernel/operators/amx/。

1. 多并发展示(balance_serve 后端)

多并发需要额外编译调度器 C++ 代码。依赖与启动流程如下(依赖安装与git submodule update --init --recursive为文档原始步骤):

sudo apt install libtbb-dev libssl-dev libcurl4-openssl-dev libaio1 libaio-dev libfmt-dev sudo apt-get install libgflags-dev zlib1g-dev patchelf git submodule update --init --recursive # 如果使用双 numa 版本 USE_BALANCE_SERVE=1 USE_NUMA=1 bash ./install.sh # 如果使用单 numa 版本 USE_BALANCE_SERVE=1 bash ./install.sh # 启动命令 python ktransformers/server/main.py \ --model_path <your model path> \ --gguf_path <your gguf path> \ --cpu_infer 62 \ --optimize_config_path <inject rule path> \ --port 10002 \ --chunk_size 256 \ --max_new_tokens 1024 \ --max_batch_size 4 \ --cache_lens 32768 \ --backend_type balance_serve

(对应实现入口为 server/main.py。)

路径参数说明:

  • <your model path>:本地路径或在线模型名(如deepseek-ai/DeepSeek-V3)。在线连接有问题时可尝试镜像。
  • <your gguf path>:也支持在线路径,但体量大,建议下载并量化后使用目录路径
  • <inject rule path>:注入规则 yaml 文件地址。仓库在 optimize_rules 目录 提供了 DeepSeek-V3-Chat-serve.yaml 与 DeepSeek-V3-Chat-fp8-linear-ggml-experts-serve.yaml,分别对应 Q4_K_M 与 hybrid 两类权重。

关键命令行参数(对应 local_chat.py 的入参签名,可交叉印证):

参数含义
--max_new_tokens 1024最大输出 token 长度。若答案被截断可增大,但会增加显存压力并降低生成速度
--chunk_size 256引擎单次运行最大 token 数
--cache_lens 32768调度器申请的 KVCache 总长度;所有请求共享 32768 token 对应的 KVCache,请求完成后释放占用空间
--backend_type balance_servev0.2.4 新增的多并发后端引擎;原单并发引擎为ktransformers
--max_batch_size 4引擎单次运行最多处理的请求数(prefill + decode),仅用于balance_serve
--cpu_infer 62使用的 CPU 核心数(详见下文"一些解释")

多并发场景额外有numactl -N 1 -m 1的目的:避免 NUMA 节点之间的数据传输。测试 R1 时若跳过思考,可加--force_think,见文末 FAQ。

2. V0.2 展示

单插槽版本(32 核心)
git submodule init git submodule update numactl -N 1 -m 1 python ./ktransformers/local_chat.py \ --model_path <your model path> \ --gguf_path <your gguf path> \ --prompt_file <your prompt txt file> \ --cpu_infer 33 \ --max_new_tokens 1000 # 看到聊天提示后,按回车键加载文本提示文件
双插槽版本(64 核心)

双插槽需在安装前设置环境变量USE_NUMA=1export USE_NUMA=1;若已安装,需重新安装并带上该环境变量):

git submodule init git submodule update export USE_NUMA=1 make dev_install # 或 sh ./install.sh python ./ktransformers/local_chat.py \ --model_path <your model path> \ --gguf_path <your gguf path> \ --prompt_file <your prompt txt file> \ --cpu_infer 65 \ --max_new_tokens 1000 # 看到聊天提示后,按回车键加载文本提示文件

参数含义与单插槽相同,仅因双插槽把cpu_infer提到 65。

3. V0.3 展示(双插槽 64 核心,wheel 包)

V0.3 预览版当时提供二进制 wheel 分发,从本仓库对应 Release 页面下载ktransformers-0.3.0rc0+cu126torch26fancy-cp311-cp311-linux_x86_64.whl后安装即可:

# 从 Release 下载对应 wheel 后 pip install ./ktransformers-0.3.0rc0+cu126torch26fancy-cp311-cp311-linux_x86_64.whl python -m ktransformers.local_chat \ --model_path <your model path> \ --gguf_path <your gguf path> \ --prompt_file <your prompt txt file> \ --cpu_infer 65 \ --max_new_tokens 1000 # 看到聊天提示后,按回车键加载文本提示文件

参数含义与 V0.2 相同,双插槽故cpu_infer设为 65。

四、参数与实现的源码印证

local_chat.py的入参签名能直接印证上述命令参数真实存在。在 archive/ktransformers/local_chat.py 中可看到:

max_new_tokens: int = 1000, cpu_infer: int = Config().cpu_infer, prompt_file: str | None = None, force_think: bool = False, ... Config().cpu_infer = cpu_infer
  • cpu_infer通过Config().cpu_infer注入全局配置;文档强调"超过物理核心数量是可以的,但并不是越多越好,应根据实际核心数量适当降低"。
  • prompt_file在交互中被读取后作为输入(content = open(prompt_file, "r").read()),并拼入max_new_tokens一并下发到model.generate
  • force_think默认False,用于控制 R1 是否强制进入思考模式。

五、混合推理架构:从注入规则看"专家到 CPU、MLA 到 GPU"

文档描述的卸载策略,在注入规则 yaml 中有逐算子的落地。以 DeepSeek-V3-Chat-serve.yaml 为例,其中把每层self_attnmlp.experts替换为自定义 MoE 内核,并显式声明设备路由:

- match: name: "^model\\.layers\\..*\\.mlp\\.experts$" replace: class: ktransformers.operators.experts.KTransformersExpertsV2 # custom MoE Kernel with expert paralleism kwargs: prefill_device: "cuda" prefill_op: "KExpertsTorch" generate_device: "cpu" generate_op: "KExpertsCPU" out_device: "cuda" recursive: False

这段规则正是"专家解码走 CPU(KExpertsCPU)、预填充走 GPU(KExpertsTorch)、输出回到 CUDA"的声明式表达;同时self_attn被替换为优化过的 MLA 实现(balance_serve_attention.flashinfer_attn),lm_headlinear使用 Marlin/Torch 量化算子。换言之,注入规则文件就是文档所述"架构对齐"的可执行配置<inject rule path>直接决定哪些算子落在哪块设备。

AMX 加速内核的当前源码位于 kt-kernel/operators/amx/(含moe.hppfp8-moe.hppfp8-perchannel-moe.hppk2-moe.hpp等专家算子),配套基准脚本如 bench_k2_moe_amx.py、bench_moe_amx.py 可用于在 Intel 平台上复现 AMX 专家内核的性能。文档同时说明 NUMA 复制的取舍:

为了避免节点之间的数据传输成本,我们在两个节点上 "copy" 了关键矩阵,这会增加内存占用,但会加速预填充和解码过程……加载权重时速度较慢,因此加载时请耐心等待并监控内存使用情况。

六、常见问题(FAQ)

R1 不返回思考过程

测试 R1 时可能跳过思考。解决方法是追加参数:

--force_think true

该参数在 local_chat.py 中以force_think: bool = False定义。更多问题见 FAQ。

七、适用前提与限制小结

  • 本文数据与命令基于 v0.2 / v0.3 时期的 DeepSeek-V3/R1 量化方案(Q4_K_M 或 BF16 在线量化)。V0.3 的 AMX 加速强依赖 Intel AMX 指令集,非 AMX 平台仅能获得 AVX 级别性能。
  • 显存下限约 14GB(单卡 24GB 足够),内存占用随版本/量化在 382GB~1TB 之间波动。
  • 当前仓库已把旧版推理包移入archive/,并把内核收敛到kt-kernel/,最新的推理/微调入口以 kt-kernel 及其 README 为准;本文保留 v0.2/v0.3 的复现命令以便历史对照。
  • 文档"问题"一节列出的当时遗留项(服务器集成、local_chat多行输入支持)属于历史状态,是否修复请以当前仓库代码为准。

【免费下载链接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations项目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 16:41:48

Qt自定义滑动开关控件开发全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:41:03

LightGBM FAQ 实战指南:从配置参数到环境问题的全面排查手册

LightGBM FAQ 实战指南&#xff1a;从配置参数到环境问题的全面排查手册 【免费下载链接】LightGBM A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classificatio…

作者头像 李华
网站建设 2026/9/13 16:40:40

固定波束形成:麦克风阵列语音增强的稳定基础与工程实践

简介&#xff1a;一份面向语音增强与麦克风阵列信号处理学习者与开发者的固定波束形成MATLAB实现。代码以BeamF.m为核心&#xff0c;完整呈现从阵列信号预处理、波束形成参数配置、各麦克风通道权重计算到目标方向语音信号合成的处理流程&#xff0c;并含增强效果评估环节&…

作者头像 李华
网站建设 2026/9/13 16:40:38

一次性挂上109个Tracker:BT下载提速的trackerslist完整教程

一次性挂上109个Tracker&#xff1a;BT下载提速的trackerslist完整教程 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist BT客户端速度卡在几十KB/s、连接人数只有个位数&…

作者头像 李华
网站建设 2026/9/13 16:40:15

STM32电子秤工程级设计:信号链+状态机+EMC实战

1. 这不是“又一个电子秤Demo”&#xff0c;而是一套可直接上产线的计价系统工程包我第一次在车间看到这台基于STM32F103C8T6做的电子秤时&#xff0c;它正稳稳托着三公斤山药&#xff0c;液晶屏上跳动着“18.60”——不是静态显示&#xff0c;是实时动态刷新&#xff0c;单价、…

作者头像 李华
网站建设 2026/9/13 16:40:06

STM32嵌入式双模协同测频:输入捕获+FFT动态带宽优化

1. 项目概述&#xff1a;为什么在STM32上同时用输入捕获和FFT测频&#xff0c;不是“重复造轮子”&#xff0c;而是解决真实痛点 你手头有一台老式工业传感器&#xff0c;输出的是带噪声的正弦波信号&#xff0c;频率范围在50Hz到2kHz之间&#xff0c;但信号幅度会随工况剧烈波…

作者头像 李华