feat: add Qwen3 - #208
feat: add Qwen3#208JYMiracle305 wants to merge 4 commits into
Conversation
6cd3601 to
6d13810
Compare
678eb35 to
381728f
Compare
381728f to
d2661e6
Compare
| enum class Version : uint32_t { | ||
| kV1 = 1, | ||
| kV2 = 2, | ||
| kV3 = 3, |
There was a problem hiding this comment.
这里 v1/v2/v3 是分别对应给 gpt2/llama3/qwen 使用的 tokenizer format 吗?麻烦确认下,如果是的话在这里加下注释吧
| int64_t max_gen_batch_size = 4; // max batch size during inference | ||
|
|
||
| // Q-K Norm (Qwen3) | ||
| bool use_qk_norm = false; |
There was a problem hiding this comment.
这里应该做成一个通用的选项,而不是 qwen3 特有配置,建议使用 bool 类型的 qk_norm 表示是否将当前已有的 norm_type 设置应用到 q 和 k 上,eps 则直接复用 norm_eps。
https://github.com/NVIDIA/Megatron-LM/blob/d737da53c8d0fb2b1958a384312e996796c83a35/megatron/core/transformer/transformer_config.py#L286
| .add_bias_linear = false, | ||
| .add_bias_lm_head = false, | ||
| .tie_weights = false, | ||
| .ffn_expansion_ratio = 4.5f, // 4096*4.5*2/3 = 12288 |
There was a problem hiding this comment.
建议这个配置项也跟 megatron 对齐,直接使用 ffn_hidden_size 表示 ffn 层的 hidden_size,如果没传则默认用 4 * hidden_size。
https://github.com/NVIDIA/Megatron-LM/blob/d737da53c8d0fb2b1958a384312e996796c83a35/megatron/core/transformer/transformer_config.py#L198
| bool use_scaled_rope = false; // scaled RoPE | ||
| float rope_theta = 500000.0f; // theta in RoPE | ||
| bool use_scaled_rope = false; // scaled RoPE | ||
| bool rotary_interleaved = true; // Pair adjacent dimensions; false uses the Hugging Face half-split layout. |
There was a problem hiding this comment.
megatron 里这个配置项默认值是 false,建议对齐默认值。
https://github.com/NVIDIA/Megatron-LM/blob/d737da53c8d0fb2b1958a384312e996796c83a35/megatron/core/transformer/transformer_config.py#L269
| std::tuple<std::shared_ptr<Tensor>, std::shared_ptr<Tensor>> | ||
| ApplyRotaryEmbedding(const std::shared_ptr<Tensor> &xq, const std::shared_ptr<Tensor> &xk, | ||
| const std::shared_ptr<Tensor> &freqs_cis); | ||
| const std::shared_ptr<Tensor> &freqs_cis, bool rotary_interleaved = true); |
| if tag_enabled_for_model "$group_tag" "$QWEN3_TEST_GROUPS"; then | ||
| qwen3_arg_str="$(args_string_for_test "$gi" "$ti" "qwen3" "$test_id")" | ||
| if [[ -n "$nproc_per_node" ]]; then | ||
| qwen3_cmd="$(infini_run_cmd_for_test "./qwen3" "$QWEN3_INPUT_BIN" "$QWEN3_LLMC_FILEPATH" "$qwen3_arg_str" "$nproc_per_node")" |
There was a problem hiding this comment.
qwen3 的指令也需要适配下 #206 的修改,使用 ${DEVICE_BACKEND} 设置 device。
| LLAMA3_TEST_GROUPS="$(read_var LLAMA3_TEST_GROUPS)"; : "${LLAMA3_TEST_GROUPS:=basic,zero,lora,checkpoint}" | ||
| QWEN3_INPUT_BIN="$(read_var QWEN3_INPUT_BIN)"; : "${QWEN3_INPUT_BIN:=/data1/shared/InfiniTrain-dev/data/llmc/qwen3/tinyshakespeare/tiny_shakespeare_train.bin}" | ||
| QWEN3_LLMC_FILEPATH="$(read_var QWEN3_LLMC_FILEPATH)"; : "${QWEN3_LLMC_FILEPATH:=/data1/shared/InfiniTrain-dev/data/llmc/qwen3/qwen3-8b-fp32.llmc}" | ||
| QWEN3_TEST_GROUPS="$(read_var QWEN3_TEST_GROUPS)"; : "${QWEN3_TEST_GROUPS:=}" |
There was a problem hiding this comment.
这里的默认值与 test_config.json 不一致,建议统一下。
| ] | ||
| }, | ||
| { | ||
| "tag": "qwen3", |
There was a problem hiding this comment.
建议补充测例:
- 3d 并行;
- zero;
- lr_scheduler;
- checkpoint;
- 多进程分布式测例。
|
|
||
| #include "gtest/gtest.h" | ||
|
|
||
| #include "example/qwen3/config.h" |
There was a problem hiding this comment.
参考 GPT2/LLaMA3,模型 config 的合法性建议由 config.h 中的 Sanitize 统一校验;这里的单测主要覆盖本次新增的框架能力,不需要重复校验 example 中的具体配置常量,也避免 tests 依赖 example/qwen3/config.h。
| example/qwen3/checkpoint_loader.cc | ||
| example/common/tokenizer.cc | ||
| ) | ||
| link_infini_train_exe(qwen3) |
a7aadc1 to
02411b6
Compare


feat: add Qwen3
概述
本 PR 为 InfiniTrain 新增 Qwen3-8B dense decoder-only Transformer 支持入口。将 Qwen3-8B 的结构配置映射到现有
nn::TransformerModel主干,并扩展通用CausalSelfAttention以支持 Qwen3 需要的 Q/K RMSNorm 与 half-split RoPE。本 PR 主要包含四部分:
example/qwen3示例程序与 CMake target。q_norm/k_norm;模型结构
本 PR 对应的 Qwen3-8B 配置为:
模型继续复用 InfiniTrain 已有的:
Transformer 核心修改
1. Q/K RMSNorm
Qwen3 在 Q/K projection 之后、RoPE 之前,对每个 head 的
head_dim=128维 Q/K 分别做 RMSNorm。V 不参与该归一化。计算顺序变为:
为此新增:
TransformerConfig::use_qk_normTransformerConfig::qk_norm_epsCausalSelfAttention::q_norm_CausalSelfAttention::k_norm_attn.q_norm/attn.k_norm2. half-split RoPE
原有 RoPE 实现使用 interleaved 维度配对:
Qwen3 / Hugging Face 使用 half-split 配对:
因此
ApplyRotaryEmbedding新增rotary_interleaved参数。Qwen3 配置中该值为false,表示使用 half-split 布局。如果 RoPE 布局与 checkpoint 训练时的布局不一致,Q/K 的位置旋转会配错维度,导致 attention 结果错误,因此这个适配是本 PR 的关键正确性修改。
Qwen3 example
新增
qwen3可执行目标,包含:main.cc复用现有训练框架,支持:LLMC checkpoint loader
新增
qwen3::LoadFromLLMC,读取共享 LLMC v4 FP32 权重格式:202408044256 * sizeof(int32_t)loader 会:
TransformerModel::StateDict()。主要映射关系:
embed_tokenstransformer.wteinput_layernormln_1q_proj/k_proj/v_projattn.c_attnq_norm/k_normattn.q_norm/k_normo_projattn.c_projpost_attention_layernormln_2gate_projmlp.c_fc2up_projmlp.c_fcdown_projmlp.c_projmodel.normln_flm_headlm_head其中:
是为了匹配现有
MLP::Forward中SwiGLU(c_fc2(x), c_fc(x))的实现。实现依据
适配依据包括:
Qwen/Qwen3-8B官方config.json;modeling_qwen3.py;其中:
config.json;rotate_half实现;总结
本 PR 的核心贡献是:
qwen3example;