跳转至

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 支持

if tie_word_embeddings:
    print_rank_0("tie_word_embeddings skip load lm_head")
else:
    # 正常加载 lm_head

3. DP 广播

与 LLaMA 广播版相同,最后进行 DP 组内的参数广播:

for wrapped_model in wrapped_models:
    broadcast_params(wrapped_model)

加载流程

与 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 的支持。其余结构和流程完全一致。