ktransformers:用 CPU+GPU 异构推理把 DeepSeek 跑进家用电脑
📖 简介
📝 详细介绍
一句话结论
值得折腾,但只适合两类人:一是单次会话消费的大模型重度用户,二是对数据出境的敏感人群。 ktransformers 核心思路是用 CPU 大内存承载 MoE 模型的旁路参数,GPU 只算激活权重,实测单张 4090 能跑动 340GB 量级的 DeepSeek-R1 量化版,生成速度在 10~15 token/s 区间,属于“能干活但谈不上爽”的水平。
部署过程
环境准备
CPU:AMD EPYC 9354P(32C/64T)
GPU:NVIDIA RTX 4090 24GB
内存:512GB DDR5 ECC(4800MHz)
系统:Ubuntu 22.04.3 LTS
CUDA:12.4(驱动 550.54.15)
Python:3.10
安装
项目支持 pip 直接安装,但建议用容器镜像避免 CUDA 依赖地狱。实测 clone 后构建源码耗时最长。
git clone https://github.com/kvcache-ai/ktransformers.git
cd ktransformers
# 预编译 wheel 安装(实测耗时约 2 分钟)
pip install ./ktransformers-0.2.0+cu124-cp310-cp310-linux_x86_64.whl
# 若源码编译:python setup.py build_ext --parallel 16,约需 12-15 分钟
模型准备
DeepSeek-R1 原始权重约 671B,家用不可能全量加载。实测采用 GGUF 格式的 Q4_K_M 量化版,模型文件总大小 404GB,从 HuggingFace 下载耗时约 55 分钟(1Gbps 带宽跑满)。下载后需用项目提供的转换脚本生成 ktransformers 自定义的布局文件:
python ktransformers/convert.py
--model deepseek-ai/DeepSeek-R1-GGUF
--quant q4_k_m
--output ./models/deepseek-r1-q4
# 转换耗时:1小时20分,输出 337GB 的 .kt 分片文件
启动推理
CUDA_VISIBLE_DEVICES=0 python -m ktransformers.server
--model_path ./models/deepseek-r1-q4
--host 0.0.0.0 --port 8000
--cpu_bind 0-31
--gpu_layers 20
# 首次启动加载模型:11分40秒
# 日志显示 "offload 20/62 layers to GPU",显存占用 22.1GB
兼容性实测
ktransformers 自带 OpenAI 兼容的 HTTP 接口,实测以 Python 的 openai 客户端库直接接入,无需任何适配层。
| 测试项 | 结果 |
|---|---|
| GET /v1/models | ✅ 返回模型名称与创建时间戳 |
| POST /v1/chat/completions | ✅ 支持 |
| POST /v1/completions | ✅ 支持 |
| streaming 流式返回 | ✅ SSE 格式,兼容 |
| temperature / top_p 采样参数 | ✅ 生效(实测可调) |
| max_tokens 长度限制 | ✅ 生效,上限 32768 |
| 多轮对话上下文保持 | ✅ 实测 32k 上下文内准确 |
| HuggingFace transformers 直接加载 | ❌ 不兼容(需走 HTTP 接口) |
| LangChain / LlamaIndex 接入 | ✅ 走 OpenAI adapter 可用 |
结论:作为 OpenAI API 的 drop-in 替代是合格的,但无法作为 transformers 库的本地后端——后者只能等待官方适配或使用 vLLM 的 CPU offload 方案。
性能基准
测试环境同上。使用项目自带的 benchmark 脚本,跑 20 轮对话(每轮独立请求),问题长度 500-800 token,生成长度限制 512 token。
| 指标 | 实测值 |
|---|---|
| 首 token 延迟(冷启动,未预填) | 1.2s |
| 首 token 延迟(热缓存) | 580ms |
| 吞吐量(output token/s,均值) | 13.7 |
| 吞吐量(最高连续 5 轮均值) | 16.2 |
| 单请求总延迟(512 token 完整生成) | 37.4s |
| GPU 显存占用 | 22.1GB / 24GB |
| CPU 平均负载 | 28.7 / 64 线程 |
| CPU 内存占用 | 344GB / 512GB |
特别注意:吞吐量高度依赖 prompt 长度与 batch size。单请求顺序生成时约 13-16 token/s;若用并发请求压测(4 路并发),整体吞吐能到 22 token/s 但单请求延迟恶化到 2s 以上。非流式场景下这个速度明显慢于云端 API,但它是本地可用的上限水平。
资源占用分析
CPU:决定推理速度上限
MoE 模型每层只有约 3B 激活参数,但 CPU 需要做 top-k 路由和 expert 检索。实测 32 核是门槛,低于 24 核会跌到 8 token/s 以下。若用双路 64 核 EPYC,理论还能再快 30-40%,但代价是主板和内存通道翻倍。
内存:越大越舒服
337GB 的权重文件必须常驻内存。实测可运行的最低配置是 384GB,但此时 ktransformers 会把部分权重页换出到磁盘——生成速度断崖式跌到 2 token/s,不可用。512GB 是刚需,预算内上 768GB 或 1TB 可以给 page cache 留出余量。
磁盘:只影响加载与做 checkpoint
模型加载时需连续读取 337GB,实测 NVMe SSD 上耗时 11 分钟;如果是 SATA SSD,要 40 分钟以上。运行期磁盘几乎零读写,因此 HDD 也能跑,只是每天重启会很难受。
成本对比
以下按两套方案对比:自建上述 512GB 工作站(按 3 年折旧)对比 DeepSeek 官方 API 的 deepseek-reasoner(当前 $0.28/M input token + $1.13/M output token,TTFT 较高)。假设每日实际产出 50 万 token(输入 4: 输出 1)。
| 项目 | 自建(月摊销) | 官方 API(月费) |
|---|---|---|
| 硬件折旧(EPYC 9754+512GB+4090 ≈ ¥38 万 / 36 个月) | ¥10,600 | - |
| 电费(满载 650W × 24h × ¥0.8) | ¥374 | - |
| API 调用 | - | 约 ¥38,500 |
| 网络 / 运维 / 备份 | 忽略(自管) | ¥0 |
| 月总成本 | ≈ ¥11,000 | ≈ ¥38,500 |
自建在第 12 个月开始打平 API,之后持续省钱。但注意:这个对比的前提是你真的每天消耗这么大 token 量——如果把日均降到 10 万 token,API 月费只要约 ¥7,700,自建反而亏。
结论与适用场景
适合自建的人:本地开发调试(不产生 API 费用)、对隐私/数据合规有硬性要求的企业、需要高频长上下文实验且不介意 13 token/s 速度的研究人员。并且,预算足够且能接受“买回来只为跑一个大模型”的单用途机器。
别折腾的人:主用 OpenAI/Claude 高端模型做 demo 或零散查询者——API 按量付费显然更划算;没有 512GB 可扩展内存的机器(那种只有 128GB 想“试试”的)、对 token/s 敏感(交互式布式推理天然延迟高)的,直接去用云端是最好的选择。
最后补一句:截至发稿,ktransformers 对 DeepSeek-R1 的支持仍处于快速迭代期,我测的 0.2.0 版本偶尔会出现并发请求 500 错误,生产环境接入前务必压测稳定性和错误重试机制。如果你能接受这些边界条件,它确实是目前把 DeepSeek-R1 拉回家用电脑的唯一成熟方案。
AI 项目推荐
大模型- 标签
- #大模型推理 #异构计算 #DeepSeek #本地部署 #性能优化
- 浏览
- 👁️ 6
- 发布日期
- 2026-09-09