阿里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-keyapi_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)reasoning_content = ""
content = ""is_answering = Falsecompletion = 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 usageif not chunk.choices:print("\nUsage:")print(chunk.usage)else:delta = chunk.choices[0].delta# Print reasoning contentif hasattr(delta, 'reasoning_content') and delta.reasoning_content is not None:print(delta.reasoning_content, end='', flush=True)reasoning_content += delta.reasoning_contentelse:if delta.content != "" and is_answering is False:print("\n" + "=" * 20 + "content" + "=" * 20 + "\n")is_answering = True# Print contentprint(delta.content, end='', flush=True)content += delta.content
transformers 本地加載
from transformers import AutoModelForCausalLM, AutoTokenizermodel_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
配置。