Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
b88aa2c
perf(vllm): optimize quantized refit paths
seonjinn Jul 21, 2026
438e20d
Merge branch 'main' into sna/pr-mxfp8-refit-optimization
seonjinn Jul 21, 2026
96ba299
Merge branch 'main' into sna/pr-mxfp8-refit-optimization
seonjinn Jul 27, 2026
0fb59b6
fix(trtllm): align refit metadata interface
seonjinn Jul 27, 2026
c4a5e14
test(vllm): include MXFP8 refit tests in L0
seonjinn Jul 27, 2026
5c53bd4
fix(refit): complete prequant metadata handshake
seonjinn Jul 27, 2026
98fc197
test(refit): cover MXFP8 optimization paths
seonjinn Jul 27, 2026
b237fd2
test(refit): fix vLLM test import order
seonjinn Jul 27, 2026
d1f9fc9
Merge upstream/main into sna/pr-mxfp8-refit-optimization
seonjinn Jul 28, 2026
ab030c3
test(fp8): cover MXFP8 MoE padding path
seonjinn Jul 28, 2026
2c147ac
Merge upstream/main into sna/pr-mxfp8-refit-optimization
seonjinn Jul 28, 2026
150e25f
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Jul 29, 2026
f391a4a
fix(refit): reconcile MXFP8 optimizations with NCCL reshard
seonjinn Jul 29, 2026
85a6fea
fix(refit): validate checkpoint prequant backend
seonjinn Jul 29, 2026
716bb74
fix(refit): reject MXFP8 with NCCL reshard
seonjinn Jul 29, 2026
f638fa6
fix(refit): validate NCCL reshard storage precision
seonjinn Jul 29, 2026
2fde3b0
ci: associate Codecov uploads with pull requests
seonjinn Jul 30, 2026
2b0b262
Merge remote-tracking branch 'origin/main' into sna/pr-mxfp8-refit-op…
seonjinn Jul 30, 2026
6fe0632
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Jul 30, 2026
00fa128
fix: address MXFP8 refit review feedback
seonjinn Jul 30, 2026
de65f06
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Jul 30, 2026
2339686
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Jul 31, 2026
5880499
fix(vllm): preserve MXFP8 refit on vLLM 0.25
seonjinn Jul 31, 2026
123cc07
style(vllm): sort MXFP8 backend import
seonjinn Jul 31, 2026
ef3fa08
fix(vllm): allow partial configs in quant validation
seonjinn Jul 31, 2026
7989113
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Jul 31, 2026
c4a7b06
feat(recipe): add async Qwen3 30B MXFP8 rollout
seonjinn Jul 31, 2026
69f7995
feat(recipe): add async Qwen3 235B MXFP8 rollout
seonjinn Jul 31, 2026
d53bfdf
ci: allowlist async recipe result path
seonjinn Jul 31, 2026
2405bf5
fix(vllm): initialize async driver FP8 config
seonjinn Jul 31, 2026
0a11e94
fix(vllm): propagate FP8 config to refit workers
seonjinn Jul 31, 2026
81ce860
fix(recipe): keep Qwen router gate in BF16
seonjinn Jul 31, 2026
9e43378
fix(recipe): exclude Qwen MoE routers from MXFP8
seonjinn Jul 31, 2026
6e582b8
fix(vllm): patch FP8 in RayExecutorV2 workers
seonjinn Aug 1, 2026
93394c2
fix(vllm): serialize FP8 worker pre-init hook
seonjinn Aug 1, 2026
f3c9196
test(vllm): share RayExecutorV2 patch recorder
seonjinn Aug 1, 2026
e3384d2
feat(vllm): configure refit runtime optimizations
seonjinn Aug 1, 2026
c4d453e
fix(refit): propagate runtime configuration
seonjinn Aug 1, 2026
d43372e
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Aug 1, 2026
2b80a85
fix(refit): cover standalone algorithm paths
seonjinn Aug 1, 2026
0b6b5cc
fix(vllm): scope refit optimization config
seonjinn Aug 1, 2026
cd7732c
fix(refit): allow matching fp8 reshard storage
seonjinn Aug 1, 2026
80cd8fe
Merge remote-tracking branch 'upstream/main' into sna/pr-mxfp8-refit-…
seonjinn Aug 13, 2026
7705d22
fix(refit): validate MXFP8 prequant wire format
seonjinn Aug 13, 2026
88721ce
Merge remote-tracking branch 'origin/main' into review/pr3294-latest-…
seonjinn Aug 18, 2026
94a312e
fix: accept serialized_fp8_config in real-quant prepare_refit_info
seonjinn Aug 25, 2026
759b44c
fix: gate slim-refit optimizer offload on offload_optimizer_for_refit
seonjinn Aug 25, 2026
3736d16
fix: validate MXFP8 scale presence against full refit manifest
seonjinn Aug 25, 2026
1d6a10a
Merge branch 'main' into pr-3294-fixes
seonjinn Aug 26, 2026
8dc4c36
fix(dynamo): align prepare_refit_info override with interface
seonjinn Aug 26, 2026
db442ef
Merge branch 'main' into sna/pr-mxfp8-refit-optimization
seonjinn Aug 26, 2026
4427f4c
Merge main into sna/pr-mxfp8-refit-optimization
seonjinn Aug 26, 2026
c162cfd
fix: resolve CI unit-test failures after main merge
seonjinn Aug 26, 2026
382fa8b
Merge remote branch update, keeping local merge resolution and CI fixes
seonjinn Aug 26, 2026
125f178
Merge main into sna/pr-mxfp8-refit-optimization
seonjinn Aug 26, 2026
e28239c
fix(refit): derive prequantize metadata without re-exporting weights
seonjinn Aug 26, 2026
232da17
Fix pyrefly no-matching-overload false positive on masked_fill
seonjinn Aug 26, 2026
6b2ab6e
test: update refit cleanup fixture after main merge
seonjinn Aug 27, 2026
06b6fbb
refactor(refit): limit optimized recipes to sync RL
seonjinn Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/fp8.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,25 @@ MXFP8 configurations should use `quantization_ignore_patterns` instead.
(`precision: "fp8"` without `is_mx`) has no pattern-based replacement yet and
must continue to use `quantization_ignored_layer_kws`.

For MXFP8 rollout with Megatron training, trainer-side prequantization can
reduce the refit payload:

```yaml
policy:
generation:
vllm_cfg:
precision: fp8
is_mx: true
refit_prequantize: true
```

`refit_prequantize` is an MXFP8 refit optimization. It requires
`precision: fp8`, `is_mx: true`, and the Megatron policy backend. It moves
eligible weight quantization to the trainer and transfers E4M3 values plus E8M0
scales instead of BF16 weights. It is rejected for blockwise FP8, BF16, NVFP4,
sparse-delta refit, and NCCL-Reshard refit. NVFP4 real-quant rollout uses its own
packed-weight refit protocol.

To train with FP8, you need to set the Megatron path and configure it using the following settings:

```
Expand Down
11 changes: 11 additions & 0 deletions docs/guides/refit.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@ workers can send weights. Sparse delta is currently limited to GRPO. NIXL is
initialized by the GRPO and distillation setup paths; PPO currently requires
colocated generation.

## Performance Options

| Option | Scope | Effect |
|---|---|---|
| `policy.generation.vllm_cfg.refit_prequantize` | Megatron training with MXFP8 vLLM rollout | Quantizes eligible weights on the trainer and transfers E4M3 values plus E8M0 scales. Requires `precision: fp8` and `is_mx: true`; sparse delta and NCCL Reshard do not support it. |
| `policy.generation.vllm_cfg.refit_cache_loader_routes` | vLLM refit | Replays identity-validated weight-loader routes after the first refit. Disabled by default because loader behavior is model-dependent. |
| `policy.refit_buffer_size_gb` | Colocated CUDA IPC or non-colocated NCCL broadcast | Sets the packing threshold explicitly. For NCCL broadcast, the same byte value is sent to producer and consumer so their collective chunk boundaries match. |
| `policy.refit_persistent_ipc_buffers` | Colocated CUDA-IPC refit | Reuses the two trainer staging buffers across refits. A fixed `refit_buffer_size_gb` gives stable memory use. |
| `policy.megatron_cfg.refit_slim_offload_after` | Colocated Megatron refit | Avoids repeating grad-buffer offload and a second allocator cleanup after weights are transferred. |
| `policy.megatron_cfg.pinned_reference_swap` | Megatron reference-policy logprobs | Keeps the CPU reference copy in pinned memory for faster host-to-device swaps, at the cost of additional pinned host memory. |

## Minimal Configuration

Colocated refit needs no transport configuration:
Expand Down
12 changes: 12 additions & 0 deletions examples/configs/grpo_math_1B.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,12 @@ policy:

megatron_cfg:
enabled: false
# When true, offload_after_refit skips rerunning the full offload_before_refit
# pass and only re-offloads the optimizer with a single allocator cleanup.
refit_slim_offload_after: false
# When true, stage the per-step reference-policy swap in persistent pinned
# CPU buffers instead of pageable copies (faster PCIe, more host RAM).
pinned_reference_swap: false
# Arbitrary overrides applied recursively to the Megatron Bridge model
# provider before model instantiation. Do not duplicate first-class fields.
model_overrides: {}
Expand Down Expand Up @@ -344,6 +350,10 @@ policy:
# makes the training sequence length divisible by the tensor parallel size
# this is useful for sequence parallel training
make_sequence_length_divisible_by: ${policy.dtensor_cfg.tensor_parallel_size}
# Keep refit CUDA-IPC staging buffers allocated across refits (skips two large
# allocations plus a gc/empty_cache pair per refit). Best with a fixed
# refit_buffer_size_gb; buffers stay resident on the trainer GPU between refits.
refit_persistent_ipc_buffers: false
max_grad_norm: 1.0

optimizer:
Expand Down Expand Up @@ -420,6 +430,8 @@ policy:
vllm_cfg:
async_engine: false
precision: ${policy.precision}
# MXFP8 + Megatron only: quantize on trainer and stream E4M3 values plus scales.
refit_prequantize: false
kv_cache_dtype: "auto"
logprobs_mode: processed_logprobs
tensor_parallel_size: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ policy:
tensor_parallel_size: 4
precision: "fp8"
is_mx: true
refit_prequantize: true
refit_cache_loader_routes: true
quantization_ignore_patterns:
- model.layers.*.self_attn.*
- model.layers.*.mlp.gate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ policy:
gpu_memory_utilization: 0.8
precision: "fp8"
is_mx: true
refit_prequantize: false
refit_cache_loader_routes: false
quantization_ignore_patterns:
- model.layers.*.self_attn.*
- model.layers.*.mlp.gate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ policy:
tensor_parallel_size: 1
precision: "fp8"
is_mx: true
refit_prequantize: true
refit_cache_loader_routes: true
quantization_ignore_patterns:
- model.layers.*.self_attn.*
- model.layers.*.mlp.gate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ policy:
vllm_cfg:
precision: "fp8"
is_mx: true
refit_prequantize: true
refit_cache_loader_routes: true
quantization_ignore_patterns:
- model.layers.*.self_attn.*
- lm_head
Expand Down
16 changes: 12 additions & 4 deletions nemo_rl/algorithms/distillation.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
checkpoint_engine_refit_config,
)
from nemo_rl.weight_sync.factory import create_weight_synchronizer
from nemo_rl.weight_sync.interfaces import initialize_refit_metadata

# ===============================================================================
# Configuration
Expand Down Expand Up @@ -628,8 +629,7 @@ def init_nemo_gym():
)
student_generation.weight_synchronizer.init_communicator()
elif student_generation is not None:
state_dict_info = student_policy.prepare_refit_info()
student_generation.prepare_refit_info(state_dict_info)
initialize_refit_metadata(student_policy, student_generation)

# if it is not colocated inference, initialize collective communication for update weights
if not colocated_inference and checkpoint_engine_config is None:
Expand Down Expand Up @@ -722,6 +722,7 @@ def distillation_train(
val_at_start = master_config.distillation.val_at_start
val_at_end = master_config.distillation.val_at_end
colocated_inference = master_config.policy["generation"]["colocated"]["enabled"]
refit_buffer_size_gb = master_config.policy.get("refit_buffer_size_gb")
max_epochs = (
master_config.distillation.max_num_epochs
) # max number of epochs to train for
Expand All @@ -734,7 +735,10 @@ def distillation_train(
print("\n🔍 Running initial validation...", flush=True)
if NEED_REFIT and POLICY_GENERATION_STALE:
refit_policy_generation(
student_policy, student_generation, colocated_inference
student_policy,
student_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
POLICY_GENERATION_STALE = False
else:
Expand Down Expand Up @@ -795,6 +799,7 @@ def distillation_train(
student_policy,
student_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
timer=timer,
)
POLICY_GENERATION_STALE = False
Expand Down Expand Up @@ -937,7 +942,10 @@ def distillation_train(
):
if NEED_REFIT and POLICY_GENERATION_STALE:
refit_policy_generation(
student_policy, student_generation, colocated_inference
student_policy,
student_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
POLICY_GENERATION_STALE = False
else:
Expand Down
32 changes: 23 additions & 9 deletions nemo_rl/algorithms/grpo.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@
checkpoint_engine_refit_config,
)
from nemo_rl.weight_sync.factory import create_weight_synchronizer
from nemo_rl.weight_sync.interfaces import initialize_refit_metadata

# ===============================================================================
# Configuration
Expand Down Expand Up @@ -1763,9 +1764,10 @@ def init_dynamo():
) is None and _needs_hf_refit_handshake(
backend, nccl_reshard_refit_enabled, colocated_inference
):
state_dict_info = policy.prepare_refit_info()
if policy_generation is not None:
policy_generation.prepare_refit_info(state_dict_info)
initialize_refit_metadata(policy, policy_generation)
else:
policy.prepare_refit_info()

# Spin up non-colocated OPD teacher worker groups AFTER policy / vLLM are
# ready. Parallelizing with policy init races on Megatron-Bridge's HF->mcore
Expand Down Expand Up @@ -2498,10 +2500,15 @@ def refit_policy_generation(
with timer_context:
# update weights
update_success = False
configured_buffer_size_bytes = (
None
if _refit_buffer_size_gb is None
else int(_refit_buffer_size_gb * 1024**3)
)
if colocated_inference:
# get model param keys, which is grouped by size
if _refit_buffer_size_gb is not None:
buffer_size_bytes = int(_refit_buffer_size_gb * (1024**3))
if configured_buffer_size_bytes is not None:
buffer_size_bytes = configured_buffer_size_bytes
else:
# Empirically sets ratio as 30% to maximize efficiency.
# The remaining 70% is a necessary buffer reserved for the parameter all-gathering across the expert-parallelism dimension.
Expand All @@ -2524,11 +2531,15 @@ def refit_policy_generation(
results = ray.get(futures_inference)
update_success = all(result for result in results if result is not None)
else:
# update weights through nccl (vLLM)
futures_train = policy.broadcast_weights_for_collective(
kv_scales=kv_scales,
)
futures_inference = policy_generation.update_weights_from_collective()
# update weights through nccl (vLLM) or megatron reshard
if isinstance(policy_generation, MegatronGeneration):
futures_train = policy.swap_weights_via_reshard(is_source=True)
futures_inference = policy_generation.update_weights_from_collective()
else:
futures_train = policy.broadcast_weights_for_collective(
kv_scales=kv_scales,
)
futures_inference = policy_generation.update_weights_from_collective()
# wait for all futures to complete
ray.get(futures_train)
results = ray.get(futures_inference)
Expand Down Expand Up @@ -4292,6 +4303,7 @@ def async_grpo_train(
val_at_start = master_config.grpo.val_at_start
val_at_end = master_config.grpo.val_at_end
colocated_inference = master_config.policy["generation"]["colocated"]["enabled"]
refit_buffer_size_gb = master_config.policy.get("refit_buffer_size_gb")
stop_at_validation_threshold = master_config.grpo.stop_at_validation_threshold
stop_at_validation_metric = master_config.grpo.stop_at_validation_metric

Expand Down Expand Up @@ -4499,6 +4511,7 @@ def async_grpo_train(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
print("✅ Policy generation refit completed successfully", flush=True)
POLICY_GENERATION_STALE = False
Expand Down Expand Up @@ -5157,6 +5170,7 @@ def async_grpo_train(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
POLICY_GENERATION_STALE = False

Expand Down
10 changes: 9 additions & 1 deletion nemo_rl/algorithms/grpo_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@ def grpo_train_sync(
val_period = master_config.grpo.val_period
val_start_at = master_config.grpo.val_start_at
colocated_inference = master_config.policy["generation"]["colocated"]["enabled"]
refit_buffer_size_gb = master_config.policy.get("refit_buffer_size_gb")
stop_at_validation_threshold = master_config.grpo.stop_at_validation_threshold
stop_at_validation_metric = master_config.grpo.stop_at_validation_metric

Expand Down Expand Up @@ -503,7 +504,12 @@ def grpo_train_sync(
memory_tracker.snapshot_start_of_stage("Initial validation", dir())

if POLICY_GENERATION_STALE:
refit_policy_generation(policy, policy_generation, colocated_inference)
refit_policy_generation(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
POLICY_GENERATION_STALE = False
else:
policy_generation.prepare_for_generation()
Expand Down Expand Up @@ -629,6 +635,7 @@ def grpo_train_sync(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
timer=timer,
kv_scales=kv_scales_cache if sync_kv_scales else None,
)
Expand Down Expand Up @@ -1006,6 +1013,7 @@ def grpo_train_sync(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
kv_scales=kv_scales_cache if sync_kv_scales else None,
)
POLICY_GENERATION_STALE = False
Expand Down
17 changes: 14 additions & 3 deletions nemo_rl/algorithms/ppo.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
from nemo_rl.utils.timer import TimeoutChecker, Timer
from nemo_rl.utils.venvs import make_actor_runtime_env
from nemo_rl.weight_sync.factory import create_weight_synchronizer
from nemo_rl.weight_sync.interfaces import initialize_refit_metadata

# ===============================================================================
# Configuration
Expand Down Expand Up @@ -926,10 +927,12 @@ def initialize_generation_with_policy(
ray.get(futures_train + futures_inference)
worker_init_timing_metrics["collective_init_time_s"] = time.perf_counter() - t0

# prepare refit info (sglang initializes refit state via its weight synchronizer)
if backend != "sglang":
state_dict_info = policy.prepare_refit_info()
if policy_generation is not None:
policy_generation.prepare_refit_info(state_dict_info)
initialize_refit_metadata(policy, policy_generation)
else:
policy.prepare_refit_info()

# Calculate total setup time
total_setup_time = time.perf_counter() - setup_start_time
Expand Down Expand Up @@ -1251,6 +1254,7 @@ def ppo_train(
val_at_end = master_config.ppo.val_at_end
val_period = master_config.ppo.val_period
colocated_inference = master_config.policy["generation"]["colocated"]["enabled"]
refit_buffer_size_gb = master_config.policy.get("refit_buffer_size_gb")

# Initialize advantage estimator
adv_estimator = _create_advantage_estimator(master_config)
Expand All @@ -1261,7 +1265,12 @@ def ppo_train(
memory_tracker.snapshot_start_of_stage("Initial validation", dir())

if NEED_REFIT and POLICY_GENERATION_STALE:
refit_policy_generation(policy, policy_generation, colocated_inference)
refit_policy_generation(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
)
if not colocated_inference:
# Colocated refit offloads policy inside
# `refit_policy_generation`. Do it here so the value
Expand Down Expand Up @@ -1357,6 +1366,7 @@ def ppo_train(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
timer=timer,
kv_scales=kv_scales_cache if sync_kv_scales else None,
)
Expand Down Expand Up @@ -1675,6 +1685,7 @@ def ppo_train(
policy,
policy_generation,
colocated_inference,
_refit_buffer_size_gb=refit_buffer_size_gb,
kv_scales=kv_scales_cache if sync_kv_scales else None,
)
if not colocated_inference:
Expand Down
16 changes: 12 additions & 4 deletions nemo_rl/modelopt/models/generation/vllm_quant_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import types
from collections.abc import Iterator
from contextlib import ExitStack, contextmanager
from typing import Any
from typing import Any, Optional

import torch
import vllm # noqa: F401
Expand Down Expand Up @@ -531,10 +531,17 @@ def _synchronize_before_ipc_data_ack(self) -> None:
return
super()._synchronize_before_ipc_data_ack()

def prepare_refit_info(self, state_dict_info: dict[str, Any]) -> None:
super().prepare_refit_info(state_dict_info)
def prepare_refit_info(

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] Signature drift: first refit raises TypeError for every ModelOpt-backed vLLM engine.

The base class gained a second positional parameter (vllm_backend.py:460-464, prepare_refit_info(self, state_dict_info, serialized_fp8_config)), and both drivers now RPC two args unconditionally:

  • vllm_worker.py:1157-1160: collective_rpc("prepare_refit_info", args=(state_dict_info, fp8.serialize_fp8_config()))
  • vllm_worker_async.py:1412-1415: same

This override still declares prepare_refit_info(self, state_dict_info), so the RPC fails with TypeError: takes 2 positional arguments but 3 were given before the body runs - the _is_real_quant_model()==False fallback is unreachable, so fake-quant configs break too. No test exercises the 2-arg call against this extension.

Fix: accept and forward the new parameter (def prepare_refit_info(self, state_dict_info, serialized_fp8_config=None) and pass it through to super()).

self,
state_dict_info: dict[str, Any],
serialized_fp8_config: Optional[dict[str, Any]] = None,
) -> Optional[list[str]]:
if not self._is_real_quant_model():
return
return super().prepare_refit_info(state_dict_info, serialized_fp8_config)

# Real quantization owns a separate refit handshake and must not import
# the legacy FP8 quantization path.
self.state_dict_info = state_dict_info
self._get_modelopt_reload_roots()
quant_config = (
self.model_runner.vllm_config.model_config.hf_config.quantization_config
Expand All @@ -553,6 +560,7 @@ def prepare_refit_info(self, state_dict_info: dict[str, Any]) -> None:
"Fused ModelOpt MoE refits require all experts local; "
"vLLM expert parallelism is unsupported"
)
return None

@contextmanager
def _patch_named_parameters_to_include_buffers(self, model):
Expand Down
Loading
Loading