@@ -212,6 +212,37 @@ jobs:
212212 python3 -c "from smg.smg_rs import Router; print('Rust extension: OK')"
213213 python3 -m smg.launch_router --help > /dev/null && echo "Entry point: OK"
214214
215+ build-wheel-mm-rdma :
216+ # Dedicated mm-rdma wheel for the RDMA e2e, built natively on the bare Ubuntu
217+ # runner (GNU libstdc++). The shared wheel is cross-compiled with
218+ # `maturin --zig`, which ships LLVM libc++ and can't link nixl-sys's
219+ # GNU-libstdc++ C++ stub; building it separately here keeps that off the
220+ # shared wheel so it can't break the other e2e lanes. Runs on the same runner
221+ # image as the GPU e2e lanes, so the native wheel loads there unchanged.
222+ needs : detect-changes
223+ if : >-
224+ always()
225+ && !cancelled()
226+ && (github.event_name != 'pull_request'
227+ || (needs.detect-changes.result == 'success'
228+ && (needs.detect-changes.outputs.common == 'true'
229+ || needs.detect-changes.outputs.chat-completions == 'true')))
230+ runs-on : k8s-runner-cpu
231+ permissions :
232+ contents : read
233+ steps :
234+ - uses : actions/checkout@v7
235+ - name : Setup Rust
236+ uses : ./.github/actions/setup-rust
237+ - name : Build mm-rdma wheel
238+ run : bash scripts/ci_build_wheel_mm_rdma.sh
239+ - name : Upload mm-rdma wheel artifact
240+ uses : actions/upload-artifact@v7
241+ with :
242+ name : smg-wheel-mm-rdma
243+ path : bindings/python/dist/*.whl
244+ retention-days : 1
245+
215246 python-unit-tests :
216247 needs : build-wheel
217248 runs-on : k8s-runner-cpu
@@ -508,6 +539,9 @@ jobs:
508539 - engine : vllm
509540 timeout : 24
510541 test_timeout : 18
542+ # The RDMA multimodal test needs the dedicated mm-rdma wheel + a NIXL
543+ # runner; it runs in e2e-1gpu-mm-rdma, not this shared-wheel lane.
544+ test_filter : " --ignore=e2e_test/chat_completions/test_multimodal_rdma.py"
511545 - engine : trtllm
512546 timeout : 32
513547 test_timeout : 18
@@ -529,6 +563,31 @@ jobs:
529563 timeout : ${{ matrix.timeout }}
530564 test_timeout : ${{ matrix.test_timeout }}
531565 test_dirs : ${{ matrix.test_dirs || 'e2e_test/chat_completions' }}
566+ test_filter : ${{ matrix.test_filter || '' }}
567+ secrets : inherit
568+
569+ e2e-1gpu-mm-rdma :
570+ # Isolated RDMA multimodal e2e: installs the dedicated mm-rdma wheel and runs
571+ # only test_multimodal_rdma.py against a vLLM worker on a NIXL-capable runner.
572+ needs : [build-wheel, build-wheel-mm-rdma, detect-changes]
573+ if : >-
574+ always()
575+ && !cancelled()
576+ && needs.build-wheel.result == 'success'
577+ && needs.build-wheel-mm-rdma.result == 'success'
578+ && (github.event_name != 'pull_request'
579+ || (needs.detect-changes.result == 'success'
580+ && (needs.detect-changes.outputs.common == 'true'
581+ || needs.detect-changes.outputs.chat-completions == 'true')))
582+ uses : ./.github/workflows/e2e-gpu-job.yml
583+ with :
584+ engine : vllm
585+ gpu_tier : " 1"
586+ runner : 1-gpu-h100
587+ timeout : 24
588+ test_timeout : 18
589+ test_dirs : e2e_test/chat_completions/test_multimodal_rdma.py
590+ wheel_artifact : smg-wheel-mm-rdma
532591 secrets : inherit
533592
534593 e2e-1gpu-completions :
@@ -1037,7 +1096,7 @@ jobs:
10371096 path : benchmark_go_bindings/
10381097
10391098 finish :
1040- needs : [pre-commit, python-lint, grpc-proto-build-check, build-wheel, python-unit-tests, unit-tests, benchmarks, e2e-1gpu-chat, e2e-1gpu-completions, e2e-1gpu-embeddings, e2e-1gpu-gateway, e2e-1gpu-responses, e2e-2gpu-pd, e2e-4gpu-chat, e2e-4gpu-gateway, e2e-4gpu-epd, e2e-vendor, go-unit-tests, go-bindings-e2e]
1099+ needs : [pre-commit, python-lint, grpc-proto-build-check, build-wheel, build-wheel-mm-rdma, python-unit-tests, unit-tests, benchmarks, e2e-1gpu-chat, e2e-1gpu-mm-rdma , e2e-1gpu-completions, e2e-1gpu-embeddings, e2e-1gpu-gateway, e2e-1gpu-responses, e2e-2gpu-pd, e2e-4gpu-chat, e2e-4gpu-gateway, e2e-4gpu-epd, e2e-vendor, go-unit-tests, go-bindings-e2e]
10411100 if : always()
10421101 runs-on : k8s-runner-cpu
10431102 permissions : {}
@@ -1048,10 +1107,12 @@ jobs:
10481107 "${{ needs.python-lint.result }}" == "failure" || \
10491108 "${{ needs.grpc-proto-build-check.result }}" == "failure" || \
10501109 "${{ needs.build-wheel.result }}" == "failure" || \
1110+ "${{ needs.build-wheel-mm-rdma.result }}" == "failure" || \
10511111 "${{ needs.python-unit-tests.result }}" == "failure" || \
10521112 "${{ needs.unit-tests.result }}" == "failure" || \
10531113 "${{ needs.benchmarks.result }}" == "failure" || \
10541114 "${{ needs.e2e-1gpu-chat.result }}" == "failure" || \
1115+ "${{ needs.e2e-1gpu-mm-rdma.result }}" == "failure" || \
10551116 "${{ needs.e2e-1gpu-completions.result }}" == "failure" || \
10561117 "${{ needs.e2e-1gpu-embeddings.result }}" == "failure" || \
10571118 "${{ needs.e2e-1gpu-gateway.result }}" == "failure" || \
0 commit comments