# Copyright 2026 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Benchmark image for RoboMME integration tests. # Extends the nightly GPU image (which has lerobot[all]) with Vulkan system # libs for ManiSkill/SAPIEN and the robomme extra. robomme isn't in [all] # because mani-skill hard-pins gymnasium==0.29.1 and numpy<2.0.0 which # conflict with lerobot's defaults; both are safe at runtime: # - gymnasium 0.29.x has the same 5-tuple step() API as 1.x (since 0.26) # - numpy 1.26.4 is API-compatible with lerobot's actual usage. # # Build: docker build -f docker/Dockerfile.benchmark.robomme -t lerobot-benchmark-robomme . # Run: docker run --gpus all --rm lerobot-benchmark-robomme lerobot-eval ... FROM huggingface/lerobot-gpu:latest # NVIDIA Container Toolkit: expose Vulkan driver capability for headless rendering. ENV NVIDIA_DRIVER_CAPABILITIES=all \ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json # ManiSkill/SAPIEN's renderer needs Vulkan, which isn't in the base image. USER root RUN apt-get update \ && apt-get install -y --no-install-recommends \ libvulkan1 libvulkan-dev mesa-vulkan-drivers \ && mkdir -p /usr/share/vulkan/icd.d \ && echo '{"file_format_version":"1.0.0","ICD":{"library_path":"libGLX_nvidia.so.0","api_version":"1.3.0"}}' \ > /usr/share/vulkan/icd.d/nvidia_icd.json \ && apt-get clean && rm -rf /var/lib/apt/lists/* USER user_lerobot # Install smolvla + av-dep via the PR's pyproject, then layer robomme on top # with gymnasium/numpy overrides. robomme isn't a pyproject extra because its # mani-skill pin conflicts with lerobot's base numpy>=2 (see pyproject.toml). COPY --chown=user_lerobot:user_lerobot setup.py pyproject.toml uv.lock README.md MANIFEST.in ./ RUN printf 'gymnasium==0.29.1\nnumpy==1.26.4\n' > /tmp/robomme_override.txt \ && uv pip install --no-cache --override /tmp/robomme_override.txt \ -e ".[smolvla,av-dep]" \ "robomme @ git+https://github.com/RoboMME/robomme_benchmark.git@main" \ && python -c "import robomme; print('robomme import OK')" # Overlay the PR's source code on top of the nightly image. COPY --chown=user_lerobot:user_lerobot . . CMD ["/bin/bash"]