NVIDIA / NVIDIA/Model-Optimizer
fsdp2_aware_weight_update hides the real error with an UnboundLocalError
@cjluo-nv is already working on this.
Since Jul 5, 2026.
- Dominant language
- Python
- Stars
- 3.8k
- Forks
- 604
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 142
Description
Before submitting an issue, please make sure it hasn't been already addressed by searching through the existing and past issues.
Describe the bug
fsdp2_aware_weight_update (in modelopt/torch/quantization/utils/core_utils.py) is a context manager. Its finally block uses three variables — fsdp_param_mapping, fsdp_param_group, and root_module — that are only set after the unshard() call inside the try.
So if unshard() fails (typically a CUDA OOM when a large FSDP block can't fit on one GPU), the finally runs before those variables exist and raises:
UnboundLocalError: local variable 'fsdp_param_mapping' referenced before assignment
In Python, an error raised inside finally replaces the original error. So the real failure (the OOM) is thrown away, and you only see the misleading UnboundLocalError. The actual problem becomes very hard to debug.
This shows up during export of large (especially MoE) models, where unsharding a block is most likely to run out of memory.
Steps/Code to reproduce bug
The simplest deterministic repro: make the in-body unshard() raise and confirm the wrong error comes out.
- Shard a model under FSDP2.
- Patch the enclosing module's
unshardto raise any error. - Enter
fsdp2_aware_weight_update(model, sharded_module). - You get
UnboundLocalErrorinstead of the error you raised.
In the real world this happens on its own: export a large MoE model where one block's unshard() all-gather exceeds GPU memory, and the OOM is replaced by the UnboundLocalError.
Expected behavior
If something fails before those variables are set, the finally should be a no-op and the original error (e.g. the OOM) should propagate unchanged.
Who can help?
System information
- OS: Ubuntu 22.04
- CPU architecture: x86_64
- GPU name: H100
- Library versions (if applicable):
- Python: 3.12
- ModelOpt version or commit hash: present on current
main - PyTorch: 2.x
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.