1212
1313#include " glog/logging.h"
1414
15- #include " example/common/utils.h"
16- #include " example/qwen3/config.h"
1715#include " infini_train/include/nn/modules/normalization.h"
1816#include " infini_train/include/nn/modules/transformer/causal_self_attention.h"
1917#include " infini_train/include/nn/modules/transformer/mlp.h"
2220#include " infini_train/include/nn/parallel/tensor_parallel.h"
2321#include " infini_train/include/tensor.h"
2422
23+ #include " example/common/utils.h"
24+ #include " example/qwen3/config.h"
25+
2526using namespace infini_train ;
2627namespace nn = infini_train::nn;
2728
@@ -107,8 +108,8 @@ std::shared_ptr<nn::TransformerModel> LoadFromLLMC(const std::string &filepath)
107108 qwen3_config.use_scaled_rope = static_cast <bool >(use_scaled_rope);
108109 qwen3_config.norm_eps = norm_eps;
109110 qwen3_config.max_gen_batch_size = max_gen_bs;
110- qwen3_config.use_qk_norm = true ;
111- qwen3_config. qk_norm_eps = norm_eps ;
111+ qwen3_config.qk_layernorm = true ;
112+ qwen3::SanitizeQwen3Config ( qwen3_config) ;
112113 auto qwen3 = std::make_shared<nn::TransformerModel>(qwen3_config);
113114
114115 // ========== pp_size: num_stages; vpp_size: num_chunks_per_stage ==========
@@ -178,7 +179,7 @@ std::shared_ptr<nn::TransformerModel> LoadFromLLMC(const std::string &filepath)
178179
179180 // RowParallel (proj)
180181 const int64_t in_pp = static_cast <int64_t >(n_embd) / tp_size;
181- // nn::MLP: c_fc/c_fc2 (shard along row), c_proj(shard along col)
182+ // nn::MLP: packed c_fc [gate | up] (shard each block along row), c_proj (shard along col)
182183 const int64_t fc_out = ffn_hidden;
183184 const int64_t fc_pp = fc_out / tp_size;
184185 const int64_t in_fc_pp = ffn_hidden / tp_size;
@@ -309,13 +310,13 @@ std::shared_ptr<nn::TransformerModel> LoadFromLLMC(const std::string &filepath)
309310 }
310311 }
311312
312- // gate_proj is loaded into c_fc2 because MLP applies SiLU to its second projection.
313+ // transformer.h.{i}.mlp. c_fc2.weight (gate) -> local packed c_fc rows [0 : fc_pp)
313314 local_layer_index = 0 ;
314315 for (int i = 0 ; i < static_cast <int >(n_layer); ++i) {
315316 if (owned_layers[i]) {
316317 auto &tensor = state_dict[std::format (" {}.{}.{}.{}.{}.{}" , nn::TransformerModel::kTransformerModelName ,
317318 nn::TransformerChunk::kHLayerName , std::to_string (local_layer_index),
318- nn::TransformerLayer::kMlpLayerName , nn::MLP ::kCFc2LayerName ,
319+ nn::TransformerLayer::kMlpLayerName , nn::MLP ::kCFcLayerName ,
319320 nn::parallel::ColumnParallelLinear::kParamWeightName )];
320321 ReadMatrixRowShardFloat (ifs, static_cast <float *>(tensor->DataPtr ()),
321322 /* rows=*/ fc_out, /* cols=*/ n_embd,
@@ -327,16 +328,16 @@ std::shared_ptr<nn::TransformerModel> LoadFromLLMC(const std::string &filepath)
327328 }
328329 }
329330
330- // up_proj is loaded into c_fc, producing SiLU(gate_proj(x)) * up_proj(x).
331+ // transformer.h.{i}.mlp.c_fc.weight (up) -> local packed c_fc rows [fc_pp : 2*fc_pp)
331332 local_layer_index = 0 ;
332333 for (int i = 0 ; i < static_cast <int >(n_layer); ++i) {
333334 if (owned_layers[i]) {
334335 auto &tensor = state_dict[std::format (" {}.{}.{}.{}.{}.{}" , nn::TransformerModel::kTransformerModelName ,
335336 nn::TransformerChunk::kHLayerName , std::to_string (local_layer_index),
336337 nn::TransformerLayer::kMlpLayerName , nn::MLP ::kCFcLayerName ,
337338 nn::parallel::ColumnParallelLinear::kParamWeightName )];
338- ReadMatrixRowShardFloat (ifs, static_cast <float *>(tensor->DataPtr ()),
339- /* rows=*/ fc_out, /* cols=*/ n_embd,
339+ float *dst = static_cast <float *>(tensor->DataPtr ()) + fc_pp * n_embd;
340+ ReadMatrixRowShardFloat (ifs, dst, /* rows=*/ fc_out, /* cols=*/ n_embd,
340341 /* row_start=*/ tp_rank * fc_pp, /* row_cnt=*/ fc_pp);
341342 ++local_layer_index;
342343 } else {
0 commit comments