接上文:transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 包和对象加载
老牛同学和大家通过 Transformers 框架的一行最常见代码from transformers import AutoModelForCausalLM
,走读了transformers 包初始化代码的整个流程。从中体会到了dummy对象、LazyModule延迟模块和按需加载、API 简化使用等这些transformers 包的设计美学,为我们设计超大 Python 包提供了很好的借鉴思路。
本文是使用 Transformers 推理 LLM 技术细节的第 2 篇文章,我们将基于 Qwen2.5 大模型,通过模型配置和from_pretrained
代码,了解AutoModel模型初始化的技术细节:
- 环境准备:配置虚拟环境,下载 Qwen2.5 模型文件
- Qwen2.5 模型配置文件config.json各个配置项说明,并介绍AutoConfig加载文件到Qwen2Config配置
- 走读
AutoModelForCausalLM.from_pretrained
方法代码,详细介绍模型初始化流程 - 在最后,老牛同学又来搞个小活动,免费包邮送几本新书给大家,期望大家踊跃参与
在以上 Transformers 框架推理 LLM 的核心框架代码中,我们本次将走读的代码是from_pretrained
方法:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
model_dir,
torch_dtype="auto",
device_map="auto",
local_files_only=True,
)
环境准备:配置虚拟环境和下载 Qwen2.5 模型文件
【配置虚拟环境】 在上一篇我们已经配置好了虚拟环境,老牛同学就只简单罗列一下配置脚本:
# Python虚拟环境名:Qwen2.5,版本号:3.10
conda create -n Qwen2.5 python=3.10 -y
# 激活虚拟环境
conda activate Qwen2.5
# 下载Python依赖包
pip install torch
pip install "transformers>=4.43.1"
pip install "accelerate>=0.26.0"
【下载 Qwen2.5 模型文件】 老牛同学存放模型文件目录:Qwen2.5-1.5B-Instruct
# Git大文件系统
git lfs install
# 下载模型文件
git clone https://www.modelscope.cn/qwen/Qwen2.5-1.5B-Instruct.git Qwen2.5-1.5B-Instruct
若下载过程中异常中断,可以通过git lfs install
命令继续下载:
# 切换到Git目录
cd Qwen2.5-1.5B-Instruct
# 中断继续下载
git lfs install
git lfs pull
下载完成,可以看到如下文件结构:
针对本文大模型初始化来说,我们重点关注config.json模型配置文件和model.safetensors模型文件:
- model.safetensors文件是模型文件(主要为权重参数数据),它存储了验证文件完整性的校验和、模型张量元数据和张量权重参数等。我们将在代码流程中详细说明这些数据。
- config.json文件是模型的配置文件,包括了模型框架、训练设置、各种超参数等信息:
config.json参数详解和 AutoConfig 初始化
老牛同学对config.json文件中的每个参数进行简单说明:
参数名 | 配置值 | 参数说明 |
---|---|---|
architectures | Qwen2ForCausalLM | 模型的架构名称,Qwen2ForCausalLM是 Qwen 推理模型,在模型初始化方式将会实际使用 |
attention_dropout | 0.0 | 注意力机制中的 Dropout 操作概率,0.0代表不对注意力权重进行随机置零操作,即保留所有的注意力权重 |
bos_token_id | 151643 | 文本序列开始 Token ID 标记(Begin of Sentence Token ID),代表文本片段开始位置 |
eos_token_id | 151645 | 文本序列结束 Token ID 标记(End of Sentence Token ID),代表文本片段结束位置 |
hidden_act | silu | 模型隐藏层使用SiLU激活函数(其他激活函数:ReLU,Tanh,Sigmoid 等) |
hidden_size | 1536 | 隐藏层的维度(或每个隐藏层中神经元的数量),数值越大意味着模型能学习更复杂的特征和模式 |
initializer_range | 0.02 | 模型训练时初始化权重的标准差,0.02代表权重从均值为 0、标准差为 0.02 的正态分布中随机初始化 |
intermediate_size | 8960 | 前馈神经网络中间层的维度,通常要比hidden_size大得多,用于增加模型学习能力 |
max_position_embeddings | 32768 | 模型可以处理的最大序列长度,32768代表模型可以处理最长为 32768 个 Token 的输入序列 |
max_window_layers | 21 | 模型在处理长序列时,最多可以应用多少层的滑动窗口策略,即可以对长序列进行多少次分隔和处理 |
model_type | qwen2 | Qwen2 模型类型标识,用于映射 Qwen2Config 和 Qwen2ForCausalLM 等实际类 |
num_attention_heads | 12 | 多头注意力机制中注意力头的数量,12代表每个隐藏层中使用 12 个注意力头 |
num_hidden_layers | 28 | 模型隐藏层的数量 |
num_key_value_heads | 2 | 多头自注意力机制中键(Key)和值(Value)的注意力头数量,共12个注意头而键值只有2个头,则意味着查询(Query)头可以共享相同的键和值头 |
rms_norm_eps | 1e-06 | 使用 RMSNorm 归一化技术处理,分母增加一个极小值,避免除以零的情况,保证归一化的有效性 |
rope_theta | 1000000.0 | RoPE 旋转位置编码的周期性因子,用于捕捉长距离依赖关系,提高模型的数值稳定性 |
sliding_window | 32768 | 模型在处理长序列时采用的滑动窗口序列长度,即通过滑动窗口的方式处理超过max_position_embeddings的长序列策略 |
tie_word_embeddings | true |