ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qwen3 与 Transformers 推理实战:pipeline 生成、思考模式切换、长上下文扩展与流式批处理

Qwen3 与 Transformers 推理实战:pipeline 生成、思考模式切换、长上下文扩展与流式批处理 Qwen3 与 Transformers 推理实战pipeline 生成、思考模式切换、长上下文扩展与流式批处理【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5本篇技术指南以 Qwen3Qwen 团队开源的大语言模型系列为核心系统讲解如何在transformers要求4.51.0中完成从环境配置、多轮对话生成、思考/非思考模式切换、思考内容与工具调用解析到量化模型服务、YaRN 长上下文扩展、流式与批量生成的完整推理链路。读完本文你将掌握用pipeline()与generate()两条接口驱动 Qwen3 的实战方案并能处理 FP8/AWQ 量化权重、131K 长上下文以及分布式推理中的常见问题。环境配置在开始之前请确保满足以下依赖条件transformers4.51.0Qwen3 的聊天模板与生成配置依赖该版本以上的新特性仓库 README.md 同样要求transformers4.51.0推荐torch2.6推荐使用 GPU 运行。从仓库文档的 Quickstartdocs/source/getting_started/quickstart.md看官方还建议使用 Python 3.10 或更高版本并对推理后端有更细致的建议对 FP8 等新特性建议环境内安装与torch的 CUDA 版本兼容的 CUDA 编译器以及triton。若使用本地交互式聊天可参考 examples/demo/cli_demo.py 与 examples/demo/web_demo.py两者均基于transformers的AutoModelForCausalLM/AutoTokenizer/TextIteratorStreamer实现。基本用法pipeline 多轮对话使用 Qwen3 生成文本有两条路径pipeline()接口样板代码更少和generate()接口控制更精细。下面是一个用pipeline完成多轮对话的最小示例from transformers import pipeline model_name_or_path Qwen/Qwen3-8B generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, ) messages [ {role: user, content: Give me a short introduction to large language models.}, ] messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content]) messages.append({role: user, content: In a single sentence.}) messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content])关键参数详解创建 pipeline 时有几个重要参数直接影响加载方式与推理性能模型Modelmodel_name_or_path可以是模型 ID如Qwen/Qwen3-8B也可以是本地目录路径。将模型文件下载到本地目录的方式huggingface-cli download --local-dir ./Qwen3-8B Qwen/Qwen3-8B中国大陆用户也可以使用 ModelScope 下载modelscope download --local_dir ./Qwen3-8B Qwen/Qwen3-8B下载完成后将model_name_or_path指向本地目录即可离线加载。设备分配Device Placementdevice_mapauto会在存在多设备时自动把模型参数分配到多个设备上它依赖accelerate包。若希望使用单个设备可以传device而非device_mapdevice-1或devicecpu使用 CPUdevicecuda使用当前 GPUdevicecuda:1或device1使用第二块 GPU。注意device_map与device不能同时使用计算精度Compute Precisiontorch_dtypeauto会根据检查点的原始精度与设备支持精度自动确定数据类型现代设备上通常解析为bfloat16。如果不传torch_dtypeauto默认类型是float32会占用两倍内存且计算更慢。生成配置的默认值与覆盖调用文本生成 pipeline 时会使用模型文件自带的生成配置例如generation_config.json该配置可通过在调用时直接传参覆盖。Qwen3 的默认生成参数等效于messages generator(messages, do_sampleTrue, temperature0.6, top_k2, top_p0.95, eos_token_id[151645, 151643])[0][generated_text]其中151645与151643是 Qwen3 的结束符 token分别为|im_end|与结束 token详见下文。关于生成参数的最佳实践请参见各模型的模型卡片。仓库 docs/source/getting_started/quickstart.md 中给出了补充建议思考模式推荐temperature0.6, top_p0.95, top_k20, min_p0即generation_config.json中的默认值且不要使用贪心解码否则可能导致性能退化与无限重复非思考模式建议temperature0.7, top_p0.8, top_k20, min_p0。提示仓库的 examples/speed-benchmark/speed_benchmark_transformers.py 展示了以AutoModelForCausalLMGenerationConfig.from_pretrained加载 Qwen 系列模型的基准测试写法其中通过attn_implementationflash_attention_2或eager显式选择注意力实现可作为追求吞吐性能时的参考。思考与非思考模式默认情况下Qwen3 模型如Qwen/Qwen3-8B会在回复前先进行思考thinkingpipeline()接口同样如此。切换思考/非思考模式有两种方法方法一追加空 think 块无状态、硬性关闭在消息列表末尾追加一条仅包含think\n\n/think\n\n的 assistant 消息。此方法无状态仅对当前这一轮生效并且会严格阻止模型生成思考内容messages [ {role: user, content: Give me a short introduction to large language models.}, {role: assistant, content: think\n\n/think\n\n}, ] messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content]) messages.append({role: user, content: In a single sentence.}) messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content])方法二使用 /think 与 /no_think 指令有状态、软性切换在用户user或系统system消息中追加/no_think禁用思考、/think启用思考。此方法有状态多轮对话中模型遵循最近一次指令。这也是 Quickstart 中称为软开关soft switch的机制messages [ {role: user, content: Give me a short introduction to large language models./no_think}, ] messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content]) messages.append({role: user, content: In a single sentence./think}) messages generator(messages, max_new_tokens32768)[0][generated_text] # print(messages[-1][content])补充说明来自 docs/source/getting_started/quickstart.md对于原版 Qwen32504 版本系还存在硬开关hard switch——在tokenizer.apply_chat_template(..., enable_thinkingFalse)中显式关闭思考适用于追求效率、不需要推理的场景。而 Qwen3-Instruct-2507 仅支持非思考模式、Qwen3-Thinking-2507 仅支持思考模式这类新版本模型不再需要也不再支持指定enable_thinkingFalse。解析思考内容pipeline()返回的generated_text中思考内容以think\n...\n/think\n\n形式内嵌在 assistant 消息的content字段里。如果需要更结构化的消息格式可以用下面的函数把思考内容提取到reasoning_content字段该格式与 vLLM、SGLang 等推理框架的返回格式保持一致import copy import re def parse_thinking_content(messages): messages copy.deepcopy(messages) for message in messages: if message[role] assistant and (m : re.match(rthink\n(.)/think\n\n, message[content], flagsre.DOTALL)): message[content] message[content][len(m.group(0)):] if thinking_content : m.group(1).strip(): message[reasoning_content] thinking_content return messages该函数使用copy.deepcopy避免修改原始消息通过正则匹配think\n(.)/think\n\nre.DOTALL使.可匹配换行剥离思考块将剩余文本保留在content中并把思考内容放入reasoning_content字段。仓库 docs/source/getting_started/quickstart.md 中展示了另一种等价的 token 级解析方式在model.generate输出中通过逆序查找 token151668/think的位置来切分thinking_content与content这种方法对直接使用generate()接口的场景同样有效。解析工具调用Qwen3 具备强大的工具调用function calling / tool use能力。在 Transformers 中进行工具调用的完整指南请参阅仓库文档 Function Calling 指南原文档中的../framework/function_call.md#hugging-face-transformers一节。该文档强调Qwen3 的工具调用本质上是基于 prompt 工程Hermes 风格模板实现的Transformers 的tokenizer_config.json聊天模板中已经内置了对该格式的支持在思考模式下模型会先输出reasoning_content推理过程再输出工具调用解析时需要同时处理这两部分内容。服务量化模型FP8 与 AWQQwen3 提供两类预量化模型FP8与AWQ。服务它们的命令与原始模型完全一致只需替换模型名称from transformers import pipeline model_name_or_path Qwen/Qwen3-8B-FP8 # FP8 models # model_name_or_path Qwen/Qwen3-8B-AWQ # AWQ models generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, )注意FP8 计算仅支持计算能力大于 8.9 的 NVIDIA GPU即 Ada Lovelace、Hopper 及更新架构。为获得更好性能请确保环境中安装了triton以及与torch的 CUDA 版本兼容的 CUDA 编译器。重要截至 4.51.0Transformers 在跨 GPU运行这些 FP8 检查点时存在已知问题。可采用以下两种方法绕过在运行脚本前设置环境变量CUDA_LAUNCH_BLOCKING1或注释掉本地 Transformers 安装中transformers/integrations/finegrained_fp8.py中的相关行该文件第 340 行附近的修复逻辑。关于量化模型的更多细节还可参考仓库中的 AWQ 指南 与 GPTQ 指南。启用长上下文RoPE 与 YaRNQwen3 模型预训练阶段的最大上下文长度为32,768 token。借助 RoPE 缩放RoPE scaling技术可以扩展到131,072 token官方已验证 YaRN 方案的性能。Transformers 支持 YaRN可通过两种方式启用方式一修改模型文件在模型的config.json中添加rope_scaling字段{ ..., max_position_embeddings: 131072, rope_scaling: { rope_type: yarn, factor: 4.0, original_max_position_embeddings: 32768 } }方式二加载时覆盖默认参数from transformers import pipeline model_name_or_path Qwen/Qwen3-8B generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, model_kwargs{ max_position_embeddings: 131072, rope_scaling: { rope_type: yarn, factor: 4.0, original_max_position_embeddings: 32768, }, } )注意截至 Transformers 4.52.3框架会使用max_position_embeddings / rope_scaling.original_max_position_embeddings的比值作为rope_scaling.factor而忽略你显式指定的factor值。注意Transformers 实现的是静态 YaRN——缩放因子不随输入长度变化因此可能对短文本性能有影响。官方建议仅在确实需要处理长上下文时才添加rope_scaling配置并根据实际需求调整factor例如若应用典型上下文长度为 65,536 token把factor设为 2.0 更合适。流式生成Streaming Generation借助TextStreamer可以让 Qwen3 的对话变成流式输出逐字打印到控制台或终端from transformers import pipeline, TextStreamer model_name_or_path Qwen/Qwen3-8B generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, ) streamer TextStreamer(pipe.tokenizer, skip_promptTrue, skip_special_tokensTrue) messages generator(messages, max_new_tokens32768, streamerstreamer)[0][generated_text]如果希望把流式文本交给下游应用迭代消费可以使用TextIteratorStreamer——它把可打印文本放入一个队列作为迭代器被下游读取from transformers import pipeline, TextIteratorStreamer model_name_or_path Qwen/Qwen3-8B generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, ) streamer TextIteratorStreamer(pipe.tokenizer, skip_promptTrue, skip_special_tokensTrue) # 用线程在后台执行生成 # 否则进程会被阻塞直到生成结束观察不到流式效果 from threading import Thread generation_kwargs dict(text_inputsmessages, max_new_tokens32768, streamerstreamer) thread Thread(targetpipe, kwargsgeneration_kwargs) thread.start() generated_text for new_text in streamer: generated_text new_text print(generated_text)必须将生成放到后台线程中如上面的Thread否则主线程会一直被阻塞到生成完成无法实现流式输出。仓库中的 examples/demo/cli_demo.py命令行交互与 examples/demo/web_demo.pyGradio Web 界面正是这种后台线程 TextIteratorStreamer模式的完整实现它们将历史对话通过tokenizer.apply_chat_template格式化再以Thread(targetmodel.generate, kwargs{streamer: streamer, ...})启动生成主循环逐段消费流式文本并刷新输出。这两个 demo 还支持通过device_mapcpu或device_mapauto切换 CPU/GPU 推理可作为流式应用的落地参考。批量生成Batch Generation注意批处理并不一定自动带来性能提升请结合场景实测。将多条消息列表一次性传给 pipeline即可进行批量生成。批量生成前需要把padding_side设为leftfrom transformers import pipeline model_name_or_path Qwen/Qwen3-8B generator pipeline( text-generation, model_name_or_path, torch_dtypeauto, device_mapauto, ) generator.tokenizer.padding_sideleft batch [ [{role: user, content: Give me a short introduction to large language models.}], [{role: user, content: Give me a detailed introduction to large language models.}], ] results generator(batch, max_new_tokens32768, batch_size2) batch [result[0][generated_text] for result in results]FAQ分布式推理的常见疑问你可能会发现 Transformers 的分布式推理并没有想象中快。原因是device_mapauto只是把模型参数切分加载到多块 GPU 上并不应用张量并行tensor parallelism因此推理时每次只使用其中一块 GPU 进行计算。如果需要真正的张量并行请参考 Transformers 官方文档中关于多 GPU 推理性能优化的章节perf_infer_gpu_multi。对于大规模、高并发的服务化部署需求建议转向仓库文档中的专业推理框架方案例如 vLLM 部署指南 与 SGLang 部署指南——它们内置张量并行与连续批处理更适合生产环境。延伸generate() 接口与更精细的控制pipeline()适合快速上手但如果需要精细控制例如解析 thinking 与 content 的 token 边界、自定义 generation_config可以使用generate()接口。仓库 docs/source/getting_started/quickstart.md 给出了标准范式from transformers import AutoModelForCausalLM, AutoTokenizer model_name Qwen/Qwen3-8B model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypeauto, device_mapauto ) tokenizer AutoTokenizer.from_pretrained(model_name) messages [ {role: user, content: Give me a short introduction to large language models.}, ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue, enable_thinkingTrue, # 思考/非思考切换默认为 True ) model_inputs tokenizer([text], return_tensorspt).to(model.device) generated_ids model.generate(**model_inputs, max_new_tokens32768) output_ids generated_ids[0][len(model_inputs.input_ids[0]):].tolist() # 解析思考内容逆序查找 /thinktoken 151668 try: index len(output_ids) - output_ids[::-1].index(151668) except ValueError: index 0 thinking_content tokenizer.decode(output_ids[:index], skip_special_tokensTrue).strip(\n) content tokenizer.decode(output_ids[index:], skip_special_tokensTrue).strip(\n) print(thinking content:, thinking_content) print(content:, content)其中apply_chat_template负责把消息列表渲染为带聊天模板的输入enable_thinkingTrue是切换思考/非思考模式的硬开关默认开启151668是/think的 token id。若需要将推理流程与下游 Agent 应用结合还可进一步阅读仓库的 Qwen-Agent 文档 与 Langchain 集成指南。至此你已经掌握了在 Transformers 中驱动 Qwen3 的核心能力多轮对话、思考模式精细控制、结构化输出解析、量化权重服务、长上下文扩展以及流式与批量生成可以据此快速搭建自己的推理应用。【免费下载链接】Qwen1.5Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表