diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 39982b343d0..fa9653e4b68 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -111,7 +111,7 @@ RUN touch /bin/nvidia-smi && \ # sees nlopt as already satisfied and skips the from-source rebuild that would fail. RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ - ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel numpy && \ + ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel "numpy!=2.3.5" && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation nlopt==2.6.2; \ fi diff --git a/docker/Dockerfile.curobo b/docker/Dockerfile.curobo index 7f684251b8e..5f9ff5350e9 100644 --- a/docker/Dockerfile.curobo +++ b/docker/Dockerfile.curobo @@ -159,7 +159,7 @@ RUN rm -rf ${ISAACSIM_ROOT_PATH}/kit/python/lib/python3.12/site-packages/pip* && # sees nlopt as already satisfied and skips the from-source rebuild that would fail. RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ - ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel numpy && \ + ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel "numpy!=2.3.5" && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation nlopt==2.6.2; \ fi @@ -171,11 +171,16 @@ RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ # HACK: Uninstall quadprog as it causes issues with some reinforcement learning frameworks RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog -# Install cuRobo from source (pinned commit); needs CUDA env and Torch +# Install cuRobo from source (pinned commit); needs CUDA env and Torch. +# ``numpy!=2.3.5`` is passed so this resolve cannot land on the broken numpy 2.3.5 +# release if any of nvidia-curobo's deps drag numpy back down (cmeel-boost cap). +# See ``source/isaaclab/setup.py``. RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation \ + "numpy!=2.3.5" \ "nvidia-curobo @ git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8" -# Install isaaclab_teleop (needed by Pink IK tests and related env configs) +# Install isaaclab_teleop (needed by Pink IK tests and related env configs). +# isaaclab_teleop's setup.py already excludes numpy 2.3.5; no extra argv needed here. RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --editable ${ISAACLAB_PATH}/source/isaaclab_teleop # aliasing isaaclab.sh and python for convenience diff --git a/source/isaaclab/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..384f4ba110b --- /dev/null +++ b/source/isaaclab/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,20 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from every install path that pulls + numpy. ``numpy 2.3.5``'s vendored OpenBLAS + (``libscipy_openblas64_-fdde5778.so``) registers a buggy ``pthread_atfork`` + handler that crashes Kit's ``libomni.platforminfo`` ``fork()`` during + ``SimulationApp`` startup. The exclusion is declared at every site: + + * Each ``source//setup.py`` that depends on numpy directly or + transitively (``isaaclab``, ``isaaclab_tasks``, ``isaaclab_rl``, + ``isaaclab_visualizers``, ``isaaclab_teleop``, ``isaaclab_mimic``). + * The ``pin-pink`` force-reinstall in + :meth:`isaaclab.cli.commands.install._ensure_pink_ik_dependencies_installed`. + * The ARM ``setuptools wheel numpy`` pre-install in + :meth:`isaaclab.cli.commands.install._maybe_preinstall_arm_nlopt`. + * The ARM nlopt prep step in ``docker/Dockerfile.base``. + * The ``nvidia-curobo`` install in ``docker/Dockerfile.curobo``. + + See numpy/numpy#30092 and OMPE-92261. diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index 90fa929b69e..d2fcdc2b3a5 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -135,7 +135,7 @@ def _maybe_preinstall_arm_nlopt(pip_cmd: list[str]) -> None: return print_info("Pre-installing nlopt==2.6.2 on ARM (no-build-isolation)...") print_info(" step 1/2: ensure setuptools/wheel/numpy are importable for the no-build-isolation backend") - run_command(pip_cmd + ["install", "setuptools", "wheel", "numpy"]) + run_command(pip_cmd + ["install", "setuptools", "wheel", "numpy!=2.3.5"]) print_info(" step 2/2: install nlopt==2.6.2 with --no-build-isolation") run_command(pip_cmd + ["install", "--no-build-isolation", "nlopt==2.6.2"]) @@ -213,8 +213,12 @@ def _ensure_pink_ik_dependencies_installed(python_exe: str, pip_cmd: list[str], return print_info("Pink IK dependency probe failed. Force-installing the cmeel pinocchio and DAQP stack.") + # Pass ``numpy!=2.3.5`` so this fresh resolve (which sees only pin-pink's deps + # plus cmeel-boost's ``numpy<2.4`` cap) cannot land on the broken numpy 2.3.5 + # release. See numpy/numpy#30092 and the rationale in + # :file:`source/isaaclab/setup.py`. install_result = run_command( - pip_cmd + ["install", "--upgrade", "--force-reinstall", *_PINK_IK_STACK], + pip_cmd + ["install", "--upgrade", "--force-reinstall", "numpy!=2.3.5", *_PINK_IK_STACK], check=False, ) if install_result.returncode != 0: diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index bc64609de3f..2e6b43e58d5 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -18,7 +18,13 @@ # Minimum dependencies required prior to installation INSTALL_REQUIRES = [ # generic - "numpy>=2", + # numpy 2.3.5 ships a vendored OpenBLAS whose ``pthread_atfork`` handler crashes + # Kit's ``libomni.platforminfo`` ``fork()`` during ``SimulationApp`` startup. + # The exclusion is declared at every install site that pulls numpy (this + # setup.py, the other source/* setup.py files, the pin-pink force-reinstall in + # ``isaaclab.cli.commands.install``, and the standalone ``pip install`` lines in + # docker/Dockerfile.*). See numpy/numpy#30092 and OMPE-92261. + "numpy>=2,!=2.3.5", "torch>=2.10", "onnx>=1.18.0", # 1.16.2 throws access violation on Windows "prettytable==3.3.0", diff --git a/source/isaaclab_mimic/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab_mimic/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..12d6a554993 --- /dev/null +++ b/source/isaaclab_mimic/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,7 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from the package's install + requirements. ``isaaclab_mimic`` pulls numpy transitively via ``h5py``; an + explicit exclusion keeps the broken 2.3.5 out of resolves that depend on + this package. See ``source/isaaclab/setup.py`` for the full rationale. diff --git a/source/isaaclab_mimic/setup.py b/source/isaaclab_mimic/setup.py index 7b1aa19f6b7..00481dffdf7 100644 --- a/source/isaaclab_mimic/setup.py +++ b/source/isaaclab_mimic/setup.py @@ -23,6 +23,9 @@ "ipywidgets==8.1.5", # data collection "h5py==3.15.1", + # h5py pulls numpy; without the exclusion the resolve can land on the broken + # 2.3.5. See ``source/isaaclab/setup.py``. + "numpy!=2.3.5", ] # nvidia-srl-usd-to-urdf depends on usd-core which has no aarch64 wheels diff --git a/source/isaaclab_rl/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab_rl/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..41b6f5c9a41 --- /dev/null +++ b/source/isaaclab_rl/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,8 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from the package's install requirements. + ``numpy 2.3.5``'s vendored OpenBLAS registers a ``pthread_atfork`` handler that + crashes Kit's ``libomni.platforminfo`` ``fork()`` during ``SimulationApp`` startup. + See ``source/isaaclab/setup.py`` and ``isaaclab.cli.commands.install`` for the + authoritative install-time defense. diff --git a/source/isaaclab_rl/setup.py b/source/isaaclab_rl/setup.py index 53255aa55b4..094592b9077 100644 --- a/source/isaaclab_rl/setup.py +++ b/source/isaaclab_rl/setup.py @@ -19,7 +19,8 @@ # Minimum dependencies required prior to installation INSTALL_REQUIRES = [ # generic - "numpy", + # See ``source/isaaclab/setup.py`` for the rationale on ``!=2.3.5``. + "numpy!=2.3.5", "torch>=2.10", "torchvision>=0.25.0", # ensure compatibility with torch 2.10.0 "protobuf>=4.25.8,!=5.26.0", diff --git a/source/isaaclab_tasks/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab_tasks/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..41b6f5c9a41 --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,8 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from the package's install requirements. + ``numpy 2.3.5``'s vendored OpenBLAS registers a ``pthread_atfork`` handler that + crashes Kit's ``libomni.platforminfo`` ``fork()`` during ``SimulationApp`` startup. + See ``source/isaaclab/setup.py`` and ``isaaclab.cli.commands.install`` for the + authoritative install-time defense. diff --git a/source/isaaclab_tasks/setup.py b/source/isaaclab_tasks/setup.py index a719231ca98..fe06c5f98a5 100644 --- a/source/isaaclab_tasks/setup.py +++ b/source/isaaclab_tasks/setup.py @@ -18,7 +18,8 @@ # Minimum dependencies required prior to installation INSTALL_REQUIRES = [ # generic - "numpy>=2", + # See ``source/isaaclab/setup.py`` for the rationale on ``!=2.3.5``. + "numpy>=2,!=2.3.5", "torch>=2.10", "torchvision>=0.25.0", # ensure compatibility with torch 2.10.0 "protobuf>=4.25.8,!=5.26.0", diff --git a/source/isaaclab_teleop/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab_teleop/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..8b55d8092db --- /dev/null +++ b/source/isaaclab_teleop/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,8 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from the package's install + requirements. ``isaaclab_teleop`` pulls numpy transitively via + ``dex-retargeting`` -> ``pin`` -> ``cmeel-boost`` (which caps ``numpy<2.4``), + so without an explicit exclusion pip lands on the broken 2.3.5. See + ``source/isaaclab/setup.py`` for the full rationale. diff --git a/source/isaaclab_teleop/setup.py b/source/isaaclab_teleop/setup.py index 7ecec8340ab..ab10b77a03b 100644 --- a/source/isaaclab_teleop/setup.py +++ b/source/isaaclab_teleop/setup.py @@ -23,6 +23,9 @@ f"isaacteleop[retargeters,ui,cloudxr]~=1.2.0 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS})", # required by isaaclab.devices.openxr.retargeters.humanoid.fourier.gr1_t2_dex_retargeting_utils f"dex-retargeting==0.5.0 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS})", + # dex-retargeting pulls ``pin`` (cmeel pinocchio) -> cmeel-boost (``numpy<2.4``); + # without an exclusion here pip lands on numpy 2.3.5. See ``source/isaaclab/setup.py``. + "numpy!=2.3.5", ] # Installation operation diff --git a/source/isaaclab_visualizers/changelog.d/jichuanh-force-numpy-install.rst b/source/isaaclab_visualizers/changelog.d/jichuanh-force-numpy-install.rst new file mode 100644 index 00000000000..41b6f5c9a41 --- /dev/null +++ b/source/isaaclab_visualizers/changelog.d/jichuanh-force-numpy-install.rst @@ -0,0 +1,8 @@ +Fixed +^^^^^ + +* Excluded the broken ``numpy 2.3.5`` release from the package's install requirements. + ``numpy 2.3.5``'s vendored OpenBLAS registers a ``pthread_atfork`` handler that + crashes Kit's ``libomni.platforminfo`` ``fork()`` during ``SimulationApp`` startup. + See ``source/isaaclab/setup.py`` and ``isaaclab.cli.commands.install`` for the + authoritative install-time defense. diff --git a/source/isaaclab_visualizers/setup.py b/source/isaaclab_visualizers/setup.py index a2b2ee093a4..4d041d5a7fc 100644 --- a/source/isaaclab_visualizers/setup.py +++ b/source/isaaclab_visualizers/setup.py @@ -10,7 +10,8 @@ # Base requirements shared across visualizer backends. INSTALL_REQUIRES = [ "isaaclab", - "numpy", + # See ``source/isaaclab/setup.py`` for the rationale on ``!=2.3.5``. + "numpy!=2.3.5", ] # Every Newton declaration in the repo must use the SAME extra spec (`newton[sim]`).