name: wai-quantum service # The WAI quantum stack as a public job service (wai/wai-quantum-service): its # tests, clippy with warnings as errors, and its smoke checks over HTTP against # an instance started here, on Linux and on the macOS runner (the host the # service is deployed to). concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: [main] paths: - 'wai/wai-quantum/**' - 'wai/wai-quantum-service/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-service.yml' pull_request: paths: - 'wai/wai-quantum/**' - 'wai/wai-quantum-service/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-service.yml' jobs: relevant: name: does this change touch it runs-on: linux-arm64 outputs: run: ${{ steps.gate.outputs.run }} steps: - uses: actions/checkout@v5 with: fetch-depth: 0 - id: gate run: | set -euo pipefail r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-service.yml \ "${{ github.event.pull_request.base.sha }}" \ "${{ github.event.pull_request.head.sha }}") echo "this change touches wai-quantum-service: $r" echo "run=$r" >> "$GITHUB_OUTPUT" service-linux: name: service · linux needs: relevant if: needs.relevant.outputs.run == 'true' runs-on: linux timeout-minutes: 60 steps: - uses: actions/checkout@v5 - name: Install Rust 1.98.0 shell: bash run: | export PATH="$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0 rustup toolchain install 1.98.0 --profile minimal --component clippy rustup default 1.98.0 echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: Tests and clippy shell: bash working-directory: wai/wai-quantum-service run: | set -euo pipefail cargo test --locked --release 2>&1 | tee "$RUNNER_TEMP/test.log" grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/test.log" || { echo "::error::no test ran"; exit 1; } cargo clippy --locked --release --all-targets -- -D warnings - name: The smoke checks over HTTP shell: bash working-directory: wai/wai-quantum-service run: | set -euo pipefail key="$RUNNER_TEMP/service.key"; rm -f "$key" cargo build --locked --release WAI_QSVC_KEY="$key" WAI_QSVC_ADDR=127.0.0.1:18241 WAI_QSVC_BUDGET_GB=8 WAI_QSVC_JOB_GB=4 WAI_QSVC_WORKERS=2 \ ./target/release/wai-quantum-service serve 2> "$RUNNER_TEMP/service.log" & pid=$! trap 'kill $pid 2>/dev/null || true; cat "$RUNNER_TEMP/service.log"' EXIT for _ in $(seq 1 50); do curl -s -o /dev/null http://127.0.0.1:18241/v1/health && break; sleep 0.2; done bash smoke.sh http://127.0.0.1:18241 service-macos: name: service · macos needs: relevant if: needs.relevant.outputs.run == 'true' runs-on: macos timeout-minutes: 60 steps: - uses: actions/checkout@v5 # launchd's PATH omits cargo on the macOS host runner. - name: Put cargo on PATH shell: bash run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: Tests shell: bash working-directory: wai/wai-quantum-service run: | set -euo pipefail nice -n 10 cargo test --locked --release 2>&1 | tee "$RUNNER_TEMP/test.log" grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/test.log" || { echo "::error::no test ran"; exit 1; } # The single-precision state vector on this host's GPU, against the # double-precision one; the GPU is declared, so its absence fails. - name: The GPU state vector shell: bash working-directory: wai/wai-quantum env: WAI_QUANTUM_SV_METAL_EXPECT: "1" run: | set -euo pipefail nice -n 10 cargo test --locked --release --features quantum_sv_metal --lib quantum_sv_metal 2>&1 | tee "$RUNNER_TEMP/gpu.log" grep -qE '^test result: ok\. 4 passed; 0 failed' "$RUNNER_TEMP/gpu.log" || { echo "::error::not every GPU test ran and passed"; exit 1; } # The cut-rank table on this host's GPU, against the double-precision # walk; the GPU is declared, so its absence fails, and each GPU test is # checked by name. - name: The GPU cut-rank table shell: bash working-directory: wai/wai-quantum env: WAI_QUANTUM_CUTRANK_METAL_EXPECT: "1" run: | set -euo pipefail nice -n 10 cargo test --locked --release --features quantum_cutrank_metal --lib quantum_cutrank 2>&1 | tee "$RUNNER_TEMP/cutrank-gpu.log" for t in the_gpu_table_agrees gpu_samples_follow_the_probabilities; do grep -q "^test quantum_cutrank::tests::$t ... ok$" "$RUNNER_TEMP/cutrank-gpu.log" \ || { echo "::error::quantum_cutrank::tests::$t did not run and pass"; exit 1; } done - name: The smoke checks over HTTP shell: bash working-directory: wai/wai-quantum-service run: | set -euo pipefail key="$RUNNER_TEMP/service.key"; rm -f "$key" cargo build --locked --release WAI_QSVC_KEY="$key" WAI_QSVC_ADDR=127.0.0.1:18241 WAI_QSVC_BUDGET_GB=8 WAI_QSVC_JOB_GB=4 WAI_QSVC_WORKERS=2 \ ./target/release/wai-quantum-service serve 2> "$RUNNER_TEMP/service.log" & pid=$! trap 'kill $pid 2>/dev/null || true; cat "$RUNNER_TEMP/service.log"' EXIT for _ in $(seq 1 50); do curl -s -o /dev/null http://127.0.0.1:18241/v1/health && break; sleep 0.2; done bash smoke.sh http://127.0.0.1:18241