新闻详情

新闻详情

首页 / 资讯中心 / 详情

Transformers 聊天模型实战指南:从 pipeline 快速上手到内存与性能优化

发布时间:2026/9/10 1:50:00来源:尧图网络
Transformers 聊天模型实战指南:从 pipeline 快速上手到内存与性能优化
Transformers 聊天模型实战指南从 pipeline 快速上手到内存与性能优化【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers本文以 Transformers 仓库中的docs/source/ko/conversations.md为核心骨架系统讲解如何在本地加载聊天模型Chat Model并与之对话从高层的TextGenerationPipeline一行代码发起对话到低层手动拆解「聊天模板格式化 → 分词 → 生成 → 解码」的完整链路再到选择模型的思路、内存占用估算与量化、生成速度受内存带宽限制的底层原理。读完本文你将能够独立完成聊天模型的选择、加载、多轮对话、显存优化与吞吐调优。快速开始用 TextGenerationPipeline 发起第一段对话聊天模型Chat Model是一种可以接收消息并生成回复的对话式 AI。2023 年年中之后发布的大多数语言模型都属于聊天模型常被称为 instruct指令微调或 instruction-tuned 模型而不支持聊天的模型通常被称为 base基座或 pretrained预训练模型。聊天模型可以免费下载并在本地运行大型模型需要高性能硬件与大内存但也有很多小型模型可以在低配 GPU 甚至普通桌面 CPU / 笔记本 CPU 上流畅运行。Transformers 提供了简单的高层pipelineAPI 让我们跳过繁琐细节直接对话。首先构造一个对话chat它本质上是一个消息列表每条消息是一个包含role与content两个键的字典。chat [ {role: system, content: You are a sassy, wise-cracking robot as imagined by Hollywood circa 1986.}, {role: user, content: Hey, can you tell me any fun things to do in New York?} ]注意在第一条user消息之外可以额外提供一条system消息。并非所有聊天模型都支持 system 消息对于支持的模型system 消息用来指示模型在对话中应如何表现——例如希望它风趣还是严肃、回答简短还是详细。也可以省略 system 消息直接使用 You are a helpful and intelligent AI assistant who responds to user queries. 之类的简单提示词。构造好chat后最快的方式是使用TextGenerationPipeline。以下示例使用LLaMA-3meta-llama/Meta-Llama-3-8B-Instruct演示该模型需要先在 Hugging Face 上申请访问权限并用账号登录。代码中device_mapauto会在 GPU 显存充足时自动将模型加载到 GPUdtypetorch.bfloat16则以 bfloat16 精度加载以节省显存。import torch from transformers import pipeline pipe pipeline(text-generation, meta-llama/Meta-Llama-3-8B-Instruct, dtypetorch.bfloat16, device_mapauto) response pipe(chat, max_new_tokens512) print(response[0][generated_text][-1][content])运行后会输出一段模型生成的回复例如(sigh) Oh boy, youre asking me for advice? Youre gonna need a map, pal! Alright, alright, Ill give you the lowdown. But dont say I didnt warn you, Im a robot, not a tour guide! ...继续多轮对话response[0][generated_text]中包含了到目前为止的完整对话历史含模型刚生成的回复因此继续对话只需把新的user消息追加进去再重新传入 pipeline 即可chat response[0][generated_text] chat.append( {role: user, content: Wait, whats so wild about soup cans?} ) response pipe(chat, max_new_tokens512) print(response[0][generated_text][-1][content])如此反复就能一直对话下去——直到超出模型的上下文窗口context window或内存耗尽。pipeline 的默认生成参数源码依据从源码 src/transformers/pipelines/text_generation.py 可以看到TextGenerationPipeline在未显式指定生成配置时会使用如下默认值除非模型自带的generation_config.json覆盖它们max_new_tokens: 256do_sample: Truetemperature: 0.7因此在快速开始示例中显式传入max_new_tokens512可以覆盖默认的 256 上限获得更长的回复。pipeline 内部会在检测到底层模型是对话模型、且输入是结构化chat时自动切换到chat 模式见 text_generation.py 的类文档说明并调用模型的聊天模板对消息进行格式化。如何选择合适的聊天模型Hugging Face Hub 上有大量聊天模型可供选择对新手而言关键只需关注两点模型大小决定运行速度以及能否装入内存/显存输出质量模型生成回复的质量。通常二者呈正相关越大的模型往往能力越强但即使是相同规模的模型质量也可能有显著差异。从模型名读懂规模模型大小可以从名称中的数字直接读出例如 8B 或 70B 表示模型的参数量。除非经过量化否则每个参数大约需要 2 字节内存因此 80 亿参数的 8B 模型大约占用 16GB 内存还需留出少量额外开销——这正好适合 3090、4090 这类 24GB 显存的高端 GPU。部分聊天模型是Mixture of ExpertsMoE模型命名方式有所不同例如 8x7B 或 141B-A35B前者可解读为约 568×7亿参数后者约 141 亿参数。量化Quantization可以把每参数内存占用降到 8 位、4 位甚至更低具体细节见后文「内存考虑」章节。借助 Leaderboard 与专业领域模型除模型大小外还可以参考社区leaderboard快速判断模型水平常见的有 OpenLLM Leaderboard 和 LMSys Chatbot Arena Leaderboard。LMSys 榜单包含一些闭源模型注意在license列筛选出可访问的模型再到 Hugging Face Hub 搜索对应开源权重。另外一些模型针对特定领域如医疗、法律文本或非英语语言做了专门优化。在这些领域作业时专用模型可能表现更好但不可一概而论——尤其是模型较老或偏小时最新的通用模型往往更强。社区也在逐步推出领域专属 leaderboard如医疗 LLM 榜单可以帮助快速定位特定领域的最佳模型。用 transformers chat 命令行快速开聊除了 Python API仓库还提供了transformers chat命令行工具实现在 src/transformers/cli/chat.py安装 Transformers 后可直接在终端发起交互式对话。在确保transformers serve服务已启动的前提下执行transformers chat Qwen/Qwen2.5-0.5B-Instruct该命令会启动一个交互式会话并在会话开头列出若干基础命令。CLI 支持以参数名值的格式传递任意generate参数transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sampleFalse max_new_tokens10查看全部可用选项transformers chat -h从实现上看chatCLI 基于 AutoClass 构建内部复用了文本生成与聊天模板的工具链见 chat.py 中关于max_new_tokens100 do_sampleFalse eos_token_id[1,2]等示例参数的说明并支持将会话保存到本地文件save_chat见 chat.py。pipeline 内部发生了什么五步低层拆解高层 pipeline 用起来方便但灵活性有限。下面用更低层的方式手动复现一次完整对话把每一步都暴露出来from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 预先准备好输入 chat [ {role: system, content: You are a sassy, wise-cracking robot as imagined by Hollywood circa 1986.}, {role: user, content: Hey, can you tell me any fun things to do in New York?} ] # 1: 加载模型与分词器 model AutoModelForCausalLM.from_pretrained(meta-llama/Meta-Llama-3-8B-Instruct, device_mapauto, dtypetorch.bfloat16) tokenizer AutoTokenizer.from_pretrained(meta-llama/Meta-Llama-3-8B-Instruct) # 2: 套用聊天模板 formatted_chat tokenizer.apply_chat_template(chat, tokenizeFalse, add_generation_promptTrue) print(Formatted chat:\n, formatted_chat) # 3: 将聊天文本分词上一步若设 tokenizeTrue 可一步完成 inputs tokenizer(formatted_chat, return_tensorspt, add_special_tokensFalse) # 把分词结果移动到模型所在的设备CPU/GPU inputs {key: tensor.to(model.device) for key, tensor in inputs.items()} print(Tokenized inputs:\n, inputs) # 4: 让模型生成回复 outputs model.generate(**inputs, max_new_tokens512, temperature0.1) print(Generated tokens:\n, outputs) # 5: 把模型输出的 token 解码回字符串 decoded_output tokenizer.decode(outputs[0][inputs[input_ids].size(1):], skip_special_tokensTrue) print(Decoded output:\n, decoded_output)这段代码包含的内容足以单独成篇这里先给出关键步骤的概览加载模型与分词器从 Hugging Face Hub 加载预训练权重及对应的分词器聊天模板格式化调用分词器的apply_chat_template把消息列表转换成模型期望的输入格式分词把格式化后的文本转成 token id 序列生成调用model.generate自回归生成回复 token解码把新生成的 token去掉 prompt 部分还原为字符串。apply_chat_template 的关键参数apply_chat_template定义在 src/transformers/tokenization_utils_base.py核心参数包括conversationrole/content键构成的消息列表即对话历史add_generation_promptTrue在格式化结果末尾追加表示「assistant 回复开始」的 token告诉模型开始生成新回复需模板支持才生效tokenizeFalse返回格式化后的字符串而非 token id为True时直接返回 token id可与第 3 步合并continue_final_message让模型续写最后一条消息而不是新开一条可用于预填充模型回复与add_generation_prompt互斥tools/documents向模板传递工具调用function calling或 RAG 文档模板不支持时无效果padding/truncation/max_length/return_tensors仅在tokenizeTrue时生效。值得一提的是pipeline 的 chat 模式本质上就是替你完成了第 2、3 步在 text_generation.py 的 preprocess 中检测到输入是Chat对象后会自动调用apply_chat_template自动设置add_generation_prompt或continue_final_message并在 postprocess 中把生成文本包装成带assistant角色的新消息拼接回完整对话历史——这正是response[0][generated_text]能直接作为下一轮输入的原因。性能、内存与硬件如今大多数机器学习任务都在 GPU 上运行CPU 上生成文本虽然较慢但同样可行。只要模型能装进显存GPU 通常是更优选择。内存考虑默认情况下TextGenerationPipeline、AutoModelForCausalLM等 Hugging Face 类以float32精度加载模型每个参数占 4 字节32 位——这意味着 80 亿参数的 8B 模型需要约32GB内存这往往是一种浪费现代语言模型大多以每个参数 2 字节的bfloat16精度训练。在硬件支持的前提下Nvidia 30xx / Axxx 及以上可用dtype参数以 bfloat16 加载模型内存直接减半。如果还想进一步压缩可以使用量化Quantization对权重做有损压缩把每个参数压到 8 位、4 位甚至更低。4 位量化可能对输出质量产生负面影响但为了把更大更强的模型装进显存这一权衡通常是值得的。下面用bitsandbytes演示配置类BitsAndBytesConfig定义在 src/transformers/utils/quantization_config.pyfrom transformers import AutoModelForCausalLM, BitsAndBytesConfig quantization_config BitsAndBytesConfig(load_in_8bitTrue) # 也可以尝试 load_in_4bit model AutoModelForCausalLM.from_pretrained(meta-llama/Meta-Llama-3-8B-Instruct, device_mapauto, quantization_configquantization_config)上述做法同样适用于pipelineAPI只需把量化配置放进model_kwargsfrom transformers import pipeline, BitsAndBytesConfig quantization_config BitsAndBytesConfig(load_in_8bitTrue) # 也可以尝试 load_in_4bit pipe pipeline(text-generation, meta-llama/Meta-Llama-3-8B-Instruct, device_mapauto, model_kwargs{quantization_config: quantization_config})除bitsandbytes之外Transformers 还支持多种量化后端详见 Quantization 指南更多量化配置类可在 src/transformers/utils/quantization_config.py 中查看。更系统的 LLM 推理优化参见 LLM 推理优化 与 模型内存剖析。性能考虑一般而言更大的聊天模型占用更多内存、生成也更慢。具体而言聊天模型逐 token 生成文本时瓶颈往往不是算力而是内存带宽每生成一个 token都要把全部参数从内存中读取一遍。因此每秒生成的 token 数约等于「所在内存的带宽 ÷ 模型大小」。以前面 bfloat16 加载、约 16GB 的模型为例每生成一个 token 都要从内存读取 16GB 数据。各硬件的内存带宽大致量级为消费级 CPU20–100 GB/sec消费级 GPU 以及 Intel Xeon、AMD Threadripper/Epyc、Apple Silicon 等特殊 CPU200–900 GB/sec数据中心 GPU如 Nvidia A100、H100最高 2–3 TB/sec。据此可以估算自己硬件上的生成速度。想提速最直接的办法是减小模型通常靠量化或换用内存带宽更高的硬件单纯增加算力帮助不大。绕过带宽瓶颈的常见高级技术是辅助生成Assisted Generation也叫「推测采样」speculative decoding用一个小得多的「草稿模型」一次猜测多个未来 token再由聊天模型验证。若猜测正确一次前向传播就能产出多个 token大幅缓解带宽瓶颈、显著提速。最后提一下MoEMixture of Experts模型如 Mixtral、Qwen-MoE、DBRX 等流行聊天模型都属于此类。它们生成每个 token 时只激活一小部分参数因此虽然总参数量很大但实际占用的内存带宽较低通常比同规模稠密Dense模型快数倍。不过辅助生成等技术在 MoE 模型上可能低效——每个新猜测的 token 都会激活更多参数抵消 MoE 架构带来的速度优势。小结从TextGenerationPipeline的「开箱即聊」到apply_chat_template支撑下的五步低层链路再到按命名估算显存、用 bfloat16 与 bitsandbytes 量化控制内存、依据内存带宽预判生成速度——这套方法论覆盖了聊天模型本地部署的核心环节。无论是想在 24GB 消费级 GPU 上跑 8B 模型还是想在 CPU 上凑合推理小模型都可以依据本文给出的估算方式快速定位瓶颈再通过 量化指南、生成策略 与 安装指南 等仓库文档继续深入。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ML-For-Beginners 聚类作业实战:在尼日利亚音乐数据集上尝试 K-Means 之外的聚类方法 2026/9/10 2:35:07

ML-For-Beginners 聚类作业实战:在尼日利亚音乐数据集上尝试 K-Means 之外的聚类方法

ML-For-Beginners 聚类作业实战:在尼日利亚音乐数据集上尝试 K-Means 之外的聚类方法 【免费下载链接】ML-For-Beginners 12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all 项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginne…

阅读更多 →
smic18工艺库文件全解析:类型、部署与避坑指南 2026/9/10 2:35:07

smic18工艺库文件全解析:类型、部署与避坑指南

简介:SMIC 18纳米工艺库是面向Cadence EDA工具链的中芯国际PDK资源,专供模拟、数字与混合信号芯片设计及版图验证使用,帮助设计师在原理图仿真、寄生参数提取、时序分析和物理检查中获得与实际流片一致的精度。资源包约61MB,合计2…

阅读更多 →
纯C OCR引擎:Android端轻量高效文字识别方案 2026/9/10 2:35:07

纯C OCR引擎:Android端轻量高效文字识别方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Carbon 仓库的 AI 助手工具规范:禁用传统 Shell 命令、改用语义化 API 工具 2026/9/10 2:35:07

Carbon 仓库的 AI 助手工具规范:禁用传统 Shell 命令、改用语义化 API 工具

Carbon 仓库的 AI 助手工具规范:禁用传统 Shell 命令、改用语义化 API 工具 【免费下载链接】carbon-lang Carbon Languages main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README) 项目…

阅读更多 →
微信小程序智慧旅游平台开发实战:从需求到上线全流程解析 2026/9/10 2:35:07

微信小程序智慧旅游平台开发实战:从需求到上线全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Spring Authorization Server整合Spring Session:会话固定攻击防护实战指南 2026/9/10 2:32:06

Spring Authorization Server整合Spring Session:会话固定攻击防护实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞