思考、质疑、理解,是人类探索未知的永恒追求。在这条探索之路上,QwQ犹如一位怀抱无尽好奇的学徒,以思考和疑问照亮前路。QwQ体现了古老的哲学精神:它深知自己一无所知,而这种认知正是其好奇心的源泉。在探寻答案的过程中,它始终保持自省,以理性之光审视每一个假设,在不同的思维维度中穿行,追寻更深层的真理。
然而,正如所有智慧的追求者一样,QwQ也有其局限性。这个版本只是漫长旅程中的一个初步阶段——它仍在学习如何行走于理性之路。它的思绪偶尔飘散,答案或许未尽完善,智慧仍在积淀。但这就是学习的美妙之处:既有能力又保持谦逊,既有知识又永远充满疑问。Qwen团队邀请您与QwQ一同探索,接纳它的洞见与不完美,共同踏上这无尽的理解之旅。
模型链接:https://modelscope.cn/models/Qwen/QwQ-32B-Preview
体验链接:https://modelscope.cn/studios/Qwen/QwQ-32B-preview
中文博客:https://qwenlm.github.io/zh/blog/qwq-32b-preview/
01 模型局限性
QwQ-32B-Preview 是由 Qwen 团队开发的实验性研究模型,专注于增强 AI 推理能力。作为预览版本,它展现了令人期待的分析能力,同时也存在以下局限:
语言切换问题:模型可能在回答中混合使用不同语言,影响表达的连贯性。
推理循环:在处理复杂逻辑问题时,模型偶尔会陷入递归推理模式,在相似思路中循环。这种行为虽然反映了模型试图全面分析的努力,但可能导致冗长而不够聚焦的回答。
安全性考虑:尽管模型已具备基础安全管控,但仍需要进一步增强。它可能产生不恰当或存在偏见的回答,且与其他大型语言模型一样,可能受到对抗攻击的影响。强烈建议用户在生产环境中谨慎使用,并采取适当的安全防护措施。
能力差异:QwQ-32B-Preview 在数学和编程领域表现出色,但在其他领域仍有提升空间。模型性能会随任务的复杂度和专业程度而波动。Qwen团队正通过持续优化,努力提升模型的综合能力。
02 模型表现
通过深入的探索和无数的试验,Qwen团队发现了一个深刻的道理:当模型有足够的时间思考、质疑和反思时,它对数学和编程的理解就会深化。就像学生通过认真地检查自己的工作并从错误中学习变得更加聪明一样,模型也通过耐心和深思熟虑的分析获得了更深入的见解。这种细致的反思和自我质疑的过程使得模型能够取得解决复杂问题的突破性进展,本次探索之旅揭示了模型在数学和编程领域解决一些最具挑战性的问题的卓越能力,包括:
GPQA:一个通过小学级别问题评估高阶科学解题能力的评测集,旨在考察科学问题解决能力。
AIME:涵盖算术、代数、计数、几何、数论、概率等中学数学主题的综合评测,测试数学问题解决能力。
MATH-500:包含500个测试样本的MATH评测集,全面考察数学解题能力。
LiveCodeBench:评估真实编程场景中代码生成和问题解决能力的高难度评测集。
具体表现如下:
GPQA:65.2%,展示了研究生水平的科学推理能力;
AIME:50.0%,证明了强大的数学问题解决技能;
MATH-500:90.6%,体现了在各类数学主题上的全面理解;
LiveCodeBench:50.0%,验证了在实际编程场景中的出色表现。
这些成果充分体现了QwQ在分析和问题解决能力方面的显著进步,尤其是在需要深度推理的技术领域。
样例
下列样例展示了QwQ深度自省的能力——质疑自身假设、进行深思熟虑的自我对话,并仔细审视其推理过程的每一步。
User:`` ``S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、7、3 草花K、Q、5、4、6 方块A、5。约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉 P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q 先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?于是,S先生听到如下的对话:``P先生:我不知道这张牌。``Q先生:我知道你不知道这张牌。``P先生:现在我知道这张牌了。``Q先生:我也知道了。``请问:这张牌是什么牌?"`` ``QwQ-32B-Preview:`` ``这道题是逻辑推理题,涉及到信息的逐步披露和推理。题目中有一副16张扑克牌,分别是:``- 红桃:A、Q、4``- 黑桃:J、8、4、2、7、3``- 草花:K、Q、5、4、6``- 方块:A、5``约翰教授选了一张牌,把点数告诉了P先生,把花色告诉了Q先生。然后通过他们的对话,我们要推断出是哪张牌。``首先,让我们来梳理一下对话的内容:``1. P先生说:“我不知道这张牌。” - 这意味着点数是重复的,因为如果点数唯一,P先生就能确定是哪张牌。例如,如果点数是K,只有草花K,那P先生就能确定是草花K。但P先生说不知道,所以点数必须在多个花色中出现。看看哪些点数是重复的:``- A:红桃和方块``- Q:红桃和草花``- 4:红桃、黑桃和草花``- 5:草花和方块``- 其他点数都是唯一的在某个花色中。``所以,可能的点数是A、Q、4、5。``2. Q先生说:“我知道你不知道这张牌。”``- 这句话有点 tricky。Q先生知道花色,而且他说他知道P先生不知道。这意味着,根据Q先生知道的花色,可以确定点数一定是重复的。因为如果花色中的点数是唯一的,那么P先生就能知道是哪张牌。但Q先生肯定地说他知道P先生不知道,所以花色中的点数必须是重复的。``- 让我们看看每个花色中的点数情况:``- 红桃:A、Q、4``- A:红桃和方块``- Q:红桃和草花``- 4:红桃、黑桃、草花``- 所以,红桃花色中的所有点数都是重复的。``- 黑桃:J、8、4、2、7、3``- 4:黑桃、红桃、草花``- 其他点数在黑桃中是唯一的。``- 但Q先生说他知道P先生不知道,所以花色中的所有点数都必须是重复的。但在黑桃中,除了4,其他点数都是唯一的。所以,如果花色是黑桃,且点数是J、8、2、7、3,那么P先生就能知道,这与Q先生的说法矛盾。因此,花色不能是黑桃。``- 草花:K、Q、5、4、6``- Q:草花和红桃``- 4:草花、红桃、黑桃``- 5:草花和方块``- K和6是唯一的。``- 所以,如果花色是草花,点数是K或6,P先生就能知道,这又与Q先生的说法矛盾。因此,花色不能是草花。``- 方块:A、5``- A:方块和红桃``- 5:方块和草花``- 所以,方块中的点数都是重复的。``- 综上所述,Q先生知道花色,且确定所有可能的点数都是重复的,所以花色只能是红桃或方块。``3. P先生说:“现在我知道这张牌了。”` `- P先生原来不知道,但现在知道了。这意味着,在Q先生发言后,P先生通过点数和花色的可能组合,确定了是哪张牌。``- 我们已经知道花色只能是红桃或方块,点数是A、Q、4、5。``- 但P先生现在知道牌了,说明点数加上花色的限制,使得只有唯一一个可能性。``- 让我们看看点数在红桃和方块中的分布:``- A:红桃和方块``- Q:只有红桃` `- 4:红桃` `- 5:方块` `- 等一下,Q先生说花色只能是红桃或方块,但根据之前的分析,花色是红桃或方块。` `- 但是,点数Q只有红桃,4只有红桃,A有红桃和方块,5只有方块。``- P先生原来不知道,说明点数是重复的,即A或5。``- 如果点数是Q或4,只有红桃,那么P先生知道点数后,结合花色是红桃,就能知道是哪张牌,这与P先生第一句“我不知道这张牌”矛盾。``- 所以,点数不能是Q或4,只能是A或5。``- 现在,P先生说他知道牌了,说明在A或5中,结合花色,只有唯一可能性。` `- 但A在红桃和方块都有,5只有方块有。` `- 等一下,如果点数是5,只有方块5,那么P先生知道点数是5,结合花色是方块,就可以确定是方块5。` `- 如果点数是A,花色可以是红桃或方块,那么P先生还是不能确定是哪一张。``- 但是,P先生说现在知道这张牌了,所以点数不能是A,因为A在红桃和方块都有,除非花色是方块,但P先生只有点数信息。` `- 等一下,也许我需要更仔细地思考。\n\n - Q先生说花色是红桃或方块,因为只有这些花色的点数都是重复的。` `- P先生知道点数,现在他说知道了,说明在花色是红桃或方块的限制下,点数唯一确定了牌。``- 对于点数A,花色可以是红桃或方块,所以P先生不能确定是哪一张。``- 对于点数5,只有方块5,所以P先生知道是方块5。``- 因此,只有当点数是5时,P先生才能确定是方块5。` `- 所以,牌是方块5。\n\n4. Q先生说:“我也知道了。”` `- Q先生原来只知道花色,但不知道是哪张牌,现在他也知道了。` `- 如果花色是方块,点数是A或5。``- 但P先生刚才已经确定是方块5,所以Q先生现在也知道了是方块5。` `- 如果花色是红桃,点数是A、Q、4。``- 但是,根据之前的推理,点数Q和4只有红桃,点数A有红桃和方块。` `- 但P先生原来不知道,所以点数不能是Q或4,只能是A。``- 但是,如果花色是红桃,点数是A,P先生不能确定是红桃A还是方块A。` `- 但P先生说现在知道了,所以只有当点数是5,花色是方块时,P先生才能确定。` `- 因此,Q先生现在也确定是方块5。``综上所述,这张牌是方块5。``**最终答案**``$$ \\boxed{\\text{方块5}} $$
user:`` ``有个人想买几套餐具,到了店里发现,自己的钱可以买21把叉子和21个勺子,也够买28个小刀,但是,他想三样东西都买,而且要配成一套,并且把钱刚好花完,如果你是这个人,你会怎么买呢?`` ``QwQ-32B-Preview:`` ``这个问题挺有意思的。我得好好想想。题目说,我有多少钱可以买21把叉子和21个勺子,或者可以买28个小刀。但是我想三样都买,而且要配成一套,还要把钱正好花完。我要怎么安排呢?``首先,我需要理解一下这里的“一套”是什么意思。``我想应该是买一把叉子、一个勺子和一个小刀作为一个组合,也就是一套包括这三种餐具各一件。对吧?``所以,我的目标是买若干套这样的餐具,每套包含一把叉子、一个勺子和一个小刀,而且要把所有的钱都花完。``但是,题目中给出的信息是,我的钱可以买21把叉子和21个勺子,或者可以买28个小刀。``这说明,叉子和勺子的价格是相同的,因为用同样的钱可以买到相同数量的叉子和勺子,而小刀的价格不同,因为同样的钱可以买更多的小刀。``让我设一下变量,方便计算。``假设叉子的价格是x,勺子的价格也是x,小刀的价格是y。``那么,根据题意:21x + 21x = 42x,这是我的总预算。``另外,这个总预算也可以买28个小刀,也就是28y。``所以,42x = 28y。从这个等式,我可以得出x和y之间的关系。``42x = 28y两边都除以14,得到:3x = 2y``所以,y = (3/2)x``好了,现在我知道小刀的价格是叉子价格的1.5倍。``现在,我想要买若干套餐具,每套包括一把叉子、一个勺子和一个小刀,而且要把钱正好花完。``设我买n套,那么总成本是:n(x + x + y) = n(2x + y)``但是,y = (3/2)x,所以代入得:n(2x + (3/2)x) = n((7/2)x)``所以,总成本是n*(7/2)x``而我的总预算是42x,所以:n*(7/2)x = 42x``两边都除以x(假设x不为零),得到:n*(7/2) = 42``然后,解n:n = 42 / (7/2) = 42 * (2/7) = 12``所以,我可以买12套餐具,每套包含一把叉子、一个勺子和一个小刀,而且把钱正好花完。``但是,我感觉这个答案有点简单,可能哪里想错了。让我再检查一下。``首先,根据题意,钱可以买21叉子和21勺子,或者28小刀。``我设叉子和勺子各为x,小刀为y,然后得到42x = 28y,从而y = (3/2)x``然后,每套餐具是x + x + y = 2x + (3/2)x = (7/2)x``总预算42x,除以每套的成本(7/2)x,得到12套。看起来逻辑是对的。``但是,也许还有其他考虑。``比如,是否必须买整数套?``还是可以单独购买餐具?``题目说要配成一套,并且把钱刚好花完。``所以,应该是买整数套,而且钱要正好花完。``我的计算中,n=12,是整数,符合要求。``或者,可能有其他组合,比如不完全配成套,但题目明确说要配成一套,并且把钱花完,所以应该按照套来买。``所以,我认为答案是买12套餐具,每套包括一把叉子、一个勺子和一个小刀。``**最终答案**``$$ \\boxed{12} $$
03 最佳实践
推理代码
from modelscope import AutoModelForCausalLM, AutoTokenizer`` ``model_name = "Qwen/QwQ-32B-Preview"`` ``model = AutoModelForCausalLM.from_pretrained(` `model_name,` `torch_dtype="auto",` `device_map="auto"``)``tokenizer = AutoTokenizer.from_pretrained(model_name)`` ``prompt = "How many r in strawberry."``messages = [` `{"role": "system", "content": "You are a helpful and harmless assistant. You are Qwen developed by Alibaba. You should think step-by-step."},` `{"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=512``)``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)
本地推理速度
使用EvalScope的Speed Benchmark工具测试QwQ-32B-Preview模型基于transformers的推理速度,测试生成2048 tokens时的速度与显存占用,输入长度分别为1、6144、14336、30720:
EvalScope 开源地址:
https://github.com/modelscope/evalscope
Speed Benchmark工具使用说明:
https://evalscope.readthedocs.io/zh-cn/latest/user_guides/stress_test/speed_benchmark.html
测试环境:
-NVIDIA A100 80GB
-CUDA 12.1
-Pytorch 2.3.1
-Flash Attention 2.5.8
-Transformers 4.46.0
压测命令:
CUDA_VISIBLE_DEVICES=0 evalscope perf \` `--parallel 1 \` `--model Qwen/QwQ-32B-Preview \` `--attn-implementation flash_attention_2 \` `--log-every-n-query 1 \` `--connect-timeout 60000 \` `--read-timeout 60000\` `--max-tokens 2048 \` `--min-tokens 2048 \` `--api local \` `--dataset speed_benchmark
测试结果:
Ollama直接运行
该模型也可以通过Ollama,基于ModelScope上不同量化精度的GGUF版本直接运行
- 设置ollama下启用
ollama serve
- 通过 ollama run命令直接运行QwQ-32B-Preview模型的GGUF版本
ollama run modelscope.cn/AI-ModelScope/QwQ-32B-Preview-GGUF
运行结果如下:
更多通过Ollama直接运行ModelScope上任意GGUF模型的方法,可参考文档:https://www.modelscope.cn/docs/models/advanced-usage/ollama-integration
模型微调
本文介绍使用ms-swift对qwq-32b-preview进行微调。swift是魔搭社区官方提供的LLM与MLLM微调框架,支持400+大语言模型和100+多模态大模型的微调到部署。
swift开源地址:
https://github.com/modelscope/ms-swift
在开始微调之前,请确保您的环境已正确安装ms-swift
git clone https://github.com/modelscope/ms-swift.git``cd swift``pip install -e .[llm]
我们使用open-o1作为微调的数据集:
https://modelscope.cn/datasets/AI-ModelScope/OpenO1-SFT
运行以下微调脚本,即可开启微调。
# Experimental environment: 4 * A100``# 4 * 60GB GPU memory``NPROC_PER_NODE=4 \``CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \` `--model_type qwq-32b-preview \` `--model_id_or_path Qwen/QwQ-32B-Preview \` `--dataset open-o1#20000 \` `--logging_steps 5 \` `--max_length 8192 \` `--learning_rate 1e-4 \` `--output_dir output \` `--lora_target_modules ALL \` `--num_train_epochs 5 \` `--deepspeed default-zero3
显存占用:
微调后推理脚本如下,这里的ckpt_dir需要修改为训练生成的last checkpoint文件夹。
# 直接推理``CUDA_VISIBLE_DEVICES=0 swift infer \` `--ckpt_dir output/qwq-32b-preview/vx-xxx/checkpoint-xxx \` `--load_dataset_config true --show_dataset_sample 10`` ``# 使用vllm推理``CUDA_VISIBLE_DEVICES=0 swift infer \` `--ckpt_dir output/qwq-32b-preview/vx-xxx/checkpoint-xxx \` `--infer_backend vllm --max_model_len 8192 \` `--load_dataset_config true --show_dataset_sample 10
微调效果展示(以下为微调了200个steps的效果)
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。