| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| name: Docker Publish & Test |
| permissions: |
| contents: read |
|
|
| on: |
| |
| workflow_dispatch: |
|
|
| |
| schedule: |
| - cron: "0 2 * * *" |
|
|
| |
| env: |
| UV_VERSION: "0.8.0" |
| PYTHON_VERSION: "3.12" |
| DOCKER_IMAGE_NAME_CPU: huggingface/lerobot-cpu:latest |
| DOCKER_IMAGE_NAME_GPU: huggingface/lerobot-gpu:latest |
|
|
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} |
| cancel-in-progress: true |
|
|
| jobs: |
| |
| build-docker-cpu: |
| name: Build CPU Docker |
| runs-on: |
| group: aws-general-8-plus |
| if: github.repository == 'huggingface/lerobot' |
| outputs: |
| image_tag: ${{ env.DOCKER_IMAGE_NAME_CPU }} |
| steps: |
| - name: Install Git LFS |
| run: | |
| sudo apt-get update |
| sudo apt-get install git-lfs |
| git lfs install |
| - uses: actions/checkout@v6 |
| with: |
| lfs: true |
| persist-credentials: false |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v3 |
| with: |
| cache-binary: false |
| - name: Login to Docker Hub |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ secrets.DOCKERHUB_LEROBOT_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_LEROBOT_PASSWORD }} |
| - name: Build and push Docker image CPU |
| uses: docker/build-push-action@v6 |
| with: |
| context: . |
| file: ./docker/Dockerfile.user |
| push: true |
| tags: ${{ env.DOCKER_IMAGE_NAME_CPU }} |
|
|
| |
| build-docker-gpu: |
| name: Build GPU Docker |
| runs-on: |
| group: aws-general-8-plus |
| if: github.repository == 'huggingface/lerobot' |
| outputs: |
| image_tag: ${{ env.DOCKER_IMAGE_NAME_GPU }} |
| steps: |
| - name: Install Git LFS |
| run: | |
| sudo apt-get update |
| sudo apt-get install git-lfs |
| git lfs install |
| - uses: actions/checkout@v6 |
| with: |
| lfs: true |
| persist-credentials: false |
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v3 |
| with: |
| cache-binary: false |
| - name: Login to Docker Hub |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ secrets.DOCKERHUB_LEROBOT_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_LEROBOT_PASSWORD }} |
| - name: Build and push Docker image GPU |
| uses: docker/build-push-action@v6 |
| with: |
| context: . |
| file: ./docker/Dockerfile.internal |
| push: true |
| tags: ${{ env.DOCKER_IMAGE_NAME_GPU }} |
|
|
| |
| cpu-tests: |
| name: CPU Tests |
| needs: [build-docker-cpu] |
| runs-on: |
| group: aws-g6-4xlarge-plus |
| env: |
| HF_HOME: /home/user_lerobot/.cache/huggingface |
| HF_LEROBOT_HOME: /home/user_lerobot/.cache/huggingface/lerobot |
| TORCH_HOME: /home/user_lerobot/.cache/torch |
| TRITON_CACHE_DIR: /home/user_lerobot/.cache/triton |
| HF_USER_TOKEN: ${{ secrets.LEROBOT_HF_USER }} |
| container: |
| image: ${{ needs.build-docker-cpu.outputs.image_tag }} |
| options: --shm-size "16gb" |
| credentials: |
| username: ${{ secrets.DOCKERHUB_LEROBOT_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_LEROBOT_PASSWORD }} |
| defaults: |
| run: |
| shell: bash |
| working-directory: /lerobot |
| steps: |
| - name: Login to Hugging Face |
| if: env.HF_USER_TOKEN != '' |
| run: | |
| hf auth login --token "$HF_USER_TOKEN" --add-to-git-credential |
| hf auth whoami |
| - name: Run pytest on CPU |
| run: pytest tests -vv --maxfail=10 |
| - name: Run end-to-end tests |
| run: make test-end-to-end |
|
|
| |
| gpu-tests: |
| name: GPU Tests |
| needs: [build-docker-gpu] |
| runs-on: |
| group: aws-g6-4xlarge-plus |
| env: |
| HF_HOME: /home/user_lerobot/.cache/huggingface |
| HF_LEROBOT_HOME: /home/user_lerobot/.cache/huggingface/lerobot |
| TORCH_HOME: /home/user_lerobot/.cache/torch |
| TRITON_CACHE_DIR: /home/user_lerobot/.cache/triton |
| HF_USER_TOKEN: ${{ secrets.LEROBOT_HF_USER }} |
| container: |
| image: ${{ needs.build-docker-gpu.outputs.image_tag }} |
| options: --gpus all --shm-size "16gb" |
| credentials: |
| username: ${{ secrets.DOCKERHUB_LEROBOT_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_LEROBOT_PASSWORD }} |
| defaults: |
| run: |
| shell: bash |
| working-directory: /lerobot |
| steps: |
| - name: Login to Hugging Face |
| if: env.HF_USER_TOKEN != '' |
| run: | |
| hf auth login --token "$HF_USER_TOKEN" --add-to-git-credential |
| hf auth whoami |
| - name: Run pytest on GPU |
| run: pytest tests -vv --maxfail=10 |
| - name: Run end-to-end tests |
| run: make test-end-to-end |
|
|
| |
| multi-gpu-tests: |
| name: Multi-GPU Tests |
| needs: [build-docker-gpu] |
| runs-on: |
| group: aws-g4dn-12xlarge |
| env: |
| HF_HOME: /home/user_lerobot/.cache/huggingface |
| HF_LEROBOT_HOME: /home/user_lerobot/.cache/huggingface/lerobot |
| TORCH_HOME: /home/user_lerobot/.cache/torch |
| TRITON_CACHE_DIR: /home/user_lerobot/.cache/triton |
| CUDA_VISIBLE_DEVICES: "0,1,2,3" |
| HF_USER_TOKEN: ${{ secrets.LEROBOT_HF_USER }} |
| container: |
| image: ${{ needs.build-docker-gpu.outputs.image_tag }} |
| options: --gpus all --shm-size "16gb" |
| credentials: |
| username: ${{ secrets.DOCKERHUB_LEROBOT_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_LEROBOT_PASSWORD }} |
| defaults: |
| run: |
| shell: bash |
| working-directory: /lerobot |
| steps: |
| - name: Login to Hugging Face |
| if: env.HF_USER_TOKEN != '' |
| run: | |
| hf auth login --token "$HF_USER_TOKEN" --add-to-git-credential |
| hf auth whoami |
| - name: Verify GPU availability |
| run: | |
| nvidia-smi |
| python -c "import torch; print(f'PyTorch CUDA available: {torch.cuda.is_available()}'); print(f'Number of GPUs: {torch.cuda.device_count()}')" |
| |
| - name: Run multi-GPU training tests |
| run: pytest -vv tests/training/ |
|
|