阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎
QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen Chat 直接进行体验!
Qwen 团队却用320亿参数的 QwQ-32B,硬刚拥有6710亿参数的 DeepSeek-R1,并且在多项评测中取得了媲美甚至超越后者的惊人成绩!背后究竟是什么黑科技?答案就是——强化学习(Reinforcement Learning,RL)!
划重点:强化学习,大模型的新引擎!💪
Qwen 团队在博文中提到,他们深入探索了强化学习(RL)在提升大语言模型智能方面的巨大潜力。QwQ-32B 的成功发布,有力地证明了RL 是提升模型性能的强大引擎!
多项基准评测硬刚 DeepSeek-R1
官方给出基准评测结果,涵盖了数学推理、代码能力和通用问题解决等多个方面:
从数据中我们可以清晰地看到,在AIME24和IFEval等关键基准测试中,QwQ-32B 的表现甚至略微超过了参数量巨大的 DeepSeek-R1!而在其他基准测试中,也基本与 DeepSeek-R1 持平,远超其他对比模型。
这意味着 QwQ-32B 在仅有 DeepSeek-R1 约 1/20 参数量的情况下,用强化学习,实现了性能上的惊人跨越!
实例对比:我身高1.73米,拿着一根5.5米长的竹竿,能否通过高4米、宽3米的门?
这个问题目前只有腾讯元宝/问小白里的deepseek回答可以通过
技术揭秘:
冷启动+结果导向的强化学习策略
Qwen 团队在博文中也简单介绍了 QwQ-32B 背后的强化学习方法。他们采用了冷启动(cold-start checkpoint)的方式,并实施了结果导向(outcome-based rewards)的强化学习策略。
• 冷启动:从一个预训练模型的检查点开始训练。
• 结果导向:在初始阶段,主要针对数学和代码任务进行 RL 训练。
• 数学问题:使用准确率验证器(accuracy verifier)来确保答案的正确性。
• 代码生成:使用代码执行服务器(code execution server)来评估生成的代码是否能够成功运行。
• 通用奖励模型和规则验证器:后续阶段,会逐步引入更通用的奖励模型和规则验证器,提升模型在其他通用能力方面的表现。
这种策略的核心在于不依赖传统的奖励模型,而是直接根据任务结果(答案是否正确,代码是否运行成功)来指导模型的学习,更加高效和直接。
冷启动的基础上开展了大规模强化学习。在初始阶段,特别针对数学和编程任务进行了 RL 训练。与依赖传统的奖励模型(rewardmodel)不同,通过校验生成答案的正确性来为数学问题提供反馈,并通过代码执行服务器评估生成的代码是否成功通过测试用例来提供代码的反馈。随着训练轮次的推进,这两个领域中的性能均表现出持续的提升。在第一阶段的RL 过后,增加了另一个针对通用能力的 RL。此阶段使用通用奖励模型和一些基于规则的验证器进行训练。发现,通过少量步骤的通用RL,可以提升其他通用能力,同时在数学和编程任务上的性能没有显著下降。
特点:
• 类型:因果语言模型
• 训练阶段:预训练与后训练(监督微调和强化学习)
• 架构:带 RoPE、SwiGLU、RMSNorm 和注意力 QKV 偏置的 Transformer
• 参数数量:325 亿
• 非嵌入参数数量:310 亿
• 层数:64
• 注意力头数量(GQA):Q 为 40,KV 为 8
• 上下文长度:完整支持 131,072 个标记
环境要求
Qwen2.5 的代码已集成到最新版的 Hugging Facetransformers
中,建议使用最新版本的transformers
。
如果你使用的是transformers<4.37.0
,可能会遇到以下错误:
KeyError: 'qwen2'
快速入门
API调用
from openai import OpenAI
import os
# Initialize OpenAI client
client = OpenAI(
# If the environment variable is not configured, replace with your API Key: api_key="sk-xxx"
# How to get an API Key:https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
reasoning_content = ""
content = ""
is_answering = False
completion = client.chat.completions.create(
model="qwq-32b",
messages=[
{"role": "user", "content": "Which is larger, 9.9 or 9.11?"}
],
stream=True,
# Uncomment the following line to return token usage in the last chunk
# stream_options={
# "include_usage": True
# }
)
print("\n" + "=" * 20 + "reasoning content" + "=" * 20 + "\n")
for chunk in completion:
# If chunk.choices is empty, print usage
if not chunk.choices:
print("\nUsage:")
print(chunk.usage)
else:
delta = chunk.choices[0].delta
# Print reasoning content
if hasattr(delta, 'reasoning_content') and delta.reasoning_content is not None:
print(delta.reasoning_content, end='', flush=True)
reasoning_content += delta.reasoning_content
else:
if delta.content != "" and is_answering is False:
print("\n" + "=" * 20 + "content" + "=" * 20 + "\n")
is_answering = True
# Print content
print(delta.content, end='', flush=True)
content += delta.content
transformers 本地加载
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/QwQ-32B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "单词 'strawberry' 中有几个字母 'r'?"
messages = [
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=32768
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
使用指南
为了达到最佳性能,建议以下设置:
• 确保深思熟虑的输出:确保模型以"<think>
"开头,以避免生成空洞的思考内容,这可能会降低输出质量。如果你使用apply_chat_template
并设置add_generation_prompt=True
,这已经自动实现,但可能会导致响应缺少开头的<think>
标签。这是正常现象。
• 采样参数:
• 使用温度参数 Temperature=0.6 和 TopP=0.95,而不是贪婪解码,以避免无尽重复并增强多样性。
• 对于复杂的推理任务(如数学或编程),设置 TopK=40。
• 对于其他类型的问题,使用 TopK=20。
• 标准化输出格式:在基准测试时,建议使用提示词来标准化模型输出。
• 数学问题:在提示词中加入"请逐步推理,并将最终答案放在\boxed{}
中。"
• 选择题:在提示词中加入以下 JSON 结构以标准化回答:“请在answer
字段中显示你的选择,仅使用选项字母,例如,\"answer\": \"C\"
。”
• 处理长输入:对于超过 32,768 个标记的输入,启用YaRN以提升模型对长序列信息的捕捉能力。
如果你需要支持的框架,可以在config.json
中添加以下内容以启用 YaRN:
{
...,
"rope_scaling": {
"factor": 4.0,
"original_max_position_embeddings": 32768,
"type": "yarn"
}
}
目前,vLLM 仅支持静态 YaRN,这意味着缩放因子无论输入长度如何都保持不变,可能会对较短文本的性能产生影响。建议仅在需要处理长上下文时添加rope_scaling
配置。