INT4 packing extension never loads from a read-only install
Los mantenedores suelen responder en 2 días
@ajrasane ya está trabajando en esto.
Desde el 29/10/2026.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Área
- backend, performance
Línea de trabajo
Read modelopt/onnx/quantization/extensions.py and trace how cppimport builds and loads modelopt_round_and_pack_ext when the installed package is read-only. Reproduce with an unwritable package directory and check whether the extension loads or the fallback is used. Done means INT4 packing works from a read-only install, with tests covering the chosen behavior; the issue lists per-user cache builds, prebuilt wheels, and quiet fallback as possible directions.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
modelopt/onnx/quantization/extensions.py builds modelopt_round_and_pack_ext with cppimport the first time it is imported, next to its source in the installed package. Where the user can't write there, for example in a system-wide install, a read-only container layer, or an image built as root and run as another user, cppimport can't take its build lock, so every process logs
WARNING - [Errno 13] Permission denied: '.../modelopt/onnx/quantization/src/modelopt_round_and_pack_ext.cpython-314-x86_64-linux-gnu.so.lock'
Unable to load `modelopt_round_and_pack_ext', falling back to python based optimized version.
([Errno 30] Read-only file system on a read-only mount), and INT4 packing always uses the NumPy fallback. PyPI has only a py3-none-any wheel, so the extension is always built on the user's machine, and this applies to every such install.
extensions.py is the same in 0.47.0, release/0.48.0 and main.
Steps/Code to reproduce bug
-
Install ModelOpt with the
onnxextra, and don't importmodelopt.onnx.quantizationfrom it while it is writable: that builds the extension next to its source, and an up-to-date build then loads without taking the lock. -
Make the installed
modeloptpackage unwritable for the user who will run it, for example withchmod -R a-w .../site-packages/modelopt, and use a non-root user (root ignores the permission bits). Or mount it read-only, which gives[Errno 30]even for root. -
As that user:
import modelopt.onnx.quantization.extensions as ext print(ext.round_and_pack_ext) # None, with the warning above
Expected behavior
The extension is built somewhere the user can write and then loaded, or the fallback is quiet if that is intended.
Possible fixes
- Build in a per-user cache when the package is read-only, as
torch.utils.cpp_extensiondoes (~/.cache/torch_extensions). I have a tested change that builds a copy of the source in$XDG_CACHE_HOME/modelopt/onnx_extensions/<hash of the source>/, compares that copy with the package's source before each use, keeps the in-place build for writable installs, still loads a prebuilt extension next to a read-only source (also where no temporary directory can be created), and comes with unit tests. I can open it as a PR if this is the direction you want. - Ship the extension prebuilt in the wheels.
- Replace cppimport, as the TODO in
extensions.pysuggests.
Two related points:
- cppimport removes its temporary build directory only when the build succeeds (
build_module()callsshutil.rmtreeaftersetuptools.setup(), not in afinally). Today a failed build ends the process instead, because setuptools raisesSystemExit, whichextensions.pydoesn't catch; I'm opening a pull request for that, which will reference this issue. Once it doesn't, every process whose build fails leaves a directory in$TMPDIR. A fix belongs in cppimport; ModelOpt could also pointtempfile.tempdirat a directory it removes while cppimport runs. - I haven't measured how much faster packing is with the extension than with the fallback. If the difference is small, a quiet fallback may be the better fix.
Who can help?
- ?
System information
- Container used (if applicable): none; the Nixpkgs build sandbox
- OS (e.g., Ubuntu 22.04, CentOS 7, Windows 10): NixOS (Linux)
- CPU architecture (x86_64, aarch64): x86_64
- GPU name (e.g. H100, A100, L40S): none needed
- Library versions (if applicable):
- Python: 3.14.8
- ModelOpt version or commit hash: 0.47.0, and main at efda42cd
- PyTorch: 2.14.1
- ONNXRuntime: 1.27.1
- Any other details that may help: seen while packaging ModelOpt for Nixpkgs (NixOS/nixpkgs#577198), where the package is installed read-only and the extension is now prebuilt at package build time. cppimport 26.04.17.
AI disclosure: this report and the tested change it mentions were produced with Claude Code (Claude Opus 5.5).
🤖 Generated with Claude Code
- Lenguaje dominante
- Python
- Estrellas
- 5.5k
- Forks
- 785
- Merge medio
- 3 d 22 h
- PR fusionados (30 d)
- 277
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de NVIDIA/Model-Optimizer
-
[Bug] modelopt-mcp: all launcher subprocesses hang when the server runs as a stdio MCP server — missing stdin=DEVNULLPosiblemente ocupada @ChenhanYu la tomó hace 30 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
NVIDIA/Model-Optimizer#2551 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
Puzzletron Progress 6/8 (calculating one block scores) takes 10 to 20 times more than in tutorialQuizá libre de nuevo @tejasng053 la tomó hace 37 días y no hay ningún pull request abierto. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
NVIDIA/Model-Optimizer#1667 ·
Los mantenedores suelen responder en 2 días
-
[Puzzletron] Runtime stats benchmark model computes head size as hidden_size // num_attention_heads instead of reading head_dimPosiblemente ocupada @grzegorz-k-karch la tomó hace 6 días. Abiertobug
NVIDIA/Model-Optimizer#3016 · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
feature request
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
NVIDIA/Model-Optimizer#2865 ·
Los mantenedores suelen responder en 2 días
-
GGML fake-quant keeps stale codes after a bitsandbytes optimizer step, so QAT/QAD silently stops training the quantized weightsPosiblemente ocupada @cjluo-nv la tomó hace 3 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 54/100
NVIDIA/Model-Optimizer#2857 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de NVIDIA/Model-Optimizer
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
btclib-org/btclib-node#2198 ·
Los mantenedores suelen responder en 1 día
-
Remove the em dashes from the skill smart-account referencePosiblemente ocupada @Vamsi-2581 la tomó hoy. Abiertoagent-ready area: docs documentation good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Soneso/stellar-agent-wallet#541 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
sususweet/midea_auto_cloud#285 ·
Los mantenedores suelen responder en 1 día
-
2026-11 documentation good first issue gsoc-2027 project: gsoc
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
alphaonelabs/website#1154 · 1 comentario ·
Los mantenedores suelen responder en 1 día