diff --git a/.github/workflows/pr-benchmark-rust.yml b/.github/workflows/pr-benchmark-rust.yml index 0592203ca..c1c6243cc 100644 --- a/.github/workflows/pr-benchmark-rust.yml +++ b/.github/workflows/pr-benchmark-rust.yml @@ -25,7 +25,6 @@ permissions: issues: write jobs: - # Quick check job that always runs on PRs benchmark-compile-check: name: Benchmark Compilation Check runs-on: ubuntu-latest @@ -47,9 +46,7 @@ jobs: uses: Swatinem/rust-cache@v2 with: workspaces: sgl-model-gateway - # Share cache across all benchmark jobs shared-key: "rust-cache" - # Save cache even on failure save-if: true cache-all-crates: true cache-on-failure: true @@ -64,92 +61,47 @@ jobs: if: always() run: sccache --show-stats - # Full benchmark jobs that only run with label or on main branch - benchmark-request-processing: - name: Request Processing Benchmark + benchmark: + name: Benchmark - ${{ matrix.name }} if: | github.repository == 'sgl-project/sglang' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || (contains(github.event.pull_request.labels.*.name, 'router-benchmark') && contains(github.event.pull_request.labels.*.name, 'run-ci'))) - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - # Fetch enough history for baseline comparison - fetch-depth: 100 - - - name: Install dependencies - run: | - bash scripts/ci/ci_install_rust.sh - - - name: Configure sccache - uses: mozilla-actions/sccache-action@v0.0.9 - with: - version: "v0.12.0" - disable_annotations: true - - - name: Rust cache - uses: Swatinem/rust-cache@v2 - with: - workspaces: sgl-model-gateway - # Share cache across all benchmark jobs - shared-key: "rust-cache" - cache-all-crates: true - cache-on-failure: true - # Save cache even on failure - save-if: true - - - name: Run request processing benchmark - timeout-minutes: 30 - run: | - source "$HOME/.cargo/env" - cd sgl-model-gateway/ - # Try to use sccache, but disable if it fails - if command -v sccache &> /dev/null; then - echo "Testing sccache availability..." - # Try to start sccache and check if it works - export RUSTC_WRAPPER=sccache - export SCCACHE_GHA_ENABLED="true" - if sccache --start-server 2>/dev/null && sccache --show-stats 2>/dev/null; then - echo "sccache is working, using it for compilation" - else - echo "sccache failed to start, falling back to regular cargo" - unset RUSTC_WRAPPER - unset SCCACHE_GHA_ENABLED - fi - else - echo "sccache not available, using regular cargo" - fi - # Run only the summary benchmark for quick validation in PRs - # Capture output to file for CI summary - cargo bench --bench request_processing -- benchmark_summary --exact 2>&1 | tee benchmark_output.txt - - - name: Upload benchmark results - if: always() - uses: actions/upload-artifact@v4 - with: - name: request-processing-results-${{ github.sha }} - path: | - sgl-model-gateway/target/criterion/benchmark_summary/ - sgl-model-gateway/benchmark_output.txt - retention-days: 30 - - - name: Show sccache stats - if: always() - run: sccache --show-stats - - benchmark-tokenizer: - name: Tokenizer Benchmark - if: | - github.repository == 'sgl-project/sglang' && - (github.event_name == 'push' || - github.event_name == 'workflow_dispatch' || - (contains(github.event.pull_request.labels.*.name, 'router-benchmark') && - contains(github.event.pull_request.labels.*.name, 'run-ci'))) - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - name: Request Processing + bench_name: request_processing + bench_args: "benchmark_summary --exact" + runner: ubuntu-latest + sccache_version: "v0.12.0" + artifact_name: request-processing-results + artifact_path: criterion/benchmark_summary/ + - name: Tokenizer + bench_name: tokenizer_benchmark + bench_args: "" + runner: ubuntu-latest + sccache_version: "v0.12.0" + artifact_name: tokenizer-results + artifact_path: criterion/tokenizer*/ + - name: Tool Parser + bench_name: tool_parser_benchmark + bench_args: "" + runner: ubuntu-latest + sccache_version: "v0.12.0" + artifact_name: tool-parser-results + artifact_path: criterion/tool_parser*/ + - name: Tree + bench_name: tree_benchmark + bench_args: "benchmark_summary" + runner: 4-gpu-a10 + sccache_version: "v0.10.0" + artifact_name: tree-results + artifact_path: criterion/benchmark_summary*/ + runs-on: ${{ matrix.runner }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -163,29 +115,25 @@ jobs: - name: Configure sccache uses: mozilla-actions/sccache-action@v0.0.9 with: - version: "v0.12.0" + version: ${{ matrix.sccache_version }} disable_annotations: true - name: Rust cache uses: Swatinem/rust-cache@v2 with: workspaces: sgl-model-gateway - # Share cache across all benchmark jobs shared-key: "rust-cache" cache-all-crates: true cache-on-failure: true - # Save cache even on failure save-if: true - - name: Run tokenizer benchmark + - name: Run benchmark timeout-minutes: 30 run: | source "$HOME/.cargo/env" cd sgl-model-gateway/ - # Try to use sccache, but disable if it fails if command -v sccache &> /dev/null; then echo "Testing sccache availability..." - # Try to start sccache and check if it works export RUSTC_WRAPPER=sccache export SCCACHE_GHA_ENABLED="true" if sccache --start-server 2>/dev/null && sccache --show-stats 2>/dev/null; then @@ -198,163 +146,15 @@ jobs: else echo "sccache not available, using regular cargo" fi - # Capture output to file for CI summary - cargo bench --bench tokenizer_benchmark 2>&1 | tee benchmark_output.txt + cargo bench --bench ${{ matrix.bench_name }} -- ${{ matrix.bench_args }} 2>&1 | tee benchmark_output.txt - name: Upload benchmark results if: always() uses: actions/upload-artifact@v4 with: - name: tokenizer-results-${{ github.sha }} + name: ${{ matrix.artifact_name }}-${{ github.sha }} path: | - sgl-model-gateway/target/criterion/tokenizer*/ - sgl-model-gateway/benchmark_output.txt - retention-days: 30 - - benchmark-tool-parser: - name: Tool Parser Benchmark - if: | - github.repository == 'sgl-project/sglang' && - (github.event_name == 'push' || - github.event_name == 'workflow_dispatch' || - (contains(github.event.pull_request.labels.*.name, 'router-benchmark') && - contains(github.event.pull_request.labels.*.name, 'run-ci'))) - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 100 - - - name: Install dependencies - run: | - bash scripts/ci/ci_install_rust.sh - - - name: Configure sccache - uses: mozilla-actions/sccache-action@v0.0.9 - with: - version: "v0.12.0" - disable_annotations: true - - - name: Rust cache - uses: Swatinem/rust-cache@v2 - with: - workspaces: sgl-model-gateway - # Share cache across all benchmark jobs - shared-key: "rust-cache" - cache-all-crates: true - cache-on-failure: true - # Save cache even on failure - save-if: true - - - name: Run tool parser benchmark - timeout-minutes: 30 - run: | - source "$HOME/.cargo/env" - cd sgl-model-gateway/ - # Try to use sccache, but disable if it fails - if command -v sccache &> /dev/null; then - echo "Testing sccache availability..." - # Try to start sccache and check if it works - export RUSTC_WRAPPER=sccache - export SCCACHE_GHA_ENABLED="true" - if sccache --start-server 2>/dev/null && sccache --show-stats 2>/dev/null; then - echo "sccache is working, using it for compilation" - else - echo "sccache failed to start, falling back to regular cargo" - unset RUSTC_WRAPPER - unset SCCACHE_GHA_ENABLED - fi - else - echo "sccache not available, using regular cargo" - fi - # Capture output to file for CI summary - cargo bench --bench tool_parser_benchmark 2>&1 | tee benchmark_output.txt - - - name: Upload benchmark results - if: always() - uses: actions/upload-artifact@v4 - with: - name: tool-parser-results-${{ github.sha }} - path: | - sgl-model-gateway/target/criterion/tool_parser*/ - sgl-model-gateway/benchmark_output.txt - retention-days: 30 - - - name: Show sccache stats - if: always() - run: sccache --show-stats - - benchmark-tree: - name: Tree Benchmark - if: | - github.repository == 'sgl-project/sglang' && - (github.event_name == 'push' || - github.event_name == 'workflow_dispatch' || - (contains(github.event.pull_request.labels.*.name, 'router-benchmark') && - contains(github.event.pull_request.labels.*.name, 'run-ci'))) - # Use 4-core runner for concurrent benchmarks that spawn multiple threads - runs-on: 4-gpu-a10 - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 100 - - - name: Install dependencies - run: | - bash scripts/ci/ci_install_rust.sh - - - name: Configure sccache - uses: mozilla-actions/sccache-action@v0.0.9 - with: - version: "v0.10.0" - disable_annotations: true - - - name: Rust cache - uses: Swatinem/rust-cache@v2 - with: - workspaces: sgl-model-gateway - # Share cache across all benchmark jobs - shared-key: "rust-cache" - cache-all-crates: true - cache-on-failure: true - # Save cache even on failure - save-if: true - - - name: Run tree benchmark - timeout-minutes: 30 - run: | - source "$HOME/.cargo/env" - cd sgl-model-gateway/ - # Try to use sccache, but disable if it fails - if command -v sccache &> /dev/null; then - echo "Testing sccache availability..." - # Try to start sccache and check if it works - export RUSTC_WRAPPER=sccache - export SCCACHE_GHA_ENABLED="true" - if sccache --start-server 2>/dev/null && sccache --show-stats 2>/dev/null; then - echo "sccache is working, using it for compilation" - else - echo "sccache failed to start, falling back to regular cargo" - unset RUSTC_WRAPPER - unset SCCACHE_GHA_ENABLED - fi - else - echo "sccache not available, using regular cargo" - fi - # Run summary benchmark for quick validation in CI - # Note: Don't use --exact because benchmark names are prefixed (benchmark_summary/insert_realistic) - # Capture output to file for CI summary - cargo bench --bench tree_benchmark -- benchmark_summary 2>&1 | tee benchmark_output.txt - - - name: Upload benchmark results - if: always() - uses: actions/upload-artifact@v4 - with: - name: tree-results-${{ github.sha }} - path: | - sgl-model-gateway/target/criterion/benchmark_summary*/ + sgl-model-gateway/target/${{ matrix.artifact_path }} sgl-model-gateway/benchmark_output.txt retention-days: 30 @@ -364,7 +164,7 @@ jobs: benchmark-summary: name: Benchmark Summary - needs: [benchmark-request-processing, benchmark-tokenizer, benchmark-tool-parser, benchmark-tree] + needs: [benchmark] if: always() && (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') runs-on: ubuntu-latest steps: @@ -379,7 +179,6 @@ jobs: echo "## 🚀 Benchmark Results Summary" > summary.md echo "" >> summary.md - # Request Processing Benchmark echo "### Request Processing" >> summary.md REQ_DIR="benchmark-results/request-processing-results-${{ github.sha }}" if [ -d "$REQ_DIR" ]; then @@ -390,7 +189,6 @@ jobs: echo "View Results" >> summary.md echo "" >> summary.md echo '```' >> summary.md - # Extract the summary section (starts with "SGLang Model Gateway" or performance data) grep -A 100 "SGLang Model Gateway\|Quick Performance\|Performance Insights" "$REQ_DIR/benchmark_output.txt" | head -50 >> summary.md || cat "$REQ_DIR/benchmark_output.txt" | tail -60 >> summary.md echo '```' >> summary.md echo "" >> summary.md @@ -400,7 +198,6 @@ jobs: fi echo "" >> summary.md - # Tokenizer Benchmark echo "### Tokenizer" >> summary.md TOK_DIR="benchmark-results/tokenizer-results-${{ github.sha }}" if [ -d "$TOK_DIR" ]; then @@ -411,7 +208,6 @@ jobs: echo "View Results" >> summary.md echo "" >> summary.md echo '```' >> summary.md - # Extract the summary table section grep -A 200 "TOKENIZER BENCHMARK SUMMARY\|ENCODING THROUGHPUT" "$TOK_DIR/benchmark_output.txt" | head -100 >> summary.md || cat "$TOK_DIR/benchmark_output.txt" | tail -100 >> summary.md echo '```' >> summary.md echo "" >> summary.md @@ -421,7 +217,6 @@ jobs: fi echo "" >> summary.md - # Tool Parser Benchmark echo "### Tool Parser" >> summary.md TOOL_DIR="benchmark-results/tool-parser-results-${{ github.sha }}" if [ -d "$TOOL_DIR" ]; then @@ -432,7 +227,6 @@ jobs: echo "View Results" >> summary.md echo "" >> summary.md echo '```' >> summary.md - # Extract the summary table section grep -A 200 "TOOL PARSER BENCHMARK SUMMARY\|REGISTRY OPERATIONS\|COMPLETE PARSING" "$TOOL_DIR/benchmark_output.txt" | head -100 >> summary.md || cat "$TOOL_DIR/benchmark_output.txt" | tail -100 >> summary.md echo '```' >> summary.md echo "" >> summary.md @@ -442,7 +236,6 @@ jobs: fi echo "" >> summary.md - # Tree Benchmark echo "### Radix Tree (Cache-Aware Routing)" >> summary.md TREE_DIR="benchmark-results/tree-results-${{ github.sha }}" if [ -d "$TREE_DIR" ]; then @@ -453,7 +246,6 @@ jobs: echo "View Results" >> summary.md echo "" >> summary.md echo '```' >> summary.md - # Extract the full summary table (avoids duplication with [BENCH_RESULT] lines) grep -A 50 "RADIX TREE BENCHMARK SUMMARY" "$TREE_DIR/benchmark_output.txt" | head -50 >> summary.md || cat "$TREE_DIR/benchmark_output.txt" | tail -50 >> summary.md echo '```' >> summary.md echo "" >> summary.md @@ -466,10 +258,7 @@ jobs: echo "---" >> summary.md echo "_Generated at $(date -u '+%Y-%m-%d %H:%M:%S UTC')_" >> summary.md - # Display summary in logs cat summary.md - - # Write to GitHub Step Summary for visibility in the Actions UI cat summary.md >> $GITHUB_STEP_SUMMARY - name: Upload summary