Skip to content

Commit 9f6d002

Browse files
Merge remote-tracking branch 'upstream/main' into ci/shard-core-unit-tests
2 parents e499094 + 7e1ba28 commit 9f6d002

20 files changed

Lines changed: 197 additions & 104 deletions

File tree

‎.dev.commit‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
cae55c1f0991abd3e391d0029b15bcb35723d3f6
1+
12eed0a5ac3f1ced6a3a4f76727db530bdbf7391

‎.github/actions/test-template/action.yml‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,14 @@ runs:
122122
echo "::group::Start test container"
123123
if [[ "$MOUNT_FS" == "true" ]]; then
124124
VOLUME_ARGS="--volume ${{ inputs.test-data-path }}:/home/TestData --env HF_HUB_OFFLINE=1"
125+
HF_HOME=/home/TestData/HF_HOME
126+
NEMO_HOME=/home/TestData/nemo_home
125127
else
126128
VOLUME_ARGS=""
129+
HF_HOME=/home/ubuntu/.cache/huggingface
130+
NEMO_HOME=/home/ubuntu/.cache/nemo
127131
fi
132+
HF_MODULES_CACHE=/home/ubuntu/.cache/huggingface/modules
128133
129134
cmd=$(cat <<RUN_TEST_EOF
130135
#!/bin/bash
@@ -139,8 +144,9 @@ runs:
139144
--cpus=40 \
140145
--env GHA_RUNNER=${{ inputs.runner }} \
141146
--env HYDRA_FULL_ERROR=1 \
142-
--env HF_HOME=/home/TestData/HF_HOME \
143-
--env NEMO_HOME=/home/TestData/nemo_home \
147+
--env HF_HOME=$HF_HOME \
148+
--env HF_MODULES_CACHE=$HF_MODULES_CACHE \
149+
--env NEMO_HOME=$NEMO_HOME \
144150
--env RUN_ID=${{ github.run_id }} \
145151
--env UV_NO_SYNC=1 \
146152
--env SHARD_ID=${{ inputs.shard-id }} \

‎.github/scripts/test_docker_dependency_layers.sh‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ if grep -q -- '--mount=type=secret,id=GH_TOKEN' "$dockerfile"; then
3131
fi
3232
mcore_reinstall_line=$(grep -n 'uv pip install --no-deps --reinstall -e 3rdparty/Megatron-LM' "$dockerfile" | cut -d: -f1)
3333
helper_assertion_line=$(grep -n "find 3rdparty/Megatron-LM/megatron/core/datasets -maxdepth 1 -name 'helpers_cpp\*\.so'" "$dockerfile" | cut -d: -f1)
34-
final_copy_line=$(grep -n '^COPY --chmod=644 \. /opt/Megatron-Bridge$' "$dockerfile" | cut -d: -f1)
34+
final_copy_line=$(grep -nE '^COPY (--chmod=644|--chown=1000:1000) \. /opt/Megatron-Bridge$' "$dockerfile" | cut -d: -f1)
3535
[[ -n "$mcore_reinstall_line" ]]
3636
[[ -n "$helper_assertion_line" ]]
3737
[[ -n "$final_copy_line" ]]
@@ -243,6 +243,14 @@ if grep -qE 'mcore_(commit|ref)|MCORE_COMMIT|uv sync --all-extras --all-groups'
243243
echo "Test template must use the already-validated MCore in the built image" >&2
244244
exit 1
245245
fi
246+
grep -Fq 'VOLUME_ARGS="--volume ${{ inputs.test-data-path }}:/home/TestData --env HF_HUB_OFFLINE=1"' "$composite_action"
247+
grep -q 'MOUNT_FS: ${{ inputs.is_unit_test == '\''false'\'' }}' "$composite_action"
248+
grep -q 'HF_HOME=/home/TestData/HF_HOME' "$composite_action"
249+
grep -q 'NEMO_HOME=/home/TestData/nemo_home' "$composite_action"
250+
grep -q 'HF_HOME=/home/ubuntu/.cache/huggingface' "$composite_action"
251+
grep -q 'NEMO_HOME=/home/ubuntu/.cache/nemo' "$composite_action"
252+
grep -q 'HF_MODULES_CACHE=/home/ubuntu/.cache/huggingface/modules' "$composite_action"
253+
grep -q -- '--env HF_MODULES_CACHE=\$HF_MODULES_CACHE' "$composite_action"
246254

247255
# The baseline dependency layer must be structurally independent of the mutable
248256
# dispatched checkout. CI validates the ordering statically so this regression

‎.github/workflows/cicd-main.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ jobs:
605605
uses: ./.github/actions/test-template
606606
with:
607607
script: Launch_Unit_Tests_Core
608-
timeout: 18
608+
timeout: 30
609609
is_unit_test: "true"
610610
shard-id: ${{ matrix.shard-id }}
611611
num-shards: 3

‎.main.commit‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24bad8e677d22625d86ef2a54c9506b6e4992c93
1+
14346b65a2d0790e451919858f7771078105c5f0

‎3rdparty/Megatron-LM‎

Submodule Megatron-LM updated 154 files

‎docker/Dockerfile.ci‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ RUN --mount=type=bind,source=docker/patches/deepep.patch,target=/opt/deepep.patc
102102
apt-get autoremove -y && \
103103
rm -rf /var/lib/apt/lists/* && \
104104
popd; \
105-
fi
105+
fi && \
106+
chown -R 1000:1000 ${UV_PROJECT_ENVIRONMENT}
106107

107108
COPY pyproject.toml uv.lock /opt/Megatron-Bridge/
108109
COPY src/megatron/bridge/__init__.py src/megatron/bridge/package_info.py /opt/Megatron-Bridge/src/megatron/bridge/
@@ -171,7 +172,8 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
171172
# Create symlink for tilelang's libcudart_stub.so to the actual libcudart.so
172173
# Otherwise, the stub will be called in some cases and fail
173174
ln -sf "$(ldconfig -p | awk '/libcudart\.so\.[0-9]+ /{print $NF; exit}')" /opt/venv/lib/python3.12/site-packages/tilelang/lib/libcudart_stub.so && \
174-
uv cache prune ${UV_CACHE_PRUNE_ARGS}
175+
uv cache prune ${UV_CACHE_PRUNE_ARGS} && \
176+
chown -R 1000:1000 ${UV_PROJECT_ENVIRONMENT}
175177

176178
COPY scripts/install_diffusion_deps.sh scripts/diffusion-deps.lock /opt/Megatron-Bridge/scripts/
177179

@@ -181,6 +183,16 @@ ARG INSTALL_DIFFUSION_DEPS=false
181183
RUN --mount=type=cache,target=/root/.cache/uv \
182184
if [ "$INSTALL_DIFFUSION_DEPS" = "true" ]; then \
183185
bash scripts/install_diffusion_deps.sh; \
184-
fi
186+
fi && \
187+
chown -R 1000:1000 ${UV_PROJECT_ENVIRONMENT}
188+
189+
COPY --chown=1000:1000 . /opt/Megatron-Bridge
190+
191+
# CI writes coverage beside the checked-out source, installs that source editable into the
192+
# prepared environment, and uses /nemo_run for runtime outputs. Keep those paths owned by the
193+
# existing unprivileged base-image user instead of relying on a root final user.
194+
RUN install -d -o 1000 -g 1000 -m 0755 /nemo_run /home/ubuntu/.cache && \
195+
chown 1000:1000 /opt/Megatron-Bridge
185196

186-
COPY --chmod=644 . /opt/Megatron-Bridge
197+
ENV HOME=/home/ubuntu
198+
USER 1000:1000

‎examples/conversion/compare_text_generation.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def megatron_generate(
294294
torch.distributed.broadcast_object_list(
295295
generated_logits,
296296
group=parallel_state.get_pipeline_model_parallel_group(),
297-
group_src=parallel_state.get_pipeline_model_parallel_last_rank(),
297+
src=parallel_state.get_pipeline_model_parallel_last_rank(),
298298
)
299299

300300
generated_text = tokenizer.detokenize(generated_ids[0])

‎src/megatron/bridge/models/gemma/gemma4_bridge.py‎

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -504,71 +504,75 @@ def _hf_layer_prefix(self) -> str:
504504
"""Text-only CausalLM: weights at ``model.*``; override in VL subclass."""
505505
return "model."
506506

507-
def _moe_mapping_registry(self) -> MegatronMappingRegistry:
507+
def _moe_mapping_registry(self, megatron_prefix: str = "") -> MegatronMappingRegistry:
508508
"""Parameter mappings for the MoE variant."""
509+
mp = megatron_prefix
510+
hp = self._hf_layer_prefix()
509511
param_mappings = {
510-
"embedding.word_embeddings.weight": "model.embed_tokens.weight",
511-
"decoder.final_layernorm.weight": "model.norm.weight",
512-
"decoder.layers.*.self_attention.linear_qkv.layer_norm_weight": "model.layers.*.input_layernorm.weight",
513-
"decoder.layers.*.self_attention.q_layernorm.weight": "model.layers.*.self_attn.q_norm.weight",
514-
"decoder.layers.*.self_attention.k_layernorm.weight": "model.layers.*.self_attn.k_norm.weight",
515-
"decoder.layers.*.self_attention.linear_proj.weight": "model.layers.*.self_attn.o_proj.weight",
516-
"decoder.layers.*.self_attention.linear_proj.post_layernorm.weight": (
517-
"model.layers.*.post_attention_layernorm.weight"
512+
f"{mp}embedding.word_embeddings.weight": f"{hp}embed_tokens.weight",
513+
f"{mp}decoder.final_layernorm.weight": f"{hp}norm.weight",
514+
f"{mp}decoder.layers.*.self_attention.linear_qkv.layer_norm_weight": (
515+
f"{hp}layers.*.input_layernorm.weight"
516+
),
517+
f"{mp}decoder.layers.*.self_attention.q_layernorm.weight": f"{hp}layers.*.self_attn.q_norm.weight",
518+
f"{mp}decoder.layers.*.self_attention.k_layernorm.weight": f"{hp}layers.*.self_attn.k_norm.weight",
519+
f"{mp}decoder.layers.*.self_attention.linear_proj.weight": f"{hp}layers.*.self_attn.o_proj.weight",
520+
f"{mp}decoder.layers.*.self_attention.linear_proj.post_layernorm.weight": (
521+
f"{hp}layers.*.post_attention_layernorm.weight"
518522
),
519-
"decoder.layers.*.pre_mlp_layernorm.weight": "model.layers.*.pre_feedforward_layernorm_2.weight",
520-
"decoder.layers.*.mlp.shared_experts.linear_fc2.weight": "model.layers.*.mlp.down_proj.weight",
521-
"decoder.layers.*.mlp.post_shared_expert_layernorm.weight": (
522-
"model.layers.*.post_feedforward_layernorm_1.weight"
523+
f"{mp}decoder.layers.*.pre_mlp_layernorm.weight": f"{hp}layers.*.pre_feedforward_layernorm_2.weight",
524+
f"{mp}decoder.layers.*.mlp.shared_experts.linear_fc2.weight": f"{hp}layers.*.mlp.down_proj.weight",
525+
f"{mp}decoder.layers.*.mlp.post_shared_expert_layernorm.weight": (
526+
f"{hp}layers.*.post_feedforward_layernorm_1.weight"
523527
),
524-
"decoder.layers.*.mlp.router.weight": "model.layers.*.router.proj.weight",
528+
f"{mp}decoder.layers.*.mlp.router.weight": f"{hp}layers.*.router.proj.weight",
525529
}
526530

527531
mapping_list = [AutoMapping(megatron_param=m, hf_param=h) for m, h in param_mappings.items()]
528532
mapping_list.extend(
529533
[
530534
_Gemma4QKVMapping(
531-
megatron_param="decoder.layers.*.self_attention.linear_qkv.weight",
532-
q="model.layers.*.self_attn.q_proj.weight",
533-
k="model.layers.*.self_attn.k_proj.weight",
534-
v="model.layers.*.self_attn.v_proj.weight",
535+
megatron_param=f"{mp}decoder.layers.*.self_attention.linear_qkv.weight",
536+
q=f"{hp}layers.*.self_attn.q_proj.weight",
537+
k=f"{hp}layers.*.self_attn.k_proj.weight",
538+
v=f"{hp}layers.*.self_attn.v_proj.weight",
535539
),
536540
GatedMLPMapping(
537-
megatron_param="decoder.layers.*.mlp.shared_experts.linear_fc1.weight",
538-
gate="model.layers.*.mlp.gate_proj.weight",
539-
up="model.layers.*.mlp.up_proj.weight",
541+
megatron_param=f"{mp}decoder.layers.*.mlp.shared_experts.linear_fc1.weight",
542+
gate=f"{hp}layers.*.mlp.gate_proj.weight",
543+
up=f"{hp}layers.*.mlp.up_proj.weight",
540544
),
541545
FusedGatedExpertMapping(
542-
megatron_param="decoder.layers.*.mlp.experts.linear_fc1.weight*",
543-
hf_param="model.layers.*.experts.gate_up_proj",
546+
megatron_param=f"{mp}decoder.layers.*.mlp.experts.linear_fc1.weight*",
547+
hf_param=f"{hp}layers.*.experts.gate_up_proj",
544548
),
545549
FusedExpertMapping(
546-
megatron_param="decoder.layers.*.mlp.experts.linear_fc2.weight*",
547-
hf_param="model.layers.*.experts.down_proj",
550+
megatron_param=f"{mp}decoder.layers.*.mlp.experts.linear_fc2.weight*",
551+
hf_param=f"{hp}layers.*.experts.down_proj",
548552
),
549553
ReplicatedMapping(
550-
megatron_param="decoder.layers.*.layer_scalar",
551-
hf_param="model.layers.*.layer_scalar",
554+
megatron_param=f"{mp}decoder.layers.*.layer_scalar",
555+
hf_param=f"{hp}layers.*.layer_scalar",
552556
),
553557
ReplicatedMapping(
554-
megatron_param="decoder.layers.*.mlp.router.per_expert_scale",
555-
hf_param="model.layers.*.router.per_expert_scale",
558+
megatron_param=f"{mp}decoder.layers.*.mlp.router.per_expert_scale",
559+
hf_param=f"{hp}layers.*.router.per_expert_scale",
556560
),
557561
ReplicatedMapping(
558-
megatron_param="decoder.layers.*.mlp.router.scale",
559-
hf_param="model.layers.*.router.scale",
562+
megatron_param=f"{mp}decoder.layers.*.mlp.router.scale",
563+
hf_param=f"{hp}layers.*.router.scale",
560564
),
561565
ReplicatedMapping(
562-
megatron_param="decoder.layers.*.pre_shared_expert_layernorm.weight",
563-
hf_param="model.layers.*.pre_feedforward_layernorm.weight",
566+
megatron_param=f"{mp}decoder.layers.*.pre_shared_expert_layernorm.weight",
567+
hf_param=f"{hp}layers.*.pre_feedforward_layernorm.weight",
564568
),
565569
ReplicatedMapping(
566-
megatron_param="decoder.layers.*.mlp.post_moe_layernorm.weight",
567-
hf_param="model.layers.*.post_feedforward_layernorm_2.weight",
570+
megatron_param=f"{mp}decoder.layers.*.mlp.post_moe_layernorm.weight",
571+
hf_param=f"{hp}layers.*.post_feedforward_layernorm_2.weight",
568572
),
569573
ReplicatedMapping(
570-
megatron_param="decoder.layers.*.post_ffn_layernorm.weight",
571-
hf_param="model.layers.*.post_feedforward_layernorm.weight",
574+
megatron_param=f"{mp}decoder.layers.*.post_ffn_layernorm.weight",
575+
hf_param=f"{hp}layers.*.post_feedforward_layernorm.weight",
572576
),
573577
]
574578
)

‎src/megatron/bridge/models/gemma_vl/gemma4_vl_bridge.py‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@
2121
2222
AutoBridge.from_hf_pretrained("google/gemma-4-E4B-it")
2323
└─ Gemma4VLBridge (registered for Gemma4ForConditionalGeneration)
24-
├─ provider_bridge() text mode → Gemma4DenseProvider (pretraining)
25-
│ auto/vl → Gemma4DenseVLProvider (full VL)
26-
└─ mapping_registry() Dense → _dense_vl_mapping_registry()
27-
MoE → _moe_vl_mapping_registry()
24+
├─ provider_bridge() Dense: text mode → Gemma4DenseProvider (pretraining)
25+
│ auto/vl → Gemma4DenseVLProvider (full VL)
26+
│ MoE: text mode → Gemma4ModelProvider (text-only training)
27+
│ auto/vl → Gemma4VLModelProvider (full VL)
28+
└─ mapping_registry() Dense: text → _dense_mapping_registry("")
29+
vl → _dense_vl_mapping_registry()
30+
MoE: text → _moe_mapping_registry()
31+
vl → _moe_vl_mapping_registry()
2832
"""
2933

3034
import os
@@ -91,6 +95,8 @@ def provider_bridge(
9195
return self._build_dense_vl_provider(hf_config, text_config, vision_config)
9296

9397
self._is_dense = False
98+
if self._conversion_mode() == "text":
99+
return self._build_moe_provider(text_config)
94100

95101
provider_kwargs = self.hf_config_to_provider_kwargs(text_config)
96102
provider = Gemma4VLModelProvider(**provider_kwargs)
@@ -226,6 +232,8 @@ def mapping_registry(self) -> MegatronMappingRegistry:
226232
if self._conversion_mode() == "text":
227233
return self._dense_mapping_registry(megatron_prefix="")
228234
return self._dense_vl_mapping_registry()
235+
if self._conversion_mode() == "text":
236+
return self._moe_mapping_registry()
229237
return self._moe_vl_mapping_registry()
230238

231239
def _dense_vl_mapping_registry(self) -> MegatronMappingRegistry:

0 commit comments

Comments
 (0)