patch_vllm_routed_experts_weight_shape.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/env python3
  2. """Preserve vector weight_shape metadata in RoutedExperts loading."""
  3. import sys
  4. from pathlib import Path
  5. source_root = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.cwd()
  6. target = source_root / "vllm/model_executor/layers/fused_moe/routed_experts.py"
  7. old = ''' def _load_single_value(
  8. self, param: torch.nn.Parameter, loaded_weight: torch.Tensor, expert_id: int
  9. ):
  10. param_data = param.data
  11. # Input scales can be loaded directly and should be equal.
  12. param_data[expert_id] = self._to_scalar(loaded_weight)
  13. '''
  14. new = ''' def _load_single_value(
  15. self, param: torch.nn.Parameter, loaded_weight: torch.Tensor, expert_id: int
  16. ):
  17. param_data = param.data
  18. target = param_data[expert_id]
  19. if target.ndim > 0 and target.numel() == loaded_weight.numel():
  20. target.copy_(loaded_weight.reshape_as(target).to(
  21. device=target.device, dtype=target.dtype))
  22. return
  23. # Scalar input scales can be loaded directly and should be equal.
  24. param_data[expert_id] = self._to_scalar(loaded_weight)
  25. '''
  26. if not target.exists():
  27. print(f"{target} not found; skipping RoutedExperts weight_shape workaround")
  28. else:
  29. text = target.read_text()
  30. if "target = param_data[expert_id]" in text:
  31. print("RoutedExperts weight_shape workaround already present; skipping")
  32. elif old in text:
  33. target.write_text(text.replace(old, new, 1))
  34. print("Applied RoutedExperts weight_shape workaround")
  35. else:
  36. print(
  37. "Known vulnerable RoutedExperts _load_single_value pattern "
  38. "not found; skipping"
  39. )