mimo26-fast-expert-load.diff 1.9 KB

123456789101112131415161718192021222324252627282930313233343536
  1. diff --git a/python/sglang/srt/models/mimo_v2.py b/python/sglang/srt/models/mimo_v2.py
  2. index 41a95e4b6e..6f67bef0d5 100644
  3. --- a/python/sglang/srt/models/mimo_v2.py
  4. +++ b/python/sglang/srt/models/mimo_v2.py
  5. @@ -1449,6 +1449,19 @@ class MiMoV2ForCausalLM(nn.Module, AudioEncoderMixin):
  6. # matching the draft's extract_context_feature (offset=1).
  7. self.model.layers_to_capture = [val + 1 for val in layer_ids]
  8. + _ROUTED_EXPERT_RE = re.compile(r"^model\.layers\.(\d+)\.mlp\.experts\.(\d+)\.")
  9. +
  10. + def _is_local_routed_expert(self, name: str) -> bool:
  11. + m = self._ROUTED_EXPERT_RE.match(name)
  12. + if m is None or self.model is None:
  13. + return True
  14. + layer_id = int(m.group(1))
  15. + if not 0 <= layer_id < len(self.model.layers):
  16. + return True
  17. + experts = getattr(getattr(self.model.layers[layer_id], "mlp", None), "experts", None)
  18. + mapper = getattr(experts, "_map_global_expert_id_to_local_expert_id", None)
  19. + return mapper is None or mapper(int(m.group(2))) >= 0
  20. +
  21. def load_weights(self, weights: Iterable[Tuple[str, torch.Tensor]]):
  22. stacked_params_mapping = [
  23. # (param_name, shard_name, shard_id)
  24. @@ -1599,6 +1612,11 @@ class MiMoV2ForCausalLM(nn.Module, AudioEncoderMixin):
  25. continue
  26. if ".mlp.experts." in name and loaded_weight.dtype == torch.uint8:
  27. + # Skip experts stored on other EP ranks before touching the
  28. + # mmap: converting the UE8M0 scales of all 384 experts on every rank
  29. + # scales dominated load time on 8 x DGX Spark.
  30. + if not self._is_local_routed_expert(name):
  31. + continue
  32. if name.endswith(".weight_scale"):
  33. name = name + "_inv"
  34. loaded_weight = torch.exp2(loaded_weight.to(torch.float32) - 127.0)