常见问题

安装

Q: 导入错误:/lib/x86_64-linux-gnu/libstdc++.so.6: 找不到版本 GLIBCXX_3.4.32

in Ubuntu 22.04 installation need to add the:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install --only-upgrade libstdc++6

来自-https://github.com/kvcache-ai/ktransformers/issues/117#issuecomment-2647542979

问:DeepSeek-R1 没有输出初始 token

来自 deepseek-R1文档:
此外,我们观察到DeepSeek-R1系列模型在响应某些查询时倾向于跳过思考模式(即输出"\n\n"),这可能会对模型的性能产生不利影响。为了确保模型进行全面推理,我们建议强制模型在每次输出的开头用"\n"启动其响应。

因此,我们通过在提示的末尾手动添加 "\n" 令牌来解决这个问题(你可以在 local_chat.py 中查看),并且传递参数 --force_think true 可以让 local_chat 以 "\n" 启动响应

来自-https://github.com/kvcache-ai/ktransformers/issues/129#issue-2842799552

使用

问:如果我拥有比模型要求更多的VRAM,我该如何充分利用它?

  1. 获取更大的上下文。

    1. local_chat.py: 您可以通过将 --max_new_tokens 设置为更大的值来增加上下文窗口大小。
    2. 服务器:将 `--cache_lens` 增加到更大的值。
  2. 将更多权重移动到GPU。 请参阅 ktransformers/optimize/optimize_rules/DeepSeek-V3-Chat-multi-gpu-4.yaml

    - match:
       name: "^model\\.layers\\.([4-10])\\.mlp\\.experts$" # 在第4到10层注入专家
     replace:
       class: ktransformers.operators.experts.KTransformersExperts  
       kwargs:
         generate_device: "cuda:0" # 在cuda:0上运行;marlin 仅支持GPU
         generate_op:  "KExpertsMarlin" # 使用marlin专家
     recursive: False
    

    您可以根据需要修改层,例如 name: "^model\\.layers\\.([4-10])\\.mlp\\.experts$"name: "^model\\.layers\\.([4-12])\\.mlp\\.experts$" 以将更多权重移动到GPU。

    注意:yaml中第一个匹配的规则将被应用。例如,如果您有两个规则匹配相同的层,则只有第一个规则的替换会有效。 注意:当前,在GPU上执行专家会与CUDA Graph冲突。如果没有CUDA Graph,性能会显著下降。因此,除非您有大量的VRAM(将DeepSeek-V3/R1的单层专家放到GPU上至少需要5.6GB的VRAM),否则我们不建议启用此功能。我们正在积极进行优化。 注意 KExpertsTorch 尚未经过测试。

问:如果我没有足够的VRAM,但我有多个GPU,我该如何利用它们?

使用 --optimize_config_path ktransformers/optimize/optimize_rules/DeepSeek-V3-Chat-multi-gpu.yaml 来加载两个优化后的规则yaml文件。您也可以将其作为示例来编写您自己的4/8 gpu优化规则yaml文件。

注意:ktransformers的多GPU策略是管道,无法加速模型的推理。它仅用于模型的权重分配。

问:如何获得最佳性能?

您必须将 --cpu_infer 设置为您要使用的核心数。您使用的核心越多,模型运行得越快。但并不是越多越好。将其略微调低至您的实际核心数。

问:我的DeepSeek-R1模型没有思考。

根据 DeepSeek,您需要强制模型在每个输出的开头以 "\n" 开始响应,通过传递参数 --force_think True 来实现。

问:加载 gguf 错误

确保你:

  1. --gguf_path目录中拥有gguf文件。
  2. 该目录只包含来自一个模型的gguf文件。如果您有多个模型,则需要将它们分开到不同的目录中。
  3. 文件夹名称本身不应以 .gguf 结尾,例如 Deep-gguf 是正确的, Deep.gguf 是错误的。
  4. 文件本身没有损坏;您可以通过检查sha256sum是否与huggingface、modellscope或hf-mirror中的值匹配来验证这一点。

问:版本 `GLIBCXX_3.4.30' 未找到

详细错误:

导入错误:/mnt/data/miniconda3/envs/xxx/bin/../lib/libstdc++.so.6: 找不到版本 `GLIBCXX_3.4.30'(/home/xxx/xxx/ktransformers/./cpuinfer_ext.cpython-312-x86_64-linux-gnu.so 需要此版本)

运行 conda install -c conda-forge libstdcxx-ng 可以解决问题。

问:在运行bfloat16 moe模型时,数据显示为NaN

详细错误:

Traceback (most recent call last):
  File "/root/ktransformers/ktransformers/local_chat.py", line 183, in <module>
    fire.Fire(local_chat)
  File "/usr/local/lib/python3.10/dist-packages/fire/core.py", line 135, in Fire
    component_trace = _Fire(component, args, parsed_flag_args, context, name)
  File "/usr/local/lib/python3.10/dist-packages/fire/core.py", line 468, in _Fire
    component, remaining_args = _CallAndUpdateTrace(
  File "/usr/local/lib/python3.10/dist-packages/fire/core.py", line 684, in _CallAndUpdateTrace
    component = fn(*varargs, **kwargs)
  File "/root/ktransformers/ktransformers/local_chat.py", line 177, in local_chat
    generated = prefill_and_generate(
  File "/root/ktransformers/ktransformers/util/utils.py", line 204, in prefill_and_generate
    next_token = decode_one_tokens(cuda_graph_runner, next_token.unsqueeze(0), position_ids, cache_position, past_key_values, use_cuda_graph).to(torch_device)
  File "/root/ktransformers/ktransformers/util/utils.py", line 128, in decode_one_tokens
    next_token = torch.multinomial(probs, num_samples=1).squeeze(1)
RuntimeError: probability tensor contains either `inf`, `nan` or element < 0

解决方案: 在Ubuntu 22.04上运行ktransformers的问题是由于当前系统的g++版本过旧,预定义的宏不包括avx_bf16。我们已经测试并确认它在Ubuntu 22.04的g++ 11.4上可以正常工作。

问:使用fp8预填充非常慢。

FP8内核是通过JIT构建的,因此第一次运行会很慢。随后的运行会更快。