🌠QwQ-32B:如何有效运行
如何使用我们的 bug 修复和 GGUF 在无需无尽生成的情况下有效运行 QwQ-32B。
Qwen 发布了 QwQ-32B —— 一个在许多基准上与 DeepSeek-R1 性能相当的推理模型, 基准测试。然而,人们遇到了 无限生成, 大量重复、<think> 令牌问题和微调问题。我们希望本指南能帮助调试并修复大多数问题!
我们应用了修复的模型上传非常适合微调、vLLM 和 Transformers。如果你使用 llama.cpp 以及以 llama.cpp 为后端的引擎,请按照我们的 此处说明 来修复无限生成问题。
带有我们修复的 Unsloth QwQ-32B 上传:
⚙️ 官方推荐设置
根据 Qwen,以下是推理的推荐设置:
温度(Temperature)设为 0.6
Top_K 为 40(或 20 到 40)
Min_P 为 0.00(可选,但 0.01 效果很好,llama.cpp 的默认值是 0.1)
Top_P 为 0.95
重复惩罚(Repetition Penalty)为 1.0。(在 llama.cpp 和 transformers 中 1.0 表示禁用)
聊天模板:
<|im_start|>user\n用 Python 创建一个 Flappy Bird 游戏。<|im_end|>\n<|im_start|>assistant\n<think>\n
llama.cpp 使用 min_p = 0.1默认值,这可能会导致问题。强制将其设为 0.0。
👍 llama.cpp 的推荐设置
我们注意到很多人使用了一个 重复惩罚(Repetition Penalty) 大于 1.0。例如 1.1 到 1.5。这实际上会干扰 llama.cpp 的采样机制。重复惩罚的目的是惩罚重复生成,但我们发现这并不像预期那样工作。
关闭 重复惩罚(Repetition Penalty) 也有效(即将其设为 1.0),但我们发现在惩罚无限生成时使用它很有用。
要使用它,我们发现你还必须在 llama.cpp 中编辑采样器的顺序,使其在应用 重复惩罚(Repetition Penalty)之前,否则会出现无限生成。所以添加这个:
默认情况下,llama.cpp 使用此顺序:
我们基本上交换了 temperature 和 dry 的顺序,并将 min_p 提前。这意味着我们按以下顺序应用采样器:
如果你仍然遇到问题,可以将--repeat-penalty 1.0 提升到 1.2 或 1.3。
致谢于 @krist486 感谢他提醒我注意 llama.cpp 的采样指导。
☀️ 干式重复惩罚(Dry Repetition Penalty)
我们调查了使用 dry 惩罚 如在以下建议中 https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md 使用 0.8 的值,但我们实际上发现这 反而会导致语法问题,尤其是在编程代码方面。如果你仍然遇到问题,可以将dry 惩罚增加到 0.8。
如果你决定使用 dry 惩罚.
🦙 我们交换后的采样顺序也能有所帮助
安装
ollama如果你还没有安装!
教程:如何在 Ollama 中运行 QwQ-32B
ollama serve运行模型!注意如果失败你可以在另一个终端调用param中!
📖 教程:如何在 llama.cpp 中运行 QwQ-32B
获取最新的
llama.cpp于 此处 GitHub。您也可以按下面的构建说明进行。若要更改-DGGML_CUDA=ON为-DGGML_CUDA=OFF若您没有 GPU 或仅想要 CPU 推理,请这样设置。
通过以下方式下载模型(在安装
pip install huggingface_hub hf_transfer)。你可以选择 Q4_K_M,或其他量化版本(如 BF16 全精度)。更多版本见: https://huggingface.co/unsloth/QwQ-32B-GGUF
运行 Unsloth 的 Flappy Bird 测试,它会将输出保存到
Q4_K_M_yes_samplers.txt编辑
--threads 32为 CPU 线程数,--ctx-size 16384以设置上下文长度,--n-gpu-layers 99用于指定有多少层进行 GPU 卸载。如果你的 GPU 出现内存不足,尝试调整它。如果只用 CPU 推理,也请移除此参数。我们使用
--repeat-penalty 1.1和--dry-multiplier 0.5这些参数你可以调整。
我们在 https://unsloth.ai/blog/deepseekr1-dynamic 1.58bit 博客中的完整输入是:
去除思考部分后最终 Python 输出的开头和结尾:
运行时,我们得到了一个可运行的游戏!

现在尝试不使用我们的修复!所以移除
--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'?
如果你使用
--repeat-penalty 1.5,情况会更糟且更明显,实际会出现完全不正确的语法。
你可能会想也许是 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
附加说明
我们起初以为也许:
QwQ 的上下文长度本身不是 128K,而是通过 YaRN 扩展的 32K。例如在下列的自述文件中, https://huggingface.co/Qwen/QwQ-32B,我们看到:
我们尝试覆盖 llama.cpp 的 YaRN 处理,但没有任何改变。
我们还测试了 llama.cpp 与常规 Transformers 之间的分词器 ID 是否匹配,感谢 @kalomaze。它们匹配,所以这不是问题根源。
我们在下面提供我们的实验结果:
✏️ 分词器错误修复
我们还发现了一些专门影响微调的问题!EOS 令牌是正确的,但 PAD 令牌可能更应该是
"<|vision_pad|>" 我们在以下位置对此进行了更新: https://huggingface.co/unsloth/QwQ-32B/blob/main/tokenizer_config.json
🛠️ 动态 4 位量化(Dynamic 4-bit Quants)
我们还上传了动态 4bit 量化,相比简单的 4bit 量化能提升准确性!我们附上了 QwQ 的量化误差分析图,涵盖激活和权重量化误差:

我们将动态 4 位量化上传到: 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!
最后更新于
这有帮助吗?

