【No.10】feat(deepeyes): add configurable search backends #113
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: GPU Integration Tests | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: gpu-integration-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| integration: | |
| name: ${{ matrix.case }} | |
| runs-on: [self-hosted, linux, x64, h20, gpu] | |
| timeout-minutes: 65 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - case: Qwen3-4B-4xgpu-async | |
| script: scripts/training/text/run-qwen3-4B-4xgpu-async.sh | |
| gpus: 4 | |
| - case: Qwen3-VL-4B-2xgpu | |
| script: scripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh | |
| gpus: 2 | |
| env: | |
| CI_IMAGE: ghcr.io/redai-studio/relaxrl:latest | |
| CI_CONTAINER_NAME: relax-integration-${{ github.run_id }}-${{ github.run_attempt }}-${{ strategy.job-index }} | |
| TRAINING_SCRIPT: ${{ matrix.script }} | |
| ARTIFACT_NAME: integration-${{ matrix.case }}-${{ github.run_id }}-${{ github.run_attempt }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v7 | |
| with: | |
| persist-credentials: false | |
| - name: Acquire test devices | |
| id: devices | |
| uses: ./.github/actions/acquire-devices | |
| timeout-minutes: 35 | |
| with: | |
| backend: nvidia | |
| count: ${{ matrix.gpus }} | |
| timeout: 1800 | |
| - name: Create test container | |
| env: | |
| CI_DEVICES: ${{ steps.devices.outputs.devices }} | |
| NUM_GPUS: ${{ matrix.gpus }} | |
| UV_CACHE_DIR: /uv-cache | |
| UV_LINK_MODE: copy | |
| ARTIFACT_DIR: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} | |
| run: | | |
| set -euo pipefail | |
| HOST_UV_CACHE_DIR="$HOME/.cache/uv" | |
| mkdir -p "$HOST_UV_CACHE_DIR" "$ARTIFACT_DIR" | |
| # Each runner provisions the cases' model and dataset files in ~/model and ~/data. | |
| # Keep Ray processes, network, IPC and /tmp private to this container. | |
| docker create --pull always --rm --init \ | |
| --name "$CI_CONTAINER_NAME" \ | |
| --gpus "\"device=$CI_DEVICES\"" \ | |
| --shm-size=32g \ | |
| -v "$GITHUB_WORKSPACE:/source:ro" \ | |
| -v "$ARTIFACT_DIR:/artifacts" \ | |
| -v "$HOST_UV_CACHE_DIR:$UV_CACHE_DIR" \ | |
| --mount "type=bind,source=$HOME/model,target=/models,readonly" \ | |
| --mount "type=bind,source=$HOME/data,target=/data,readonly" \ | |
| --workdir /workspace/Relax \ | |
| --env NUM_GPUS \ | |
| --env NUM_ROLLOUT=4 \ | |
| --env MODEL_DIR=/models \ | |
| --env DATA_DIR=/data \ | |
| --env EXP_DIR=/artifacts \ | |
| --env CLEARML_OFFLINE_MODE=1 \ | |
| --env UV_CACHE_DIR \ | |
| --env UV_LINK_MODE \ | |
| --env http_proxy \ | |
| --env https_proxy \ | |
| --env no_proxy \ | |
| --entrypoint /bin/bash "$CI_IMAGE" -c 'sleep infinity' | |
| docker inspect --format 'Test image: {{.Config.Image}} ({{.Image}})' "$CI_CONTAINER_NAME" | |
| docker start "$CI_CONTAINER_NAME" | |
| - name: Prepare workspace and show GPUs | |
| run: | | |
| docker exec "$CI_CONTAINER_NAME" bash -euc ' | |
| cp -a --no-preserve=ownership /source/. /workspace/Relax/ | |
| nvidia-smi | |
| ' | |
| - name: Install dependencies | |
| run: | | |
| docker exec "$CI_CONTAINER_NAME" uv pip install \ | |
| --system --break-system-packages -r requirements.txt \ | |
| --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple | |
| - name: Run integration test | |
| timeout-minutes: 25 | |
| run: | | |
| docker exec --env TRAINING_SCRIPT "$CI_CONTAINER_NAME" bash -euo pipefail -c ' | |
| unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY | |
| unset RAY_NO_WAIT RAY_ADDRESS RELAX_ENTRYPOINT_MODE | |
| export no_proxy="*" NO_PROXY="*" | |
| bash "$TRAINING_SCRIPT" 2>&1 | tee /artifacts/training.log | |
| ' | |
| - name: Collect Ray logs | |
| if: always() | |
| env: | |
| ARTIFACT_DIR: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }} | |
| run: | | |
| mkdir -p "$ARTIFACT_DIR/ray" | |
| docker cp "$CI_CONTAINER_NAME:/tmp/ray/session_latest/logs/." "$ARTIFACT_DIR/ray/" || true | |
| - name: Remove test container | |
| if: always() | |
| run: | | |
| if docker inspect "$CI_CONTAINER_NAME" >/dev/null 2>&1; then | |
| docker rm --force "$CI_CONTAINER_NAME" | |
| fi | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ env.ARTIFACT_NAME }} | |
| path: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}/ | |
| if-no-files-found: warn | |
| retention-days: 14 |