简述
KTransformers 是一个清华开源的LLM部署框架,主要用于优化大型语言模型(LLM)的推理过程。它通过先进的内核优化、GPU/CPU 异构计算和并行策略,显著提升模型推理速度并降低硬件需求。以下是它的主要用途:
- 高效本地部署:KTransformers 允许在消费级硬件(如 24GB 显存的 RTX 4090)上运行超大模型,例如 DeepSeek-R1 和 V3 的 671B 参数版本,降低了对高端服务器的依赖。
- 性能优化:通过量化技术(如 4-bit 量化)、稀疏注意力机制和 MoE(混合专家模型)架构优化,KTransformers 可实现 3-28 倍的推理速度提升,预填充速度最高达 286 tokens/s,生成速度约 14 tokens/s。
- 灵活接口:提供与 Hugging Face Transformers 兼容的接口、OpenAI 和 Ollama 标准的 RESTful API,以及类似 ChatGPT 的网页界面,方便开发者集成到各种应用中。
- 支持长上下文:支持 4K 至 8K 的上下文长度,适合处理长序列任务。
常规安装做法
下载Deepseek R1 量化模型
HF_HUB_ENABLE_HF_TRANSFER=1 \
huggingface-cli \
download unsloth/DeepSeek-R1-GGUF \
--include="DeepSeek-R1-UD-Q2_K_XL/*.gguf" \
--local-dir ./
因为kransformers 还在迭代,官方给出了一个稳定版的提交位置
git clone https://github.com/kvcache-ai/ktransformers.git
cd ktransformers
git submodule init # submodule "third_party/llama.cpp", [submodule "third_party/pybind11"]
git submodule update
git checkout 7a19f3b
git rev-parse --short HEAD # 7a19f3b
安装
This picks up where the above Install ktransformers
instructions leave off above.
# install additional build dependencies including CUDA toolkit etc. e.g.
# sudo apt-get install build-essentials cmake ...
source venv/bin/activate
uv pip install -r requirements-local_chat.txt
uv pip install setuptools wheel packaging
# Recommend skipping optional website app and use `open-webui` or `litellm` etc.
cd ktransformers/website/
npm install @vue/cli
npm run build
cd ../..
# If you have enough CPU cores and memory you can speed up builds
# $ export MAX_JOBS=8
# $ export CMAKE_BUILD_PARALLEL_LEVEL=8
# Install flash_attn
uv pip install flash_attn --no-build-isolation
# Optional Experimental flashinfer instead of triton
# I do *not* recommend this yet unless you are already successful advanced user
# $ uv pip install flashinfer-python
# ONLY IF you have Intel dual socket and >1TB RAM to hold 2x copies of entire model in RAM (one copy per socket)
# Dual socket AMD EPYC NPS0 probably makes this not needed?
# $ export USE_NUMA=1
# Install ktransformers
KTRANSFORMERS_FORCE_BUILD=TRUE uv pip install . --no-build-isolation
# DONE, Continue below!
# *NOTE* You may get build errors on very new ARCH with latest nvcc see build error log at bottom of this document.
# If you want to rebuild again, first make clean like so
uv pip uninstall ktransformers
rm -rf ktransformers/ktransformers_ext/build
rm -rf ktransformers/ktransformers_ext/cuda/build
rm -rf ktransformers/ktransformers_ext/cuda/dist
rm -rf ktransformers/ktransformers_ext/cuda/*.egg-info
# if you want to build a distributable python cheese .whl (e.g. from inside a Dockerfile to use elsewhere)
KTRANSFORMERS_FORCE_BUILD=TRUE uv build
# uv pip install ./dist/ktransformers-0.2.2rc1+cu120torch26fancy-cp311-cp311-linux_x86_64.whl
# TODO: might be able to change release version tag with
# $ grep version ktransformers/__init__.py
# __version__ = "0.2.2rc1"
运行ktransformers
# Start up local chat API endpoint
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True python3 ktransformers/server/main.py \
--gguf_path /opt/chenrui/ktransformers/DeepSeek-R1-UD-Q2_K_XL/ \
--model_path deepseek-ai/DeepSeek-R1 \
--model_name unsloth/DeepSeek-R1-UD-Q2_K_XL \
--cpu_infer 16 \
--max_new_tokens 8192 \
--cache_lens 32768 \
--total_context 32768 \
--cache_q4 true \
--temperature 0.6 \
--top_p 0.95 \
--optimize_config_path ./optimize/optimize_rules/DeepSeek-V3-Chat.yaml \
--force_think \
--use_cuda_graph \
--host 0.0.0.0 \
--port 8080
一键安装脚本
最近发现有个很便捷的Ktransformers部署脚本,github地址在
https://github.com/maaaxinfinity/ktrunhttps://github.com/maaaxinfinity/ktrun
配置安装启动
修改下run.sh了conda 地址寻找
# 检查系统目录
local system_conda_paths=(
"/opt/miniconda3/bin/conda"
)
for conda_path in "${system_conda_paths[@]}"; do
if [ -f "$conda_path" ]; then
found_conda=1
found_conda_path=$conda_path
echo -e "${GREEN}✓ 在系统目录找到conda: ${conda_path}${NC}"
break
fi
done
按装报错
Building wheels for collected packages: ktransformers
Building editable for ktransformers (pyproject.toml) ... error
....subprocess.CalledProcessError: Command '['cmake', '/opt/chenrui/ktrun/workspace/csrc/ktransformers_ext', '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/tmp/tmpji3py1fs.build-lib/', '-DPYTHON_EXECUTABLE=/opt/miniconda3/bin/python', '-DCMAKE_BUILD_TYPE=Release', '-DKTRANSFORMERS_USE_CUDA=ON', '-D_GLIBCXX_USE_CXX11_ABI=0', '-DLLAMA_NATIVE=ON', '-DEXAMPLE_VERSION_INFO=0.2.4.post1']' returned non-zero exit status 1.
[end of output]note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building editable for ktransformers
Failed to build ktransformers
ERROR: Could not build wheels for ktransformers, which is required to install pyproject.toml-based projects
[ERROR] 使用pip安装也失败
问题分析
我是通过 source /opt/rh/devtoolset-9/enable 启用了 devtoolset-9 的 GCC 9.3.1 环境,但仍然遇到 CMake 报错,主要是因为链接器(ld)无法处理系统 glibc 中较新的 .relr.dyn 段,导致无法找到 /lib64/libc.so.6 和 /lib64/ld-linux-x86-64.so.2。这表明 devtoolset-9 的链接器版本(基于 GCC 9.3.1)与系统的 glibc 版本不兼容
- 链接器不兼容:devtoolset-9 的链接器(ld)版本较旧(可能是 2.30 或类似版本),不支持系统 glibc 中的 .relr.dyn 段(通常出现在 glibc 2.28+)。
- 系统环境:你可能在 CentOS 7 或类似系统上(因为 devtoolset-9 常用于此),但系统 glibc 可能被升级到较新版本(例如通过自定义安装或容器环境),导致不兼容。
- devtoolset-9 的隔离环境:source /opt/rh/devtoolset-9/enable 虽然设置了 gcc 和 g++,但可能未正确配置与系统库的链接路径。
修复方法
针对 devtoolset-9 环境进行修复
1. 检查编译器和链接器 devtoolset-9 环境
echo $PATH
echo $LD_LIBRARY_PATH
确保 /opt/rh/devtoolset-9/root/usr/bin 在 PATH 中优先,且 /lib64 在 LD_LIBRARY_PATH 中。确保链接器可以找到正确的库文件:
ls -l /lib64/libc.so.6
ls -l /lib64/ld-linux-x86-64.so.2
这些文件通常是符号链接,指向实际的 glibc 版本(如 libc-2.17.so)。 设置 LD_LIBRARY_PATH: 如果库路径缺失,添加
export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH
运行还是报错了 还是报错 /opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: cannot find /lib64/ld-linux-x86-64.so.2
错误原因分析
- 链接器隔离环境:
- devtoolset-9(/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld)运行在一个隔离的工具链环境中,可能忽略了系统的标准库路径(/lib64)。
- 即使你设置了 LD_LIBRARY_PATH,链接器可能不直接使用此环境变量,而是依赖内部配置或特定的搜索路径。
- 文件不兼容:
- 错误提示 cannot find /lib64/ld-linux-x86-64.so.2,但之前日志提到 unknown type [0x13] section .relr.dyn 和 skipping incompatible /lib64/ld-linux-x86-64.so.2。
- 这表明 /lib64/ld-linux-x86-64.so.2(动态链接器)可能与 devtoolset-9 的 ld 不兼容,可能是因为:
- ld-linux-x86-64.so.2 属于较新的 glibc 版本(例如 2.28+),而 devtoolset-9 的 ld(基于 GCC 9.3.1)不支持其新特性(.relr.dyn)。
- 架构或格式不匹配(例如,文件可能是符号链接,指向不兼容的实际库)。
- 符号链接问题:
- /lib64/ld-linux-x86-64.so.2 通常是符号链接,指向实际的动态链接器(如 /lib64/ld-2.17.so)。如果链接指向的实际文件版本与 devtoolset-9 期望的不一致,可能会导致问题。
- 环境变量未生效:
- 虽然设置了 LD_LIBRARY_PATH,但 ld 在某些情况下可能不直接使用此变量(例如,CMake 或 ld 内部重置了路径)。
- 或者,devtoolset-9 的环境脚本(/opt/rh/devtoolset-9/enable)可能覆盖了你的配置。
验证 ld 搜索路径: 使用 ld 的 --verbose 选项检查其搜索路径
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld --verbose
先确认 /lib64 是否包含在内。创建软连接(临时修复): 如果 ld 仍无法找到 /lib64/ld-linux-x86-64.so.2,尝试将其复制到 devtoolset-9 的库路径
sudo mkdir -p /opt/rh/devtoolset-9/root/usr/lib64
sudo ln -s /lib64/ld-linux-x86-64.so.2 /opt/rh/devtoolset-9/root/usr/lib64/ld-linux-x86-64.so.2
sudo ln -s /lib64/libc.so.6 /opt/rh/devtoolset-9/root/usr/lib64/libc.so.6
为了让cmake和ld-linux-x86-64.so.2 兼容我还重新安装了一个旧版本的cmake
wget https://cmake.org/files/v3.22/cmake-3.22.1-linux-x86_64.tar.gz
tar -xzvf cmake-3.22.1-linux-x86_64.tar.gz
sudo mv cmake-3.22.1-linux-x86_64 /opt/cmake-3.22
然后添加环境变量:
export PATH=/opt/cmake-3.22/bin:$PATH
# 测试
cmake --version
ldd $(which cmake) | grep stdc++
这时候就不应该再引用 /opt/gcc-13/lib64/libstdc++.so.6 了,而是回退到系统默认的 /usr/lib64/libstdc++.so.6(CentOS 10 系统库通常只支持到 CXXABI_1.3.11 ~ 1.3.14)。
排除除各项故障以后,就Ktransformers就可以安装成功了
✓ KTransformers安装完成!
您可以通过以下命令进入环境:
conda activate ktrans_main
然后运行示例:
cd /opt/chenrui/ktrun/workspace/examples
python run_demo.py
虽然提示了上面的内容不过我并没有找到这个目录
还是使用 ktrun 留下来的启动脚本 ,运行启动脚本 ./start.sh
启动脚本参数
选项:
-h, --help 显示帮助信息
-m, --model_path PATH 设置模型路径 (默认: deepseek-ai/DeepSeek-R1)
-g, --gguf_path PATH 设置GGUF路径 (默认: ~/model)
-c, --cpu_infer NUM 设置CPU推理数量 (默认: 380)
-t, --max_new_tokens NUM 设置最大新token数 (默认: 16384)
-l, --cache_lens NUM 设置缓存长度 (默认: 8192)
-o, --optimize_config_path PATH 设置优化配置文件 (默认: DeepSeek-V3-Chat.yaml)
启动我本地下载的 DeepSeek-R1-UD-Q2_K_XL
# 指定模型路径和其他参数
./start.sh -m deepseek-ai/DeepSeek-R1 -g /opt/chenrui/ktransformers/DeepSeek-R1-UD-Q2_K_XL -c 16 -t 8192 -l 2048
再次报错 没有sched_ext, 查了下 sched_ext
是一个 Linux 内核特性,允许使用 eBPF 实现和动态加载内核线程调度器。 sched_ext
并不是一个标准库模块,也没有在 PyPI 上发布,因此无法通过 pip install sched_ext
进行安装。根据您提供的错误信息和相关讨论,sched_ext
可能是某些项目(如 ktransformers
)中使用的内部模块或扩展。在ktransformers项目的 GitHub 讨论 中,有用户建议通过修改项目代码,移除对 sched_ext
的依赖,以绕过该问题。
按照上面的解决思路修改果然没有报错了
显存是逐渐增加的
优化 ktransformers 命令以使用两张 GPU 卡并减少突然崩溃的可能性,需要调整配置以更好地利用多 GPU 资源、优化内存管理、并解决潜在的稳定性问题。以下是详细的优化步骤和建议,结合你的具体命令和问题背景。
问题分析
- 单 GPU vs. 多 GPU:
- 你的命令未明确指定多 GPU 支持,ktransformers 默认可能只使用一张 GPU。需要配置多 GPU 负载均衡或并行推理。
- DeepSeek-R1-UD-Q2_K_XL 是量化模型(Q2_K_XL),对内存需求较高,使用两张 GPU 可以分担计算和内存压力。
- 突然崩溃的原因:
- CUDA 内存溢出:PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True 启用扩展内存分配,但高负载(如大 cache_lens=32768 或 max_new_tokens=8192)可能导致内存碎片化或溢出。
- 多并发或调度问题:如果默认使用 sched_ext(balance_serve 后端),可能因调度器不稳定或编译问题导致崩溃。
- CUDA Graph 不兼容:--use_cuda_graph 在某些情况下可能与量化模型或动态批处理冲突,导致崩溃。
- 优化配置不匹配:DeepSeek-V3-Chat.yaml 是为 DeepSeek-V3 设计的,可能不完全适配 DeepSeek-R1,导致运行时错误。
本来后端 使用 balance_serve 后端(需要 sched_ext)以支持多 GPU 的高效负载均衡
--backend_type balance_serve 但是无法使sched_ext 只能使用 torch 后端,但多 GPU 支持可能受限。
崩溃通常与内存管理、配置错误或不稳定功能有关。以下是针对性优化:
a. 内存管理
- 降低 cache_lens: cache_lens=32768 表示 KV 缓存支持 32K tokens,占用大量 GPU 内存。尝试减小缓存大小(例如 16384 或 8192):
这可以显著减少内存占用,尤其在双 GPU 分担时。--cache_lens 16384
- 调整 max_new_tokens: max_new_tokens=8192 允许生成长序列,增加内存压力。考虑减小到 2048 或 4096:
--max_new_tokens 4096
- 优化 PyTorch 内存分配: PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True 已启用扩展内存分配,但可以进一步细化配置:
max_split_size_mb:32 限制内存分片大小,减少碎片化。PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32,expandable_segments:True
- 启用缓存量化: 你已设置 --cache_q4 true,这会将 KV 缓存量化为 4 位,降低内存占用。确保此功能与 DeepSeek-R1 兼容。如果不兼容,尝试禁用:
--cache_q4 false
b. 禁用不稳定功能
- 检查 --use_cuda_graph: CUDA Graph(--use_cuda_graph)在量化模型或动态批处理场景下可能不稳定,导致崩溃。建议禁用:
如果需要 CUDA Graph 的性能优化,需确保 flashinfer 正确安装且版本匹配:# 移除 --use_cuda_graph
pip install flashinfer
- 禁用 --force_think: --force_think 激活 思考模式,可能增加计算开销或引入不稳定因素。如果不是必需,建议移除:
# 移除 --force_think
CUDA_VISIBLE_DEVICES=0,1 PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32,expandable_segments:True python ktransformers/server/main.py \
--gguf_path /opt/chenrui/ktransformers/DeepSeek-R1-UD-Q2_K_XL/ \
--model_path deepseek-ai/DeepSeek-R1 \
--model_name unsloth/DeepSeek-R1-UD-Q2_K_XL \
--cpu_infer 16 \
--max_new_tokens 4096 \
--cache_lens 16384 \
--cache_q4 true \
--temperature 0.6 \
--top_p 0.95 \
--optimize_config_path /opt/chenrui/ktrun/workspace/ktransformers/optimize/optimize_rules/DeepSeek-V2-Chat-multi-gpu-4.yaml \
--backend_type balance_serve \
--host 0.0.0.0 \
--port 4000