For the complete documentation index, see llms.txt. This page is also available as Markdown.

🌠QwQ-32B:如何高效运行

如何使用我们的修复补丁并避免无限生成,高效运行 QwQ-32B,以及 GGUF。

Qwen 发布了 QwQ-32B——一个推理模型,在许多方面的性能可与 DeepSeek-R1 相媲美 基准测试。不过,人们一直在遇到 无限生成, 大量重复、<think> 令牌问题以及微调问题。我们希望本指南能帮助你调试并修复大多数问题!

我们带有修复补丁的模型上传版本非常适合微调、vLLM 和 Transformers。如果你使用的是 llama.cpp 以及以 llama.cpp 为后端的引擎,请按照我们的 这里的说明 来修复无限生成。

带有我们修复补丁的 Unsloth QwQ-32B 上传版本:

⚙️ 官方推荐设置

根据 Qwen,以下是推理时的推荐设置:

  • 温度 0.6

  • Top_K 为 40(或 20 到 40)

  • Min_P 设为 0.00(可选,但 0.01 也很好,llama.cpp 默认值是 0.1)

  • Top_P 为 0.95

  • 重复惩罚为 1.0。(在 llama.cpp 和 transformers 中,1.0 表示禁用)

  • 聊天模板: <|im_start|>user\n用 Python 创建一个 Flappy Bird 游戏。\n<|im_end|>\n<|im_start|>assistant\n<think>\n

👍 llama.cpp 的推荐设置

我们注意到很多人使用了一个 重复惩罚 大于 1.0。例如 1.1 到 1.5。这实际上会干扰 llama.cpp 的采样机制。重复惩罚的目标是惩罚重复生成,但我们发现这并没有按预期工作。

关闭 重复惩罚 也有效(即将其设为 1.0),但我们发现保留它对于惩罚无限生成很有用。

要使用它,我们发现你还必须在 llama.cpp 中将采样器的顺序调整为在应用 重复惩罚之前,否则会出现无限生成。所以添加这个:

默认情况下,llama.cpp 使用以下顺序:

我们本质上重新排列了 temperature 和 dry,并将 min_p 前移。这意味着我们按以下顺序应用采样器:

如果你仍然遇到问题,你可以增加--repeat-penalty 1.0 到 1.2 或 1.3。

感谢 @krist486 提醒我注意 llama.cpp 的采样方向。

☀️ Dry 重复惩罚

我们研究了使用 dry penalty ,如以下内容所建议: https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md ,使用 0.8 的值,但我们实际上发现这会 更容易导致语法问题,尤其是在编程方面。如果你仍然遇到问题,可以将dry penalty 提高到 0.8。

如果你决定使用,采用我们交换后的采样顺序也会有所帮助 dry penalty.

🦙 教程:如何在 Ollama 中运行 QwQ-32B

  1. 安装 ollama 如果你还没有的话!

  1. 运行模型!注意,如果失败了,你可以在 ollama serve另一个终端中调用。我们将所有修复和建议的参数(temperature、min_p 等)包含在 参数

📖 教程:如何在 llama.cpp 中运行 QwQ-32B

  1. 获取最新的 llama.cppGitHub 这里。你也可以按照下面的构建说明操作。将 -DGGML_CUDA=ON 改为 -DGGML_CUDA=OFF 如果你没有 GPU,或者只想进行 CPU 推理。 对于 Apple Mac / Metal 设备,设置 -DGGML_CUDA=OFF 然后照常继续——Metal 支持默认开启。

  1. 通过以下方式下载模型(在安装 pip install huggingface_hub hf_transfer )。你可以选择 Q4_K_M,或其他量化版本(例如 BF16 全精度)。更多版本见: https://huggingface.co/unsloth/QwQ-32B-GGUF

  1. 运行 Unsloth 的 Flappy Bird 测试,这会将输出保存到 Q4_K_M_yes_samplers.txt

  2. 编辑 --threads 32 来设置 CPU 线程数, --ctx-size 16384 来设置上下文长度, --n-gpu-layers 99 来设置 GPU 卸载多少层。如果你的 GPU 显存不足,请尝试调整它。如果你只进行 CPU 推理,也请移除它。

  3. 我们使用 --repeat-penalty 1.1--dry-multiplier 0.5 ,你可以自行调整。

来自我们 https://unsloth.ai/blog/deepseekr1-dynamic 1.58bit 博客的完整输入是:

去除思考部分后,最终 Python 输出的开头和结尾:

完整的最终 Python 输出(已去除思考部分):
  1. 运行时,我们得到了一个可运行的游戏!

  1. 现在尝试在没有修复的情况下运行相同内容!所以移除 --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" 这会将输出保存到 Q4_K_M_no_samplers.txt

你会得到一些循环,但 存在问题的 Python 语法错误 以及许多其他问题。例如下面看起来正确,但其实是错的!即第 39 行 pipes.clear() ### <<< NameError: name 'pipes' is not defined. Did you forget to import 'pipes'?

  1. 如果你使用 --repeat-penalty 1.5,情况会更糟、更明显,实际上会出现完全错误的语法。

  1. 你可能会想,也许是 Q4_K_M?B16,即全精度应该没问题吧?不对——如果我们不使用以下修复,输出同样会失败:--samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" 在使用重复惩罚时。

🌄 还是不行?试试 Min_p = 0.1,Temperature = 1.5

根据 Min_p 论文 https://arxiv.org/pdf/2407.01082,为了获得更有创造性和更多样化的输出,如果你仍然看到重复,请尝试禁用 top_p 和 top_k!

另一种方法是直接禁用 min_p ,因为 llama.cpp 默认使用 min_p = 0.1!

🤔 <think> 令牌没有显示?

有些人报告说,由于 <think> 是在聊天模板中默认添加的,一些系统无法正确输出思考轨迹。你需要手动编辑 Jinja 模板,从:

改为另一个,通过移除末尾的 <think>\n 。现在模型在推理时必须手动添加 <think>\n ,这并不总是能成功。DeepSeek 也编辑了所有模型,默认添加一个 <think> 令牌,以强制模型进入推理模式。

所以把 {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n' }} {%- endif %} 改为 {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}

即移除 <think>\n

移除了 <think>\n 部分的完整 jinja 模板

附加说明

我们起初以为:

  1. QwQ 的上下文长度并非原生的 128K,而是带有 YaRN 扩展的 32K。例如在以下的 readme 文件中 https://huggingface.co/Qwen/QwQ-32B,我们看到:

我们尝试覆盖 llama.cpp 对 YaRN 的处理,但没有任何变化。

  1. 我们也曾认为可能是 RMS Layernorm 的 epsilon 有问题——不是 1e-5,而可能是 1e-6。例如 这个rms_norm_eps=1e-06,而 这个rms_norm_eps=1e-05 。我们也对其进行了覆盖,但没有起作用:

  1. 我们还测试了 llama.cpp 和普通 Transformers 之间的 tokenizer ID 是否匹配,感谢 @kalomaze。它们匹配,所以这不是罪魁祸首。

我们在下面提供实验结果:

没有采样修复的 BF16 全精度
带采样修复的 BF16 全精度
没有采样修复的 Q4_K_M 精度
带采样修复的 Q4_K_M 精度

✏️ Tokenizer 错误修复

🛠️ 动态 4-bit 量化

我们还上传了动态 4bit 量化,相比朴素的 4bit 量化能提高准确性!我们附上了 QwQ 量化误差图分析,分别针对激活和权重量化误差:

我们已将动态 4-bit 量化上传到: https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bit

自 vLLM 0.7.3 起(2025 年 2 月 20 日) https://github.com/vllm-project/vllm/releases/tag/v0.7.3,vLLM 现在支持加载 Unsloth 动态 4bit 量化!

我们所有的 GGUF 都在 https://huggingface.co/unsloth/QwQ-32B-GGUF!

最后更新于

这有帮助吗?