Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion docker/Dockerfile.base
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
11 changes: 8 additions & 3 deletions docker/Dockerfile.curobo
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand Down
23 changes: 23 additions & 0 deletions source/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

"""Dep-manifest diagnostic: prints numpy version + bundled OpenBLAS hash at pytest session start.

Loaded by pytest when collecting tests under ``source/``. Importing numpy here registers
its vendored OpenBLAS ``pthread_atfork`` handler in pytest's process, which is the same
process that later calls ``fork()`` via ``SimulationApp()``. The output identifies which
numpy + OpenBLAS bundle actually landed in each CI test container.
"""

import os

import numpy

print(f"\n[dep-manifest] numpy {numpy.__version__}", flush=True)
_libs_dir = os.path.join(os.path.dirname(numpy.__file__), os.pardir, "numpy.libs")
if os.path.isdir(_libs_dir):
for _f in sorted(os.listdir(_libs_dir)):
if "openblas" in _f.lower():
print(f"[dep-manifest] bundled openblas: {_f}", flush=True)
20 changes: 20 additions & 0 deletions source/isaaclab/changelog.d/jichuanh-force-numpy-install.rst
Original file line number Diff line number Diff line change
@@ -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/<pkg>/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.
8 changes: 6 additions & 2 deletions source/isaaclab/isaaclab/cli/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"])

Expand Down Expand Up @@ -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:
Expand Down
8 changes: 7 additions & 1 deletion source/isaaclab/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 3 additions & 0 deletions source/isaaclab_mimic/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 2 additions & 1 deletion source/isaaclab_rl/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 2 additions & 1 deletion source/isaaclab_tasks/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 3 additions & 0 deletions source/isaaclab_teleop/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
f"isaacteleop[retargeters,ui,cloudxr]~=1.3.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
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
3 changes: 2 additions & 1 deletion source/isaaclab_visualizers/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]`).
Expand Down
Loading