diff --git a/.github/workflows/pr-test-npu.yml b/.github/workflows/pr-test-npu.yml index d47a39615..af19e7549 100644 --- a/.github/workflows/pr-test-npu.yml +++ b/.github/workflows/pr-test-npu.yml @@ -12,16 +12,8 @@ concurrency: cancel-in-progress: true jobs: - - # ==================== PR Gate ==================== # - pr-gate: - uses: ./.github/workflows/pr-gate.yml - secrets: inherit - # ================================================= # - # ==================== Check Changes ==================== # check-changes: - needs: [pr-gate] runs-on: ubuntu-latest outputs: main_package: ${{ steps.filter.outputs.main_package }} @@ -40,10 +32,16 @@ jobs: - "scripts/ci/npu_ci_install_dependency.sh" - "test/srt/ascend/**" - ".github/workflows/pr-test-npu.yml" - # ======================================================= # + + # ==================== PR Gate ==================== # + pr-gate: + needs: check-changes + if: needs.check-changes.outputs.main_package == 'true' + uses: ./.github/workflows/pr-gate.yml + secrets: inherit per-commit-1-npu-a2: - needs: [check-changes] + needs: [check-changes, pr-gate] if: needs.check-changes.outputs.main_package == 'true' runs-on: linux-arm64-npu-1 container: @@ -82,7 +80,7 @@ jobs: python3 run_suite.py --suite per-commit-1-npu-a2 per-commit-2-npu-a2: - needs: [check-changes] + needs: [check-changes, pr-gate] if: needs.check-changes.outputs.main_package == 'true' runs-on: linux-arm64-npu-2 strategy: @@ -125,7 +123,7 @@ jobs: python3 run_suite.py --suite per-commit-2-npu-a2 --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 per-commit-4-npu-a2: - needs: [check-changes] + needs: [check-changes, pr-gate] if: needs.check-changes.outputs.main_package == 'true' runs-on: linux-arm64-npu-4 container: @@ -164,7 +162,7 @@ jobs: python3 run_suite.py --suite per-commit-4-npu-a2 --timeout-per-file 3600 per-commit-16-npu-a3: - needs: [check-changes] + needs: [check-changes, pr-gate] if: needs.check-changes.outputs.main_package == 'true' runs-on: linux-aarch64-a3-16 strategy: diff --git a/.github/workflows/pr-test-pd-router.yml b/.github/workflows/pr-test-pd-router.yml index 66da00e2d..d95e71530 100644 --- a/.github/workflows/pr-test-pd-router.yml +++ b/.github/workflows/pr-test-pd-router.yml @@ -9,6 +9,7 @@ on: - 'sgl-router/**' pull_request: branches: [ main ] + types: [opened, synchronize, reopened, labeled] paths: - 'python/sglang/srt/disaggregation/**' - 'scripts/ci/ci_start_disaggregation_servers.sh' @@ -26,7 +27,11 @@ permissions: jobs: test-disaggregation: - if: github.event_name != 'pull_request' || (contains(github.event.pull_request.labels.*.name, 'run-ci') && contains(github.event.pull_request.labels.*.name, 'router-benchmark')) + if: | + github.event_name != 'pull_request' || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'run-ci') && contains(github.event.pull_request.labels.*.name, 'router-benchmark')) || + (github.event.action == 'labeled' && github.event.label.name == 'run-ci' && contains(github.event.pull_request.labels.*.name, 'router-benchmark')) || + (github.event.action == 'labeled' && github.event.label.name == 'router-benchmark' && contains(github.event.pull_request.labels.*.name, 'run-ci')) runs-on: [8-gpu-h200-oracle] timeout-minutes: 45 diff --git a/.github/workflows/pr-test-rust.yml b/.github/workflows/pr-test-rust.yml index 375f9b2f2..a8e6072bb 100644 --- a/.github/workflows/pr-test-rust.yml +++ b/.github/workflows/pr-test-rust.yml @@ -7,6 +7,7 @@ on: - "sgl-router/**" pull_request: branches: [ main ] + types: [opened, synchronize, reopened, labeled] paths: - "sgl-router/**" workflow_dispatch: @@ -21,7 +22,10 @@ env: jobs: maturin-build-test: - if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'run-ci') + if: | + github.event_name != 'pull_request' || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'run-ci')) || + (github.event.action == 'labeled' && github.event.label.name == 'run-ci') runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -71,7 +75,10 @@ jobs: python -c "from sglang_router.sglang_router_rs import Router; print('Rust extension: OK')" python -m sglang_router.launch_router --help > /dev/null && echo "Entry point: OK" router-unit-tests: - if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'run-ci') + if: | + github.event_name != 'pull_request' || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'run-ci')) || + (github.event.action == 'labeled' && github.event.label.name == 'run-ci') runs-on: ubuntu-latest steps: - name: Checkout code @@ -134,7 +141,10 @@ jobs: run: sccache --show-stats router-http-tests: - if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'run-ci') + if: | + github.event_name != 'pull_request' || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'run-ci')) || + (github.event.action == 'labeled' && github.event.label.name == 'run-ci') runs-on: 4-gpu-a10 timeout-minutes: 32 steps: @@ -203,7 +213,10 @@ jobs: path: sgl-router/benchmark_**/ router-grpc-response-api-tests: - if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'run-ci') + if: | + github.event_name != 'pull_request' || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'run-ci')) || + (github.event.action == 'labeled' && github.event.label.name == 'run-ci') runs-on: 4-gpu-a10 timeout-minutes: 32 steps: diff --git a/.github/workflows/pr-test-xeon.yml b/.github/workflows/pr-test-xeon.yml index aed9fb32f..58e16c9a7 100644 --- a/.github/workflows/pr-test-xeon.yml +++ b/.github/workflows/pr-test-xeon.yml @@ -12,13 +12,8 @@ concurrency: cancel-in-progress: false jobs: - # ==================== PR Gate ==================== # - pr-gate: - uses: ./.github/workflows/pr-gate.yml - secrets: inherit - # ================= Check Changes ================= # + # ==================== Check Changes ==================== # check-changes: - needs: [pr-gate] runs-on: ubuntu-latest outputs: main_package: ${{ steps.filter.outputs.main_package }} @@ -32,16 +27,23 @@ jobs: with: filters: | main_package: - - "python/**" - - "!python/sglang/multimodal_gen/**" + - "python/sglang/!(multimodal_gen)/**" + - "python/*.toml" - "scripts/ci/**" - "test/**" - "sgl-kernel/**" - ".github/workflows/pr-test-xeon.yml" - "docker/xeon.Dockerfile" + # ==================== PR Gate ==================== # + pr-gate: + needs: check-changes + if: needs.check-changes.outputs.main_package == 'true' + uses: ./.github/workflows/pr-gate.yml + secrets: inherit + build-test: - needs: [check-changes] + needs: [check-changes, pr-gate] if: needs.check-changes.outputs.main_package == 'true' runs-on: xeon-gnr env: diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 75fb0a8bf..83e24a3d5 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -21,12 +21,8 @@ concurrency: cancel-in-progress: true jobs: - call-gate: - uses: ./.github/workflows/pr-gate.yml - secrets: inherit # =============================================== check changes ==================================================== check-changes: - needs: [call-gate] runs-on: ubuntu-latest outputs: main_package: ${{ steps.filter.outputs.main_package }} @@ -67,10 +63,20 @@ jobs: echo "| multimodal_gen | ${{ steps.filter.outputs.multimodal_gen }} |" } >> $GITHUB_STEP_SUMMARY + # =============================================== PR Gate ==================================================== + call-gate: + needs: check-changes + if: | + needs.check-changes.outputs.main_package == 'true' || + needs.check-changes.outputs.sgl_kernel == 'true' || + needs.check-changes.outputs.multimodal_gen == 'true' + uses: ./.github/workflows/pr-gate.yml + secrets: inherit + # =============================================== sgl-kernel ==================================================== sgl-kernel-build-wheels: - needs: [check-changes] + needs: [check-changes, call-gate] if: needs.check-changes.outputs.sgl_kernel == 'true' runs-on: x64-kernel-build-node strategy: @@ -110,7 +116,7 @@ jobs: path: sgl-kernel/dist/* sgl-kernel-build-wheels-arm: - needs: [check-changes] + needs: [check-changes, call-gate] if: needs.check-changes.outputs.sgl_kernel == 'true' runs-on: arm-kernel-build-node strategy: @@ -151,7 +157,7 @@ jobs: path: sgl-kernel/dist/* sgl-kernel-unit-test: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: needs.check-changes.outputs.sgl_kernel == 'true' runs-on: 1-gpu-runner env: @@ -182,7 +188,7 @@ jobs: pytest tests/ sgl-kernel-mla-test: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: needs.check-changes.outputs.sgl_kernel == 'true' runs-on: 1-gpu-runner env: @@ -213,7 +219,7 @@ jobs: python3 test_mla_deepseek_v3.py sgl-kernel-benchmark-test: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: needs.check-changes.outputs.sgl_kernel == 'true' runs-on: 1-gpu-runner env: @@ -321,7 +327,7 @@ jobs: # =============================================== primary ==================================================== stage-a-test-1: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -353,7 +359,7 @@ jobs: multimodal-gen-test-1-gpu: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: (always() && !failure() && !cancelled()) && needs.check-changes.outputs.multimodal_gen == 'true' runs-on: 1-gpu-runner strategy: @@ -391,7 +397,7 @@ jobs: multimodal-gen-test-2-gpu: - needs: [check-changes, sgl-kernel-build-wheels] + needs: [check-changes, call-gate, sgl-kernel-build-wheels] if: (always() && !failure() && !cancelled()) && needs.check-changes.outputs.multimodal_gen == 'true' runs-on: 2-gpu-runner strategy: @@ -429,7 +435,7 @@ jobs: --total-partitions 2 quantization-test: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -456,7 +462,7 @@ jobs: python3 run_suite.py --suite quantization_test unit-test-backend-1-gpu: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -490,7 +496,7 @@ jobs: python3 run_suite.py --suite per-commit-1-gpu --auto-partition-id ${{ matrix.part }} --auto-partition-size 15 unit-test-backend-2-gpu: - needs: [check-changes, unit-test-backend-1-gpu] + needs: [check-changes, call-gate, unit-test-backend-1-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 2-gpu-runner @@ -523,7 +529,7 @@ jobs: python3 run_suite.py --suite per-commit-2-gpu --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 unit-test-backend-4-gpu: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 4-gpu-h100 @@ -556,7 +562,7 @@ jobs: python3 run_suite.py --suite per-commit-4-gpu --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 unit-test-backend-8-gpu-h200: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 8-gpu-h200 @@ -589,7 +595,7 @@ jobs: python3 run_suite.py --suite per-commit-8-gpu-h200 --auto-partition-id ${{ matrix.part }} --auto-partition-size 3 unit-test-backend-8-gpu-h20: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 8-gpu-h20 @@ -623,7 +629,7 @@ jobs: python3 run_suite.py --suite per-commit-8-gpu-h20 --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 performance-test-1-gpu-part-1: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -684,7 +690,7 @@ jobs: python3 -m unittest test_bench_serving.TestBenchServing.test_lora_online_latency_with_concurrent_adapter_updates performance-test-1-gpu-part-2: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -737,7 +743,7 @@ jobs: python3 -m unittest test_bench_serving.TestBenchServing.test_vlm_online_latency performance-test-1-gpu-part-3: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -784,7 +790,7 @@ jobs: python3 -m unittest test_bench_serving.TestBenchServing.test_embeddings_api_batch_scaling performance-test-2-gpu: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 2-gpu-runner @@ -843,7 +849,7 @@ jobs: python3 -m unittest test_bench_serving.TestBenchServing.test_pp_long_context_prefill accuracy-test-1-gpu: - needs: [check-changes, stage-a-test-1] + needs: [check-changes, call-gate, stage-a-test-1] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 1-gpu-runner @@ -875,7 +881,7 @@ jobs: python3 test_eval_accuracy_large.py accuracy-test-2-gpu: - needs: [check-changes, accuracy-test-1-gpu] + needs: [check-changes, call-gate, accuracy-test-1-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 2-gpu-runner @@ -907,7 +913,7 @@ jobs: python3 test_moe_eval_accuracy_large.py unit-test-deepep-4-gpu: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 4-gpu-h100 @@ -936,7 +942,7 @@ jobs: python3 run_suite.py --suite per-commit-4-gpu-deepep unit-test-deepep-8-gpu: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 8-gpu-h200 @@ -965,7 +971,7 @@ jobs: python3 run_suite.py --suite per-commit-8-gpu-h200-deepep unit-test-backend-4-gpu-b200: - needs: [check-changes, unit-test-backend-2-gpu] + needs: [check-changes, call-gate, unit-test-backend-2-gpu] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 4-gpu-b200 @@ -999,7 +1005,7 @@ jobs: python3 run_suite.py --suite per-commit-4-gpu-b200 --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 --timeout-per-file 1800 unit-test-backend-4-gpu-gb200: - needs: [check-changes, unit-test-backend-2-gpu, sgl-kernel-build-wheels-arm] + needs: [check-changes, call-gate, unit-test-backend-2-gpu, sgl-kernel-build-wheels-arm] if: always() && !failure() && !cancelled() && ((needs.check-changes.outputs.main_package == 'true') || (needs.check-changes.outputs.sgl_kernel == 'true')) runs-on: 4-gpu-gb200 diff --git a/sgl-router/README.md b/sgl-router/README.md index d9036c4d1..d6d751b00 100644 --- a/sgl-router/README.md +++ b/sgl-router/README.md @@ -41,7 +41,6 @@ High-performance model routing control and data plane for large-scale LLM deploy ## Documentation - **User Guide**: [docs.sglang.ai/advanced_features/router.html](https://docs.sglang.ai/advanced_features/router.html) - Additional guides, API references, and deployment patterns are continuously updated alongside SGLang releases. -- **Tokenizer Module**: See [src/tokenizer/README.md](src/tokenizer/README.md) for tokenizer architecture and chat template support. ## Installation ### Prerequisites