qwen2_loader.py — Qwen2 权重加载(广播版)¶
文件路径¶
verl/models/qwen2/megatron/checkpoint_utils/qwen2_loader.py
文件概述¶
将 HF 格式的完整 state_dict 加载到 Megatron 分片的 Qwen2 模型中。这是广播版本,rank 0 广播权重到所有 rank。
与 LLaMA 版本的区别¶
1. QKV bias 处理¶
Qwen2 的 QKV 投影带有 bias,因此加载时需要额外处理 bias 的 TP 切分:
def _broadcast_tp_shard_tensor_qkv(tensor, q_name, k_name, v_name, bias=False):
"""增加了 bias 参数,支持 1D bias 的 TP 切分"""
if not bias:
new_weight_qkv = torch.empty(total_size * tp_size, config.hidden_size, ...)
else:
new_weight_qkv = torch.empty(total_size * tp_size, ...) # 1D tensor
加载每层时需要分别处理 weight 和 bias:
# 加载 QKV weight
_broadcast_tp_shard_tensor_qkv(
sync_layer.self_attn.qkv_proj.weight, q_weight_name, k_weight_name, v_weight_name
)
# 加载 QKV bias(Qwen2 特有)
_broadcast_tp_shard_tensor_qkv(
sync_layer.self_attn.qkv_proj.bias, q_bias_name, k_bias_name, v_bias_name, bias=True
)
2. tie_word_embeddings 支持¶
3. DP 广播¶
与 LLaMA 广播版相同,最后进行 DP 组内的参数广播:
加载流程¶
与 LLaMA 版本完全对称: 1. 加载 embedding(TP 切分) 2. 逐层加载 Transformer(layernorm + QKV weight/bias + o_proj + gate_up + down) 3. 加载 final norm + lm_head(除非 tie_word_embeddings) 4. DP 组内广播
与其他模块的关系¶
- 被
weight_loader_registry.py注册为 Qwen2 的权重加载器 - 与
qwen2_saver.py互为逆操作
小结¶
Qwen2 权重加载器与 LLaMA 版本的核心区别是 QKV bias 的 TP 切分和 tie_word_embeddings 的支持。其余结构和流程完全一致。