Skip to content

Commit efcd2e0

Browse files
committed
[CI] Fix libs
ghstack-source-id: e7f383e Pull-Request: #3203
1 parent bd93f13 commit efcd2e0

File tree

5 files changed

+75
-24
lines changed

5 files changed

+75
-24
lines changed

.github/unittest/linux_libs/scripts_isaaclab/isaac.sh

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export TF_CPP_MIN_LOG_LEVEL=0
2020
export BATCHED_PIPE_TIMEOUT=60
2121
export TD_GET_DEFAULTS_TO_NONE=1
2222
export OMNI_KIT_ACCEPT_EULA=yes
23+
export PIP_DISABLE_PIP_VERSION_CHECK=1
24+
export PYTHONNOUSERSITE=1
2325

2426
nvidia-smi
2527

@@ -46,36 +48,62 @@ eval "$(${conda_dir}/bin/conda shell.bash hook)"
4648
conda create --prefix ${env_dir} python=3.10 -y
4749
conda activate ${env_dir}
4850

51+
# Set LD_LIBRARY_PATH to prioritize conda environment libraries early
52+
export LD_LIBRARY_PATH=${lib_dir}:${LD_LIBRARY_PATH:-}
53+
54+
# Ensure libexpat is at the correct version BEFORE installing other packages
55+
conda install -c conda-forge expat -y
56+
57+
# Force the loader to pick conda's libexpat over the system one
58+
if [ -f "${lib_dir}/libexpat.so.1" ]; then
59+
export LD_PRELOAD="${lib_dir}/libexpat.so.1:${LD_PRELOAD:-}"
60+
elif [ -f "${lib_dir}/libexpat.so" ]; then
61+
export LD_PRELOAD="${lib_dir}/libexpat.so:${LD_PRELOAD:-}"
62+
fi
63+
64+
# Quick diagnostic to confirm which expat is resolved by pyexpat
65+
PYEXPAT_SO=$(python - <<'PY'
66+
import importlib.util
67+
spec = importlib.util.find_spec('pyexpat')
68+
print(spec.origin)
69+
PY
70+
)
71+
echo "* pyexpat module: ${PYEXPAT_SO}"
72+
ldd "${PYEXPAT_SO}" | grep -i expat || true
73+
74+
# Reinstall Python to ensure it links against the correct expat
75+
conda install --force-reinstall python=3.10 -y
76+
4977
# Pin pytorch to 2.5.1 for IsaacLab
5078
conda install pytorch==2.5.1 torchvision==0.20.1 pytorch-cuda=12.4 -c pytorch -c nvidia -y
5179

52-
conda run -p ${env_dir} pip install --upgrade pip
53-
conda run -p ${env_dir} pip install 'isaacsim[all,extscache]==4.5.0' --extra-index-url https://pypi.nvidia.com
80+
python -m pip install --upgrade pip --disable-pip-version-check
81+
python -m pip install 'isaacsim[all,extscache]==4.5.0' --extra-index-url https://pypi.nvidia.com --disable-pip-version-check
5482
conda install conda-forge::"cmake>3.22" -y
5583

5684
git clone https://github.com/isaac-sim/IsaacLab.git
5785
cd IsaacLab
58-
conda run -p ${env_dir} ./isaaclab.sh --install sb3
86+
./isaaclab.sh --install sb3
5987
cd ../
6088

6189
# install tensordict
6290
if [[ "$RELEASE" == 0 ]]; then
6391
conda install "anaconda::cmake>=3.22" -y
64-
conda run -p ${env_dir} python -m pip install "pybind11[global]"
65-
conda run -p ${env_dir} python -m pip install git+https://github.com/pytorch/tensordict.git
92+
python -m pip install "pybind11[global]" --disable-pip-version-check
93+
python -m pip install git+https://github.com/pytorch/tensordict.git --disable-pip-version-check
6694
else
67-
conda run -p ${env_dir} python -m pip install tensordict
95+
python -m pip install tensordict --disable-pip-version-check
6896
fi
6997

7098
# smoke test
71-
conda run -p ${env_dir} python -c "import tensordict"
99+
python -c "import tensordict"
72100

73101
printf "* Installing torchrl\n"
74-
conda run -p ${env_dir} python -m pip install -e . --no-build-isolation
75-
conda run -p ${env_dir} python -c "import torchrl"
102+
python -m pip install -e . --no-build-isolation --disable-pip-version-check
103+
python -c "import torchrl"
76104

77105
# Install pytest
78-
conda run -p ${env_dir} python -m pip install pytest pytest-cov pytest-mock pytest-instafail pytest-rerunfailures pytest-error-for-skips pytest-asyncio
106+
python -m pip install pytest pytest-cov pytest-mock pytest-instafail pytest-rerunfailures pytest-error-for-skips pytest-asyncio --disable-pip-version-check
79107

80108
# Run tests
81-
conda run -p ${env_dir} python -m pytest test/test_libs.py -k isaac -s
109+
python -m pytest test/test_libs.py -k isaac -s

.github/unittest/linux_libs/scripts_minari/environment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ dependencies:
2525
- gymnasium-robotics
2626
- minari[create]
2727
- jax>=0.7.0
28-
- mujoco<3.3.6
28+
- mujoco>=2.3.0,<3.0.0
2929
- mujoco-py<2.2,>=2.1
3030
- minigrid

.github/workflows/test-linux-libs.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ jobs:
156156
export BATCHED_PIPE_TIMEOUT=60
157157
export TD_GET_DEFAULTS_TO_NONE=1
158158
159-
bash .github/unittest/linux_libs/scripts_d4rl/setup_env.sh
160-
bash .github/unittest/linux_libs/scripts_d4rl/install.sh
161-
bash .github/unittest/linux_libs/scripts_d4rl/run_test.sh
162-
bash .github/unittest/linux_libs/scripts_d4rl/post_process.sh
159+
bash .github/unittest/linux_libs/scripts_envpool/setup_env.sh
160+
bash .github/unittest/linux_libs/scripts_envpool/install.sh
161+
bash .github/unittest/linux_libs/scripts_envpool/run_test.sh
162+
bash .github/unittest/linux_libs/scripts_envpool/post_process.sh
163163
164164
unittests-gendgrl:
165165
strategy:

test/test_libs.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
from torchrl.data.datasets.roboset import RobosetExperienceReplay
7474
from torchrl.data.datasets.vd4rl import VD4RLExperienceReplay
7575
from torchrl.data.replay_buffers import SamplerWithoutReplacement
76+
from torchrl.data.replay_buffers.samplers import SliceSampler
77+
from torchrl.data.replay_buffers.storages import LazyTensorStorage
7678
from torchrl.data.utils import CloudpickleWrapper
7779
from torchrl.envs import (
7880
CatTensors,
@@ -82,6 +84,7 @@
8284
EnvCreator,
8385
RemoveEmptySpecs,
8486
RenameTransform,
87+
StepCounter,
8588
)
8689
from torchrl.envs.batched_envs import SerialEnv
8790
from torchrl.envs.libs.brax import _has_brax, BraxEnv, BraxWrapper
@@ -2790,7 +2793,6 @@ class TestVmas:
27902793
@pytest.mark.parametrize("scenario_name", VmasWrapper.available_envs)
27912794
@pytest.mark.parametrize("continuous_actions", [True, False])
27922795
def test_all_vmas_scenarios(self, scenario_name, continuous_actions):
2793-
27942796
env = VmasEnv(
27952797
scenario=scenario_name,
27962798
continuous_actions=continuous_actions,
@@ -3455,12 +3457,16 @@ def test_d4rl_dummy(self, task):
34553457
@pytest.mark.parametrize("split_trajs", [True, False])
34563458
@pytest.mark.parametrize("from_env", [True, False])
34573459
def test_dataset_build(self, task, split_trajs, from_env):
3460+
import d4rl # noqa: F401
3461+
34583462
t0 = time.time()
34593463
data = D4RLExperienceReplay(
34603464
task, split_trajs=split_trajs, from_env=from_env, batch_size=2
34613465
)
34623466
sample = data.sample()
3463-
env = GymWrapper(gym.make(task))
3467+
# D4RL environments are registered with gym, not gymnasium
3468+
with set_gym_backend("gym"):
3469+
env = GymWrapper(gym.make(task))
34643470
rollout = env.rollout(2)
34653471
for key in rollout.keys(True, True):
34663472
if "truncated" in key:
@@ -5144,6 +5150,17 @@ def test_isaaclab(self, env):
51445150
env.check_env_specs(break_when_any_done="both")
51455151
torchrl_logger.info("Check succeeded!")
51465152

5153+
def test_isaaclab_rb(self, env):
5154+
env = env.append_transform(StepCounter())
5155+
rb = ReplayBuffer(
5156+
storage=LazyTensorStorage(50, ndim=2), sampler=SliceSampler(num_slices=5)
5157+
)
5158+
rb.extend(env.rollout(20))
5159+
# check that rb["step_count"].flatten() is made of sequences of 4 consecutive numbers
5160+
flat_ranges = rb["step_count"].flatten() % 4
5161+
arange = torch.arange(flat_ranges.numel(), device=flat_ranges.device) % 4
5162+
assert (flat_ranges == arange).all()
5163+
51475164
def test_isaac_collector(self, env):
51485165
col = SyncDataCollector(
51495166
env, env.rand_action, frames_per_batch=1000, total_frames=100_000_000

torchrl/data/datasets/d4rl.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,16 +267,19 @@ def _get_dataset_direct_download(self, name, env_kwargs):
267267
return dataset
268268

269269
def _get_dataset_direct(self, name, env_kwargs):
270-
from torchrl.envs.libs.gym import GymWrapper
270+
from torchrl.envs.libs.gym import GymWrapper, set_gym_backend
271271

272272
type(self)._import_d4rl()
273273

274274
if not self._has_d4rl:
275275
raise ImportError("Could not import d4rl") from self.D4RL_ERR
276276
import d4rl
277-
import gym
278277

279-
env = GymWrapper(gym.make(name))
278+
# D4RL environments are registered with gym, not gymnasium
279+
# so we need to ensure we're using the gym backend
280+
with set_gym_backend("gym"):
281+
import gym
282+
env = GymWrapper(gym.make(name))
280283
with tempfile.TemporaryDirectory() as tmpdir:
281284
os.environ["D4RL_DATASET_DIR"] = tmpdir
282285
dataset = d4rl.qlearning_dataset(env._env, **env_kwargs)
@@ -346,12 +349,15 @@ def _get_dataset_from_env(self, name, env_kwargs):
346349
"""
347350
if env_kwargs:
348351
raise RuntimeError("env_kwargs cannot be passed with using from_env=True")
349-
import gym
352+
import d4rl # noqa: F401
350353

351354
# we do a local import to avoid circular import issues
352-
from torchrl.envs.libs.gym import GymWrapper
355+
from torchrl.envs.libs.gym import GymWrapper, set_gym_backend
353356

354-
with tempfile.TemporaryDirectory() as tmpdir:
357+
# D4RL environments are registered with gym, not gymnasium
358+
# so we need to ensure we're using the gym backend
359+
with set_gym_backend("gym"), tempfile.TemporaryDirectory() as tmpdir:
360+
import gym
355361
os.environ["D4RL_DATASET_DIR"] = tmpdir
356362
env = GymWrapper(gym.make(name))
357363
dataset = make_tensordict(

0 commit comments

Comments
 (0)