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

如何使用我们的漏洞修复和避免无尽生成 + GGUF 有效运行 QwQ-32B。

Qwen 发布了 QwQ-32B —— 一个在许多基准测试上性能可与 DeepSeek-R1 相媲美的推理模型, 基准测试arrow-up-right。然而,人们遇到了 无限生成, 很多重复,<think> 令牌问题和微调问题。我们希望本指南能帮助调试并解决大多数问题!

circle-info

我们修复错误后上传的模型非常适合微调、vLLM 和 Transformers。如果你使用 llama.cpp 及以 llama.cpp 为后端的引擎,请按照我们的 此处说明 来修复无限生成问题。

带有我们修复的 Unsloth QwQ-32B 上传如下:

⚙️ 官方推荐设置

根据 Qwenarrow-up-right,以下是推理的推荐设置:

  • 温度(Temperature)为 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 游戏。<|im_end|>\n<|im_start|>assistant\n<think>\n

circle-exclamation

👍 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。

致谢 @krist486arrow-up-right 感谢其提醒我注意 llama.cpp 的采样方向。

☀️ Dry 重复惩罚

我们调查了使用 dry 惩罚(dry penalty) 如在以下建议中所述 https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.mdarrow-up-right 使用 0.8 的值,但我们实际上发现这会 反而导致语法问题,尤其是在编码时。如果你仍然遇到问题,你可以将dry 惩罚增加到 0.8。

如果你决定使用,采用我们交换后的采样顺序也可以有所帮助。 dry 惩罚(dry penalty).

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

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

  1. 运行模型!注意如果失败,你可以在另一个终端调用 ollama serve如果失败!我们在 param 中!

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

  1. 获取最新的 llama.cpp此处的 GitHubarrow-up-right。您也可以按照下面的构建说明进行。若 -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-GGUFarrow-up-right

  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-dynamicarrow-up-right 1.58bit 博客中的完整输入是:

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

chevron-right完整的最终 Python 输出(已去除思考部分):hashtag
  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: 名称 'pipes' 未定义。你是否忘记导入 '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.01082arrow-up-right,为了更有创造性和更多样化的输出,如果你仍然看到重复,尝试禁用 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

chevron-right完整的移除 <think>\n 部分的 jinja 模板hashtag

额外说明

我们起初以为也许:

  1. QwQ 的上下文长度并非原生 128K,而是通过 YaRN 扩展为 32K。例如在 https://huggingface.co/Qwen/QwQ-32B 的自述文件中,我们看到:arrow-up-right,我们看到:

我们尝试覆盖 llama.cpp 的 YaRN 处理,但没有改变。

  1. 我们也曾认为 RMS Layernorm 的 epsilon 可能不对——不是 1e-5 而可能是 1e-6。例如 这一项arrow-up-right 具有 rms_norm_eps=1e-06,而 这一项arrow-up-right 具有 rms_norm_eps=1e-05 。我们也覆盖了它,但并未奏效:

  1. 我们还测试了 tokenizer ID 在 llama.cpp 与普通 Transformers 之间是否匹配,感谢 @kalomazearrow-up-right。它们匹配,所以这不是罪魁祸首。

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

无采样修复的 BF16 全精度
带采样修复的 BF16 全精度
无采样修复的 Q4_K_M 精度
带采样修复的 Q4_K_M 精度

✏️ 分词器(Tokenizer)修复

🛠️ 动态 4 位量化

我们还上传了动态 4 位量化,相比原始的 4 位量化能提高精度!我们附上 QwQ 的量化误差分析图,包含激活和权重量化误差:

我们将动态 4 位量化上传到: https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bitarrow-up-right

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

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

最后更新于

这有帮助吗?