[Qwen3.5] Enable nvfp4 checkpoint (#18937)
This commit is contained in:
@@ -3411,7 +3411,9 @@ def get_rope(
|
|||||||
elif "type" in rope_scaling:
|
elif "type" in rope_scaling:
|
||||||
scaling_type = rope_scaling["type"]
|
scaling_type = rope_scaling["type"]
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unknown RoPE scaling type")
|
raise ValueError(
|
||||||
|
f"Unknown RoPE scaling type, rope_scaling is {rope_scaling}"
|
||||||
|
)
|
||||||
|
|
||||||
if scaling_type == "llama3":
|
if scaling_type == "llama3":
|
||||||
scaling_factor = rope_scaling["factor"]
|
scaling_factor = rope_scaling["factor"]
|
||||||
|
|||||||
@@ -318,8 +318,14 @@ class Qwen3_5LinearDecoderLayer(nn.Module):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self.config = config
|
self.config = config
|
||||||
self.layer_id = layer_id
|
self.layer_id = layer_id
|
||||||
|
|
||||||
|
linear_attn_quant_config = (
|
||||||
|
None
|
||||||
|
if quant_config and quant_config.get_name() == "modelopt_fp4"
|
||||||
|
else quant_config
|
||||||
|
)
|
||||||
self.linear_attn = Qwen3_5GatedDeltaNet(
|
self.linear_attn = Qwen3_5GatedDeltaNet(
|
||||||
config, layer_id, quant_config, alt_stream, prefix
|
config, layer_id, linear_attn_quant_config, alt_stream, prefix
|
||||||
)
|
)
|
||||||
|
|
||||||
# NOTE: Determine the MLP type based on the model type
|
# NOTE: Determine the MLP type based on the model type
|
||||||
@@ -458,13 +464,19 @@ class Qwen3_5AttentionDecoderLayer(nn.Module):
|
|||||||
dtype=torch.get_default_dtype(),
|
dtype=torch.get_default_dtype(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
attn_quant_config = (
|
||||||
|
None
|
||||||
|
if quant_config and quant_config.get_name() == "modelopt_fp4"
|
||||||
|
else quant_config
|
||||||
|
)
|
||||||
|
|
||||||
self.qkv_proj = QKVParallelLinear(
|
self.qkv_proj = QKVParallelLinear(
|
||||||
config.hidden_size,
|
config.hidden_size,
|
||||||
self.head_dim,
|
self.head_dim,
|
||||||
self.total_num_heads * (1 + self.attn_output_gate),
|
self.total_num_heads * (1 + self.attn_output_gate),
|
||||||
self.total_num_kv_heads,
|
self.total_num_kv_heads,
|
||||||
bias=False,
|
bias=False,
|
||||||
quant_config=quant_config,
|
quant_config=attn_quant_config,
|
||||||
tp_rank=self.attn_tp_rank,
|
tp_rank=self.attn_tp_rank,
|
||||||
tp_size=self.attn_tp_size,
|
tp_size=self.attn_tp_size,
|
||||||
prefix=add_prefix("qkv_proj", prefix),
|
prefix=add_prefix("qkv_proj", prefix),
|
||||||
@@ -474,7 +486,7 @@ class Qwen3_5AttentionDecoderLayer(nn.Module):
|
|||||||
self.total_num_heads * self.head_dim,
|
self.total_num_heads * self.head_dim,
|
||||||
config.hidden_size,
|
config.hidden_size,
|
||||||
bias=False,
|
bias=False,
|
||||||
quant_config=quant_config,
|
quant_config=attn_quant_config,
|
||||||
reduce_results=False,
|
reduce_results=False,
|
||||||
tp_rank=self.attn_tp_rank,
|
tp_rank=self.attn_tp_rank,
|
||||||
tp_size=self.attn_tp_size,
|
tp_size=self.attn_tp_size,
|
||||||
@@ -1155,9 +1167,7 @@ class Qwen3_5MoeForConditionalGeneration(Qwen3VLForConditionalGeneration):
|
|||||||
"_k_scale",
|
"_k_scale",
|
||||||
".v_scale",
|
".v_scale",
|
||||||
"_v_scale",
|
"_v_scale",
|
||||||
".weight_scale",
|
|
||||||
"_weight_scale",
|
"_weight_scale",
|
||||||
".input_scale",
|
|
||||||
"_input_scale",
|
"_input_scale",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1204,7 +1214,9 @@ class Qwen3_5MoeForConditionalGeneration(Qwen3VLForConditionalGeneration):
|
|||||||
name = name.replace(".self_attn", "")
|
name = name.replace(".self_attn", "")
|
||||||
|
|
||||||
for param_name, weight_name, shard_id in stacked_params_mapping:
|
for param_name, weight_name, shard_id in stacked_params_mapping:
|
||||||
if "experts.gate_up_proj" in name or "experts.down_proj" in name:
|
if name.endswith("experts.gate_up_proj") or name.endswith(
|
||||||
|
"experts.down_proj"
|
||||||
|
):
|
||||||
is_fused_expert = True
|
is_fused_expert = True
|
||||||
expert_params_mapping = fused_expert_params_mapping
|
expert_params_mapping = fused_expert_params_mapping
|
||||||
|
|
||||||
@@ -1274,7 +1286,7 @@ class Qwen3_5MoeForConditionalGeneration(Qwen3VLForConditionalGeneration):
|
|||||||
num_experts,
|
num_experts,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# Skip loading extra parameters for GPTQ/modelopt models.
|
# Skip loading extra parameters for GPTQ models.
|
||||||
if (
|
if (
|
||||||
name_mapped.endswith(ignore_suffixes)
|
name_mapped.endswith(ignore_suffixes)
|
||||||
and name_mapped not in params_dict
|
and name_mapped not in params_dict
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ class Qwen3_5ForCausalLMMTP(nn.Module):
|
|||||||
if self.is_multimodal:
|
if self.is_multimodal:
|
||||||
config = config.text_config
|
config = config.text_config
|
||||||
|
|
||||||
|
# The MTP model is unquantized in the nvfp4 checkpoint.
|
||||||
|
if quant_config and quant_config.get_name() == "modelopt_fp4":
|
||||||
|
quant_config = None
|
||||||
|
|
||||||
self.config = config
|
self.config = config
|
||||||
self.tp_size = get_tensor_model_parallel_world_size()
|
self.tp_size = get_tensor_model_parallel_world_size()
|
||||||
self.quant_config = quant_config
|
self.quant_config = quant_config
|
||||||
|
|||||||
Reference in New Issue
Block a user