Transformers库分析

张开发
2026/4/17 4:24:20 15 分钟阅读

分享文章

Transformers库分析
一、Transformers库源码分析https://github.com/huggingface/transformers/tree/main/src/transformers/models/qwen3_vl这个代码文件 (modeling_deepseek_v3.py) 是DeepSeek-V3 大语言模型的核心神经网络实现。它的核心作用是为 DeepSeek-V3 模型提供一个可加载、可运行且可定制的 PyTorch 模块。为了更直观地理解其核心架构与功能下图展示了该代码定义的主要组件及其协作关系单个Transformer块传递位置信息残差连接残差连接输入 InputToken IDsEmbedding词嵌入层Attention自注意力机制Feed Forward前馈神经网络输出 OutputLogits具体来说它的作用体现在以下几个关键方面1.定义模型架构 (Model Architecture)这是代码最核心的作用。它用 PyTorch 的nn.Module定义了 DeepSeek-V3 模型的完整神经网络结构。这包括嵌入层将输入的词汇ID转换为高维向量。Transformer 层堆叠模型的核心由数十甚至上百层相同的解码器块组成。每一层都包含自注意力机制让模型能够关注到输入序列中所有位置的信息。前馈神经网络对注意力机制的输出进行非线性变换。输出层将最终的隐藏状态转换为词汇表上的概率分布用于预测下一个词。2.实现前向传播 (Forward Pass)代码中的forward方法详细规定了输入数据如 token IDs如何一步步通过整个网络最终得到输出预测的下一个 token 的概率。这个过程包括了计算注意力权重应用残差连接和层归一化应用激活函数3.支持不同使用场景该文件通常不会只定义一个类而是会提供多个类以适应不同的任务例如DeepSeekV3Model仅输出模型的隐藏状态适用于需要获取文本表示的特征而不是直接生成文本的场景。DeepSeekV3ForCausalLM在基础模型之上增加了一个语言模型头用于因果语言建模。这是用于文本生成的主要类也是像 ChatGPT 这样进行对话和续写任务的核心。可能还包括DeepSeekV3ForSequenceClassification等用于适配分类等下游任务。4.加载预训练权重该代码的结构与 DeepSeek 官方发布的预训练模型权重完全对齐。Hugging Face 的from_pretrained()方法可以精确地将下载的权重加载到这个模型中让你能直接运行一个已经具备强大能力的模型而无需从零开始训练。5.提供自定义和微调的接口由于代码是完全开源的开发者可以查看其实现细节理解模型的所有技术细节。修改架构例如尝试不同的注意力机制、归一化方式等用于研究目的。进行微调在特定数据集上对预训练模型进行微调以适应特定领域或任务。总结总而言之modeling_deepseek_v3.py的作用是将 DeepSeek-V3 模型的数学架构和预训练参数“翻译”成 PyTorch 能够理解和执行的代码从而让研究者和开发者能够轻松地加载、运行、研究、定制和微调这个先进的大语言模型。它就像是 DeepSeek-V3 这个“大脑”的蓝图和说明书没有这份代码发布的模型权重就只是一堆无法使用的数字。二、除了使用 Hugging Facetransformers库还有多种加载和使用模型的方式。以下是几种主流且重要的替代方案我将它们分为几类以便你理解1. 原生态加载使用模型官方代码库这是最直接的方式直接使用模型发布方提供的原始代码和权重。描述Qwen、LLaMA、ChatGLM 等大部分主流模型都会在发布时提供自己独立的代码库。这些库通常包含了最原汁原味的实现有时会包含一些transformers库尚未集成的最新特性或优化。优点可能最先支持新功能与论文实现最接近。缺点需要单独安装依赖不同模型的用法可能差异很大迁移成本高。示例以 Qwen2.5-VL 为例克隆官方仓库gitclone https://github.com/QwenLM/Qwen2.5-VL.gitcdQwen2.5-VL按照仓库的README.md安装依赖通常是pip install -r requirements.txt。使用官方提供的示例脚本进行加载和推理# 示例代码具体请参考官方文档fromqwen_vl_utilsimportQwen2VL_VLChat modelQwen2VL_VLChat(Qwen/Qwen2.5-VL-7B-Instruct,devicecuda)messages[{role:user,content:[{type:image,image:path/to/your/image.jpg},{type:text,text:描述一下这张图片。}]}]responsemodel.chat(messages)print(response)2. 高性能推理/部署框架这类框架专注于将模型优化并部署到生产环境特别追求低延迟、高吞吐量。a)vLLM描述一个非常流行的高吞吐量推理引擎核心特点是使用 PagedAttention 技术极大地优化了内存使用和推理速度尤其适合批量处理batched inference。优点推理速度极快尤其适合多用户并发访问的场景与transformers的 API 兼容性好。缺点主要专注于文本生成对多模态如图像的支持可能不如transformers全面或需要特定版本。示例fromvllmimportLLM,SamplingParams# 加载模型 - 底层仍然使用 Hugging Face 的模型格式llmLLM(modelQwen/Qwen2.5-VL-7B-Instruct)prompts[|im_start|user\n|im_end|\n|im_start|assistant\n,你好请介绍一下你自己。]sampling_paramsSamplingParams(temperature0.8,top_p0.95,max_tokens128)outputsllm.generate(prompts,sampling_params)foroutputinoutputs:print(fPrompt:{output.prompt}, Generated text:{output.outputs[0].text})b)ONNX Runtime描述将模型转换为 ONNX 格式然后使用 ONNX Runtime 进行推理。ONNX 是一个开放的模型标准可以在不同的硬件和平台上获得高性能推理。优点跨平台Windows, Linux, Mac, ARM等性能稳定通常比原生 PyTorch 有加速非常适合端侧部署如手机、边缘设备。缺点需要将模型从 PyTorch/TensorFlow 转换为 ONNX 格式转换过程可能遇到兼容性问题。示例通常需要先使用transformers和optimumHugging Face 的优化库来导出模型。pipinstalloptimum[onnxruntime]optimum-cliexportonnx--modelQwen/Qwen2.5-7B-Instruct qwen2.5-7b-instruct-onnx/然后使用 ONNX Runtime 加载和推理。3. 大模型服务框架这类框架专注于提供标准化的 API 服务将模型封装成类似 OpenAI API 的接口。a)OpenAI-Compatible API使用 FastChat, Ollama, LiteLLM 等描述通过框架启动一个本地 API 服务器模型被加载到后台。然后你可以使用任何 HTTP 客户端或 OpenAI 官方 Python 库的格式来调用它。优点标准化与现有工具链如 LangChain, LlamaIndex无缝集成方便做模型路由和代理。缺点增加了网络开销可能不适合对延迟极其敏感的本地应用。示例以 Ollama 为例在 Ollama 中拉取并运行模型Ollama 已内置了很多模型ollama pull qwen2.5:7b ollama serve使用 Python 调用fromopenaiimportOpenAI clientOpenAI(base_urlhttp://localhost:11434/v1,api_keyollama,# 占位符ollama 不需要真正的 key)responseclient.chat.completions.create(modelqwen2.5:7b,messages[{role:user,content:为什么天空是蓝色的}])print(response.choices[0].message.content)总结与选择建议方式适用场景核心优势Hugging Facetransformers快速实验、原型开发、研究人员易用性、灵活性、社区支持原生态加载需要体验模型最新特性、深入研究模型机制最接近官方实现vLLM生产环境、高并发 API 服务极高的推理吞吐量和效率ONNX Runtime跨平台部署、边缘计算、资源受限环境跨平台一致性、稳定性能API 服务框架构建应用、需要标准化接口、做模型管理标准化、易于集成简单来说如果你是初学者或正在进行研究实验继续使用transformers库是最好的选择。如果你需要搭建一个可供多人同时访问的聊天服务或 APIvLLM 是毫无疑问的首选。如果你需要将模型部署到手机、IoT 设备或其他非标准平台应该研究ONNX Runtime。如果你只是想快速体验模型或者你的应用框架如 LangChain偏好 OpenAI 格式那么使用Ollama之类的工具会非常方便。vLLM 在底层使用并重度依赖了 Hugging Face Transformers 库。vLLM 并不是一个从零开始重写所有模型结构的框架而是一个高性能的推理和服务引擎。它可以被看作是构建在transformers库之上的一个强大的“加速器和调度器”。下面是它们之间关系的详细分解1. vLLM 如何使用 TransformersvLLM 利用transformers库来完成最基础、最核心的一件工作加载模型权重和解析模型结构。模型加载当你执行LLM(modelQwen/Qwen2.5-VL-7B-Instruct)时vLLM 在后台会调用transformers的AutoModel.from_pretrained()和AutoTokenizer.from_pretrained()方法来从 Hugging Face Hub 或本地路径加载模型权重和分词器。这意味着它完全兼容transformers所支持的成千上万个模型。架构理解vLLM 依赖于transformers中定义的各种模型类如QWen2ForCausalLM来理解模型的层数、注意力头数、隐藏层维度等关键架构参数。2. vLLM 的核心创新在哪里虽然 vLLM 使用transformers来加载模型但它并没有直接使用transformers的推理生成逻辑即model.generate()方法。取而代之的是vLLM 实现了自己的一套极其高效的推理机制主要创新点包括PagedAttention这是 vLLM 的王牌技术。它借鉴了操作系统内存管理中的“分页”思想来解决 LLM 推理中 KV Cache 内存管理的关键瓶颈。传统方法包括原生transformers在处理多个并发请求时由于序列长度可变会导致内存碎片化和大量浪费。PagedAttention 将 KV Cache 分成一块块的“页”可以非连续地存储和管理使得内存利用率大幅提升从而能够同时处理非常多的请求高吞吐量。自定义的调度器vLLM 有一个高效的调度器负责管理来自不同用户的多个请求将它们批处理在一起然后利用 PagedAttention 高效地执行前向计算。优化的内核vLLM 实现了一些高度优化的 CUDA 内核特别是用于 PagedAttention 的内核以最大化 GPU 的利用效率。一个简单的比喻你可以这样理解它们的关系Transformers 库就像一个汽车制造商如丰田、大众。它负责设计和生产汽车的各个部件发动机、底盘、车身并把它们组装成一辆完整的、可以驾驶的汽车AutoModel。这辆车本身就能开但可能不是为赛车或极端路况设计的。vLLM 就像一个顶级的赛车改装团队和赛车队。他们从制造商那里买来市售的汽车使用transformers加载模型。但他们不会直接用这辆车去比赛。他们会拆掉原厂的发动机控制系统和变速箱替换掉transformers的生成逻辑。装上自己研发的高性能ECU、变速箱和悬挂系统实现 PagedAttention 和自定义调度器。由顶级的赛车手和策略团队来驾驶和指挥高效的调度和批处理。最终这辆车在赛道上生产环境的表现吞吐量、并发能力远超原厂车型。总结特性Hugging Face TransformersvLLM核心目标易用性、灵活性、模型支持广度极致的高吞吐量推理性能模型加载直接加载依赖 Transformers 来加载推理逻辑使用自己的generate()方法使用自研的 PagedAttention 和调度器最佳场景实验、研究、单次推理、原型开发生产环境、高并发 API 服务所以vLLM 和 Transformers 不是竞争关系而是互补和增强关系。vLLM 站在transformers这个巨人的肩膀上专注于解决其在大规模部署时遇到的性能瓶颈问题。你既享受了transformers庞大的模型生态系统又获得了 vLLM 带来的巨大性能提升。

更多文章