-
Notifications
You must be signed in to change notification settings - Fork 9
feat(remote): serve a model on a tailnet GPU machine #333
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -122,6 +122,9 @@ jobs: | |
| - '**/*.ps1' | ||
| - '**/*.feature' | ||
| - 'tests/e2e-cucumber/**' | ||
| # The containerised control-channel lane; its Dockerfile matches | ||
| # none of the extension globs above. | ||
| - 'tests/remote-ssh/**' | ||
| - 'install*' | ||
| # Pinned-key consistency compares docs/keys/* against the installers, | ||
| # so a canonical-key-only change must trigger the heavy job that runs | ||
|
|
@@ -644,6 +647,55 @@ jobs: | |
| prek-version: 0.4.5 | ||
| extra-args: --all-files --no-group local-tools | ||
|
|
||
| remote-ssh: | ||
| # `rocm remote` drives ssh, scp, and the remote's service/serve tooling. Its | ||
| # unit tests use a scripted stand-in, which proves the control flow but | ||
| # assumes the real tools behave a certain way. This job checks that | ||
| # assumption against a real OpenSSH server in a container: argument | ||
| # handling, exit-code propagation, stdin delivery of a credential, file | ||
| # copy, batch-mode refusal, the shape Tailscale Funnel takes in the serve | ||
| # config (including that the fake refuses the ports the real daemon | ||
| # refuses), and — the one that matters most — that withdrawing a published | ||
| # endpoint actually removes it. A publish is configuration rather than a | ||
| # process, so it survives reboots, and a withdrawal that silently does | ||
| # nothing leaves a GPU endpoint exposed with nothing tracking it. | ||
| # | ||
| # No GPU, no ROCm, no tailnet: the remote's `rocm` and `tailscale` are | ||
| # stand-ins that answer in the shapes the real tools do. | ||
| name: remote control channel (containerised) | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 30 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor: the other heavy-gated jobs in this file also carry
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not addressed yet, and it belongs with the |
||
| needs: changes | ||
| if: needs.changes.outputs.heavy == 'true' | ||
| steps: | ||
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | ||
|
|
||
| # Docker and the OpenSSH client are both present on ubuntu-latest; jq is | ||
| # the only extra, and only for asserting on JSON contracts. | ||
| - name: Install jq | ||
| run: sudo apt-get update && sudo apt-get install -y jq | ||
|
|
||
| - name: Check the control-channel contracts | ||
| run: tests/remote-ssh/run.sh | ||
|
|
||
| # The pinned toolchain, and the rust-cache that comes with it, as every | ||
| # other cargo job in this workflow uses. Without it this lane builds the | ||
| # whole workspace cold against a different compiler from the rest of CI, | ||
| # inside a 30-minute timeout. | ||
| - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0 | ||
|
|
||
| # The same container, driven by the real binary this time: discover a | ||
| # target, probe it, serve, publish, reconcile status, re-publish after an | ||
| # out-of-band withdrawal, tear down, and refuse to publish over a | ||
| # Funnel-exposed port. Catches the orchestration mistakes a scripted | ||
| # stand-in cannot — an argument the CLI builds wrongly, a session record | ||
| # it fails to clean up. | ||
| - name: Build the CLI for the end-to-end run | ||
| run: cargo build -p rocm | ||
|
|
||
| - name: Drive rocm remote end to end | ||
| run: tests/remote-ssh/run-e2e.sh | ||
|
|
||
| clippy: | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 20 | ||
|
|
@@ -1053,6 +1105,14 @@ jobs: | |
|
|
||
| - name: Run E2E tests | ||
| if: steps.gate.outputs.run == 'true' | ||
| # E2E_INCLUDE_DOCKER turns on the `rocm remote` scenarios that need a | ||
| # second machine, stood up as a container. This is the only lane that | ||
| # opts in: GitHub-hosted runners can build the fixture image, while the | ||
| # self-hosted GPU runners have a daemon but no route to the package | ||
| # mirror it installs from, so they skip rather than fail on an image | ||
| # they could never build. | ||
| env: | ||
| E2E_INCLUDE_DOCKER: "1" | ||
| run: cargo xtask e2e | ||
|
|
||
| - name: Upload E2E report | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor: every other job gated on
heavyin this workflow (build-and-test,test,windows-build-and-test) hasneeds: [changes, clippy, prek], specifically so a fast lint failure short-circuits before spending build time. This new job only hasneeds: changes, so it'll run its full 30-minute container+cargo cycle even when clippy or prek would have failed instantly.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not addressed yet. Confirmed: every other
heavy-gated job carriesneeds: [changes, clippy, prek]and this one has onlyneeds: changes, so it burns the full container and cargo cycle on runs a lint failure would have ended in seconds.This is also a prerequisite for the other open question on this lane — whether it should be a required check — because the gating has to be right before anything depends on it.