ktrun 安装 ktransformers 并运行 DeepSeek-R1-UD-Q2_K_XL

简述

KTransformers 是一个清华开源的LLM部署框架,主要用于优化大型语言模型(LLM)的推理过程。它通过先进的内核优化、GPU/CPU 异构计算和并行策略,显著提升模型推理速度并降低硬件需求。以下是它的主要用途:

  1. 高效本地部署:KTransformers 允许在消费级硬件(如 24GB 显存的 RTX 4090)上运行超大模型,例如 DeepSeek-R1 和 V3 的 671B 参数版本,降低了对高端服务器的依赖。
  2. 性能优化:通过量化技术(如 4-bit 量化)、稀疏注意力机制和 MoE(混合专家模型)架构优化,KTransformers 可实现 3-28 倍的推理速度提升,预填充速度最高达 286 tokens/s,生成速度约 14 tokens/s。
  3. 灵活接口:提供与 Hugging Face Transformers 兼容的接口、OpenAI 和 Ollama 标准的 RESTful API,以及类似 ChatGPT 的网页界面,方便开发者集成到各种应用中。
  4. 支持长上下文:支持 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

错误原因分析

  1. 链接器隔离环境
    • devtoolset-9(/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld)运行在一个隔离的工具链环境中,可能忽略了系统的标准库路径(/lib64)。
    • 即使你设置了 LD_LIBRARY_PATH,链接器可能不直接使用此环境变量,而是依赖内部配置或特定的搜索路径。
  2. 文件不兼容
    • 错误提示 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)。
      • 架构或格式不匹配(例如,文件可能是符号链接,指向不兼容的实际库)。
  3. 符号链接问题
    • /lib64/ld-linux-x86-64.so.2 通常是符号链接,指向实际的动态链接器(如 /lib64/ld-2.17.so)。如果链接指向的实际文件版本与 devtoolset-9 期望的不一致,可能会导致问题。
  4. 环境变量未生效
    • 虽然设置了 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 的依赖,以绕过该问题。​

https://github.com/kvcache-ai/ktransformers/issues/1017https://github.com/kvcache-ai/ktransformers/issues/1017有用户给的解决思路是

按照上面的解决思路修改果然没有报错了

显存是逐渐增加的

优化 ktransformers 命令以使用两张 GPU 卡并减少突然崩溃的可能性,需要调整配置以更好地利用多 GPU 资源、优化内存管理、并解决潜在的稳定性问题。以下是详细的优化步骤和建议,结合你的具体命令和问题背景。

问题分析

  1. 单 GPU vs. 多 GPU
    • 你的命令未明确指定多 GPU 支持,ktransformers 默认可能只使用一张 GPU。需要配置多 GPU 负载均衡或并行推理。
    • DeepSeek-R1-UD-Q2_K_XL 是量化模型(Q2_K_XL),对内存需求较高,使用两张 GPU 可以分担计算和内存压力。
  2. 突然崩溃的原因
    • 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):

    --cache_lens 16384

    这可以显著减少内存占用,尤其在双 GPU 分担时。
  • 调整 max_new_tokens: max_new_tokens=8192 允许生成长序列,增加内存压力。考虑减小到 2048 或 4096:

    --max_new_tokens 4096

  • 优化 PyTorch 内存分配: PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True 已启用扩展内存分配,但可以进一步细化配置:

    PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32,expandable_segments:True

    max_split_size_mb:32 限制内存分片大小,减少碎片化。
  • 启用缓存量化: 你已设置 --cache_q4 true,这会将 KV 缓存量化为 4 位,降低内存占用。确保此功能与 DeepSeek-R1 兼容。如果不兼容,尝试禁用:

    --cache_q4 false

b. 禁用不稳定功能
  • 检查 --use_cuda_graph: CUDA Graph(--use_cuda_graph)在量化模型或动态批处理场景下可能不稳定,导致崩溃。建议禁用:

    # 移除 --use_cuda_graph

    如果需要 CUDA Graph 的性能优化,需确保 flashinfer 正确安装且版本匹配:

    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

### 下载DeepSeek-R1-GGUF和DeepSeek-R1-Q2_K模型文件 为了从ModelScope平台下载所需的`DeepSeek-R1-GGUF`和`DeepSeek-R1-Q2_K`模型文件,将其存储至指定的本地目录`e/model/deepseekr1/DeepSeek-R1-GGUF/DeepSeek-R1-Q2_K`,可以按照以下方法操作。 #### 安装依赖库 首先需要安装`modelscope`工具以便执行下载命令。可以通过pip完成安装: ```bash pip install modelscope ``` 此命令用于安装必要的Python包来支持后续的操作[^1]。 #### 执行下载命令 对于具体的模型文件下载,需分别运行两个独立的命令行指令以获取不同量化的版本。 针对`DeepSeek-R1-GGUF`模型文件,使用如下命令进行下载: ```bash modelscope download --model unsloth/DeepSeek-R1-GGUF DeepSeek-R1-GGUF.gguf --local_dir e/model/deepseekr1/DeepSeek-R1-GGUF/ ``` 而针对`DeepSeek-R1-Q2_K`模型文件,则应采用下列命令实现其下载过程: ```bash modelscope download --model unsloth/DeepSeek-R1-Q2_K DeepSeek-R1-Q2_K.gguf --local_dir e/model/deepseekr1/DeepSeek-R1-Q2_K/ ``` 上述两条命令中的参数解释如下: - `--model`: 指定要下载的具体模型名称及其所属仓库地址。 - 文件名部分定义了最终保存的目标文件命名方式。 - `--local_dir`: 设定了目标存储位置,即用户希望放置这些模型数据的实际磁盘路径。 注意,在实际操作前,请确认所使用的操作系统环境能够正常解析驱动器标识符(如这里的'e:'),以及具备足够的写权限访问该自定义目录结构下的子文件夹创建权利。 #### 验证下载成功与否 下载完成后建议进入设定好的本地储存路径检查是否存在对应扩展名为`.gguf`的新建文档实例作为验证手段之一;另外也可以借助官方API接口或者图形界面客户端进一步核实整个流程是否顺利完成预期任务设置。 ```python import os def verify_downloads(base_path='e:/model/deepseekr1'): expected_files = [ 'DeepSeek-R1-GGUF/DeepSeek-R1-GGUF.gguf', 'DeepSeek-R1-Q2_K/DeepSeek-R1-Q2_K.gguf' ] all_present = True for file_relpath in expected_files: full_filepath = os.path.join(base_path, file_relpath.replace('/', os.sep)) if not os.path.isfile(full_filepath): print(f'Missing file: {full_filepath}') all_present = False return all_present if verify_downloads(): print('All downloads verified successfully.') else: print('Some files are missing or incorrectly downloaded.') ``` 以上脚本可以帮助自动化检测是否有任何遗漏未被妥善处理的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CHEN_RUI_2200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值