Loading...
Loading...
Compare original and translation side by side
https://huggingface.co/Qwen/Qwen3.5-VL-27Bconfig.jsonhttps://huggingface.co/Qwen/Qwen3.5-VL-27Bconfig.jsonconfig.jsonmodel_type@register_bridge(model_type=...)architecturessource=...tie_word_embeddingsnum_hidden_layershidden_sizeintermediate_sizenum_attention_headsnum_key_value_headsvocab_sizemax_position_embeddingsrope_thetanum_local_expertsnum_experts_per_tokmoe_intermediate_sizeq_lora_rankkv_lora_rankqk_nope_head_dimqk_rope_head_dimCONFIG_MAPPINGmodel_bridge.pymodeling_*.pyconfig.jsonmodel_type@register_bridge(model_type=...)architecturessource=...tie_word_embeddingsnum_hidden_layershidden_sizeintermediate_sizenum_attention_headsnum_key_value_headsvocab_sizemax_position_embeddingsrope_thetanum_local_expertsnum_experts_per_tokmoe_intermediate_sizeq_lora_rankkv_lora_rankqk_nope_head_dimqk_rope_head_dimmodel_bridge.pyCONFIG_MAPPINGmodeling_*.pytext_configvision_configtext_configvision_configtext_configtext_configvision_configtext_configvision_configtext_configmodel.safetensorsmodel.safetensors.index.jsonfloat8_e4m3fnuint8uint4*_scale_inv*_scaleconfig.jsonquantization_config"torch_dtype": "float8_e4m3fn"weight_scale_invimport_ckptdequant_fp8_for_bridge.pyexamples/models/ministral/ministral3/dequant_fp8_for_bridge.pyw_bf16 = fp8_weight.to(bfloat16) * weight_scale_invmaybe_modify_loaded_hf_weight()def maybe_modify_loaded_hf_weight(self, hf_param, hf_state_dict):
weight = hf_state_dict[hf_param]
scale_key = hf_param + "_scale_inv"
if weight.dtype == torch.float8_e4m3fn and scale_key in hf_state_dict:
return weight.to(torch.bfloat16) * hf_state_dict[scale_key].to(torch.bfloat16)
return weightstdstd ≈ 13std ≈ 0.006model.safetensorsmodel.safetensors.index.jsonfloat8_e4m3fn*_scale_inv*_scaleuint8uint4config.jsonquantization_config"torch_dtype": "float8_e4m3fn"weight_scale_invimport_ckptdequant_fp8_for_bridge.pyexamples/models/ministral/ministral3/dequant_fp8_for_bridge.pyw_bf16 = fp8_weight.to(bfloat16) * weight_scale_invmaybe_modify_loaded_hf_weight()def maybe_modify_loaded_hf_weight(self, hf_param, hf_state_dict):
weight = hf_state_dict[hf_param]
scale_key = hf_param + "_scale_inv"
if weight.dtype == torch.float8_e4m3fn and scale_key in hf_state_dict:
return weight.to(torch.bfloat16) * hf_state_dict[scale_key].to(torch.bfloat16)
return weightstdstd≈13std≈0.006src/megatron/bridge/models/qwen/qwen2_bridge.pysrc/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py # Config + weight mappings (no provider file needed)
└── modeling_<model>/ # (optional) Custom nn.Module implementations if needed
└── ...src/megatron/bridge/models/qwen_vl/src/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py # Config + weight mappings
├── <model>_provider.py # Only for VLMs that need custom provide()
└── modeling_<model>/ # If using Megatron vision encoder
├── __init__.py
└── model.py # Combines vision + languagesrc/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py
├── <model>_provider.py # Only for VLMs that need custom provide()
└── modeling_<model>.py # HF vision + Megatron language wrappernn.Modulemodeling_<model>/modeling_<model>.pymodeling_<model>src/megatron/bridge/models/qwen/qwen2_bridge.pysrc/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py # 配置+权重映射(无需提供器文件)
└── modeling_<model>/ # (可选)自定义nn.Module实现(若需要)
└── ...src/megatron/bridge/models/qwen_vl/src/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py # 配置+权重映射
├── <model>_provider.py # 仅需自定义provide()的VLM需要
└── modeling_<model>/ # 使用Megatron视觉编码器时
├── __init__.py
└── model.py # 结合视觉+语言模块src/megatron/bridge/models/<model>/
├── __init__.py
├── <model>_bridge.py
├── <model>_provider.py # 仅需自定义provide()的VLM需要
└── modeling_<model>.py # HF视觉+Megatron语言包装器nn.Modulemodeling_<model>/modeling_<model>.pymodeling_<model>provider_bridge()mapping_registry()super().provider_bridge()GPTModelProviderCONFIG_MAPPINGsuper().provider_bridge()GPTModelProviderPROVIDER_CLASSprovide()hf_config_to_provider_kwargs(text_config)provider_bridge()mapping_registry()super().provider_bridge()CONFIG_MAPPINGGPTModelProvidersuper().provider_bridge()GPTModelProviderPROVIDER_CLASSprovide()hf_config_to_provider_kwargs(text_config)tie_word_embeddingstie_word_embeddingstie_word_embeddingstext_configprovider.share_embeddings_and_output_weights = getattr(hf_config, "tie_word_embeddings", False)tie_word_embeddingstext_configprovider.share_embeddings_and_output_weights = getattr(hf_config, "tie_word_embeddings", False)hf_configtie_word_embeddingsimage_token_idvideo_token_idhf_config.text_confignum_hidden_layershidden_sizehf_config.vision_confighf_configtie_word_embeddingsimage_token_idvideo_token_idhf_config.text_confignum_hidden_layershidden_sizehf_config.vision_configsrc/megatron/bridge/models/conversion/param_mapping.pymodel_bridge.pyquant_mapping.pysrc/megatron/bridge/models/conversion/param_mapping.pymodel_bridge.pyquant_mapping.py<model>_mappings.pyundefined<model>_mappings.pyundefined
Example — Nemotron-H's MTP layers flatten indices during resolve:
```python
示例——Nemotron-H的MTP层在解析时展平索引:
```python
Example — MiniMax-M2's non-standard QK norm layout:
```python
示例——MiniMax-M2的非标准QK归一化布局:
```pythonundefinedundefinedMegatronModelBridge| Hook | When to use |
|---|---|
| Define all weight name mappings (abstract, always overridden) |
| Configure the provider with model-specific flags (call |
| Dequantize, rename, or reshape HF weights before conversion |
| Synthesize extra HF keys on export (e.g. |
| Build HF |
| Override CONFIG_MAPPING behavior for specific fields |
mapping_registry()self.hf_configmapping_registry()def mapping_registry(self) -> MegatronMappingRegistry:
hf_config = getattr(self, "hf_config", None)
num_mtp_layers = getattr(hf_config, "num_nextn_predict_layers", 0) if hf_config else 0
...build_conversion_tasks()self._hf_configMegatronModelBridge| 钩子 | 使用场景 |
|---|---|
| 定义所有权重名称映射(抽象方法,必须重写) |
| 为提供器配置模型专属标志(调用 |
| 转换前对HF权重进行反量化、重命名或重塑 |
| 导出时合成额外HF键(例如 |
| 构建用于导出的HF |
| 针对特定字段覆盖CONFIG_MAPPING行为 |
mapping_registry()self.hf_configmapping_registry()def mapping_registry(self) -> MegatronMappingRegistry:
hf_config = getattr(self, "hf_config", None)
num_mtp_layers = getattr(hf_config, "num_nextn_predict_layers", 0) if hf_config else 0
...build_conversion_tasks()self._hf_configGPTModelProviderPROVIDER_CLASSprovide()undefinedGPTModelProviderPROVIDER_CLASSprovide()undefineddef provide(self, ...):
# Custom model construction combining vision encoder + language decoder
...
The bridge then references it via `PROVIDER_CLASS = MyVLModelProvider` or instantiates it directly
in `provider_bridge()`.def provide(self, ...):
# 自定义模型构建逻辑,结合视觉编码器+语言解码器
...
桥接器可通过`PROVIDER_CLASS = MyVLModelProvider`或在`provider_bridge()`中直接实例化来引用它。param_mapping.pymodel_bridge.pyFusedExpertMappingFusedGatedExpertMappingRMSNorm2ZeroCenteredRMSNormMappingCONFIG_MAPPINGif model_type == "..."param_mapping.pymodel_bridge.pyFusedExpertMappingFusedGatedExpertMappingRMSNorm2ZeroCenteredRMSNormMappingCONFIG_MAPPINGif model_type == "..."src/megatron/bridge/training/utils/flop_utils.pyO(s²)transformer_flops()flop_utils.pyexperimental_attention_variantmtp_num_layersgetattrtests/unit_tests/training/utils/test_flop_utils.pylinear_attention_freqsrc/megatron/bridge/training/utils/flop_utils.pyO(s²)flop_utils.pytransformer_flops()experimental_attention_variantmtp_num_layersgetattrtests/unit_tests/training/utils/test_flop_utils.pylinear_attention_freqsrc/megatron/bridge/recipes/<family>/<model>.pysrc/megatron/bridge/recipes/<family>/<model>.py<model>_<size>_sft_config()<model>_<size>_peft_config()<model>_<size>_pretrain_config()src/megatron/bridge/recipes/<family>/<model>.pysrc/megatron/bridge/recipes/<family>/<model>.py<model>_<size>_sft_config()<model>_<size>_peft_config()<model>_<size>_pretrain_config()__init__.py__all__src/megatron/bridge/recipes/__init__.pytrain_any_basic.pyconfig_map--model__init__.py__all__src/megatron/bridge/recipes/__init__.pytrain_any_basic.pyconfig_map--modeltests/unit_tests/models/<model>/
├── __init__.py
├── test_<model>_bridge.py # Mock HF config → verify provider mapping
└── test_<model>_provider.py # (optional) Only if custom provider subclass existstests/unit_tests/models/<model>/
├── __init__.py
├── test_<model>_bridge.py # 模拟HF配置 → 验证提供器映射
└── test_<model>_provider.py # (可选)仅当存在自定义提供器子类时需要tests/functional_tests/models/<model>/
├── __init__.py
├── test_<model>_conversion.py # Toy model HF↔Megatron roundtrip
└── test_<model>_provider.py # compare_provider_configs (optional)tests/functional_tests/models/<model>/
├── __init__.py
├── test_<model>_conversion.py # 小型模型HF↔Megatron往返转换
└── test_<model>_provider.py # compare_provider_configs(可选)examples/models/<brand>/<model>/examples/models/<brand>/<model>/
├── README.md
├── conversion.sh # HF↔Megatron conversion commands (real model)
├── inference.sh # Generation commands (real model, reasonable output)
├── slurm_sft.sh # SFT training on SLURM
└── slurm_peft.sh # PEFT training on SLURMconversion.shinference.shQwen/Qwen3-8Bexamples/models/<brand>/<model>/examples/models/<brand>/<model>/
├── README.md
├── conversion.sh # HF↔Megatron转换命令(真实模型)
├── inference.sh # 生成命令(真实模型,输出合理)
├── slurm_sft.sh # SLURM上的SFT训练
└── slurm_peft.sh # SLURM上的PEFT训练conversion.shinference.shQwen/Qwen3-8Bdocs/models/<type>/<model>.mddocs/models/<type>/<model>.mduv run python -c "
from megatron.bridge import AutoBridge
bridge = AutoBridge.from_hf_pretrained('<org>/<model>')
provider = bridge.to_megatron_provider()
provider.tensor_model_parallel_size = 1
provider.pipeline_model_parallel_size = 1
provider.finalize()
model = provider.provide_distributed_model(wrap_with_ddp=False)
bridge.load_hf_weights(model)
for i, (name, tensor) in enumerate(bridge.export_hf_weights(model, cpu=True)):
print(name, tuple(tensor.shape))
if i > 10: break
"uv run python -c "
from megatron.bridge import AutoBridge
bridge = AutoBridge.from_hf_pretrained('<org>/<model>')
provider = bridge.to_megatron_provider()
provider.tensor_model_parallel_size = 1
provider.pipeline_model_parallel_size = 1
provider.finalize()
model = provider.provide_distributed_model(wrap_with_ddp=False)
bridge.load_hf_weights(model)
for i, (name, tensor) in enumerate(bridge.export_hf_weights(model, cpu=True)):
print(name, tuple(tensor.shape))
if i > 10: break
"uv run python examples/conversion/convert_checkpoints.py import \
--hf-model <org>/<model> \
--megatron-path /workspace/<model> \
--torch-dtype bfloat16
uv run python examples/conversion/convert_checkpoints.py export \
--hf-model <org>/<model> \
--megatron-path /workspace/<model>/iter_0000000 \
--hf-path /workspace/<model>-hf-exportuv run python examples/conversion/convert_checkpoints.py import \
--hf-model <org>/<model> \
--megatron-path /workspace/<model> \
--torch-dtype bfloat16
uv run python examples/conversion/convert_checkpoints.py export \
--hf-model <org>/<model> \
--megatron-path /workspace/<model>/iter_0000000 \
--hf-path /workspace/<model>-hf-exportuv run python examples/conversion/hf_to_megatron_generate_text.py \
--hf_model_path <org>/<model> --prompt "Hello"uv run python examples/conversion/hf_to_megatron_generate_vlm.py \
--hf_model_path <org>/<model> \
--image_path "https://example.com/image.jpeg" \
--prompt "Describe this image."uv run python examples/conversion/hf_to_megatron_generate_text.py \
--hf_model_path <org>/<model> --prompt "Hello"uv run python examples/conversion/hf_to_megatron_generate_vlm.py \
--hf_model_path <org>/<model> \
--image_path "https://example.com/image.jpeg" \
--prompt "Describe this image."uv run python -m pytest tests/unit_tests/models/<model>/ -v
uv run python -m pytest tests/functional_tests/models/<model>/ -v --run-gpuuv run python -m pytest tests/unit_tests/models/<model>/ -v
uv run python -m pytest tests/functional_tests/models/<model>/ -v --run-gpuUser wants to add a model
│
├─ Has HF link? ─── No ──→ Ask for link (or config.json if private)
│
├─ Has text_config + vision_config? ─── Yes ──→ VLM path
│ ├─ Has Megatron vision encoder? ──→ Megatron encoder (Qwen3.5 pattern)
│ └─ No Megatron encoder ──→ HF encoder (Gemma3 pattern)
│
└─ No vision config ──→ LLM path (bridge only, no provider file)
├─ Standard GPT-style? ──→ Bridge with stock mappings
└─ Custom layers? ──→ Bridge + local mapping subclasses / hook overrides
├─ Custom weight layout? ──→ Local mapping subclass in family dir
└─ Custom import/export? ──→ Override bridge hooks (maybe_modify_*)用户想要添加模型
│
├─ 是否有HF链接? ─── 否 ──→ 索要链接(非公开则索要config.json)
│
├─ 是否有text_config + vision_config? ─── 是 ──→ VLM流程
│ ├─ 是否有Megatron视觉编码器? ──→ 使用Megatron编码器(Qwen3.5模式)
│ └─ 无Megatron视觉编码器 ──→ 使用HF编码器(Gemma3模式)
│
└─ 无视觉配置 ──→ LLM流程(仅桥接器,无需提供器文件)
├─ 是否为标准GPT风格? ──→ 使用标准映射的桥接器
└─ 是否有自定义层? ──→ 桥接器+本地映射子类/钩子重写
├─ 是否有自定义权重布局? ──→ 在家族目录中创建本地映射子类
└─ 是否有自定义导入/导出逻辑? ──→ 重写桥接器钩子(maybe_modify_*)