📘 Qwen3Model 源码解析
下面是对 Qwen3Model 类的完整解析。该类是 Qwen-3 模型的核心结构之一,基于 Qwen3PreTrainedModel 构建,实现了 Transformer 解码器主干网络。
@auto_docstring
class Qwen3Model(Qwen3PreTrainedModel):
def __init__(self, config: Qwen3Config):
super().__init__(config)
self.padding_idx = config.pad_token_id
self.vocab_size = config.vocab_size
self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
self.layers = nn.ModuleList(
[Qwen3DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
)
self.norm = Qwen3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
self.rotary_emb = Qwen3RotaryEmbedding(config=config)
self.gradient_checkpointing = False
self.has_sliding_layers = "sliding_attention" in self.config.layer_types
# Initialize weights and apply final processing
self.post_init()
🔍 类定义
@auto_docstring
class Qwen3Model(Qwen3PreTrainedModel):
- 继承自
Qwen3PreTrainedModel,Qwen3PreTrainedModel继承自PreTrainedModel,这是一个封装了权重初始化、模型保存/加载等通用功能的基类,通常来自 Hugging Face 的transformers框架设计模式。
🔘 关键属性初始化
✅ padding_idx 与 vocab_size
self.padding_idx = config.pad_token_id
self.vocab_size = config.vocab_size
padding_idx:用于在嵌入层中忽略填充 token(padding token)的梯度更新。vocab_size:词表大小,决定输入 token ID 的范围。
✅ embed_tokens
self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
- 使用 PyTorch 的
nn.Embedding层将输入 token ID 映射为稠密向量(即词向量)。 - 向量维度为
hidden_size,并指定padding_idx对应的嵌入不参与梯度更新。
✅ layers
self.layers = nn.ModuleList(
[Qwen3DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
)
- 创建一个由
Qwen3DecoderLayer组成的模块列表。 - 总共
num_hidden_layers层,每层独立处理特征变换。 layer_idx用于区分不同层(例如用于 RoPE 或稀疏注意力配置)。
💡
nn.ModuleList是 PyTorch 中用于管理子模块的容器,可被自动注册并参与模型遍历和参数管理。
✅ norm
self.norm = Qwen3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
- 应用 RMSNorm(Root Mean Square Layer Normalization),一种轻量化的归一化方式,在 LLaMA、Qwen 等大模型中广泛使用。
eps是数值稳定性的小常数。
✅ rotary_emb
self.rotary_emb = Qwen3RotaryEmbedding(config=config)
- 初始化 RoPE(Rotary Positional Embedding),一种相对位置编码方式,通过旋转矩阵将位置信息注入注意力机制。
- 相比绝对位置编码,RoPE 更适合长序列建模。
✅ gradient_checkpointing
self.gradient_checkpointing = False
- 控制是否启用梯度检查点技术(Gradient Checkpointing),用于节省显存。
- 默认关闭,训练时可手动开启以换取更高的 batch size。
✅ has_sliding_layers
self.has_sliding_layers = "sliding_attention" in self.config.layer_types
- 判断配置中是否包含滑动窗口注意力(Sliding Window Attention)。
- 若某些层设置了
"sliding_attention"类型,则启用局部注意力机制(如类似 Mistral 的设计),提升长文本效率。
⚠️ 注意:
layer_types应为一个列表,表示每一层使用的注意力类型,例如["standard", "sliding_attention", ...]。
🔁 权重初始化
self.post_init()
- 调用父类定义的
post_init()方法,完成最终的权重初始化。 - 通常包括递归初始化各子模块(如 Linear、Embedding 层)的参数(如 Xavier、Normal 初始化)。
307

被折叠的 条评论
为什么被折叠?



