| # 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"] | |