Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9b488d8
feat(runtime): add standalone Velo response transport
jthomson04 Sep 23, 2026
7b381f1
build(runtime): pin Velo lifecycle revision
jthomson04 Sep 23, 2026
3d6a58d
style(runtime): format response receiver construction
jthomson04 Sep 23, 2026
c8cba4e
feat(runtime): expose Velo metrics and update lockfiles
jthomson04 Sep 23, 2026
df27c8e
test(runtime): add Tyche Velo response comparison harness
jthomson04 Sep 23, 2026
754ce9f
build(runtime): pin session-scoped Velo lifecycle
jthomson04 Sep 23, 2026
dd7424b
test(runtime): finalize packet accounting and comparison report
jthomson04 Sep 23, 2026
e2c45cf
test(runtime): retain compact export diagnostics
jthomson04 Sep 23, 2026
cbcdc73
test(runtime): retain small error counts in directional comparisons
jthomson04 Sep 23, 2026
5b0e9e2
test(runtime): report per-run benchmark error counts
jthomson04 Sep 23, 2026
e495e0e
test(runtime): avoid node exporter port in saturation preflight
jthomson04 Sep 23, 2026
8094e22
test(runtime): include hardware receive packet size buckets
jthomson04 Sep 23, 2026
3aa5552
test(runtime): verify the RDMA devices and active message lanes
jthomson04 Sep 23, 2026
1208992
test(runtime): retain telemetry across campaign allocations
jthomson04 Sep 23, 2026
0c14c33
test(runtime): check dependency sources for this campaign
jthomson04 Sep 23, 2026
345e868
test(runtime): run offline analysis after the timing matrix
jthomson04 Sep 23, 2026
0c0ff44
test(runtime): separate cancelled credits from completed exports
jthomson04 Sep 23, 2026
d1972d6
test(runtime): resume the fixed matrix across allocations
jthomson04 Sep 23, 2026
ee350b8
test(runtime): retain client and NUMA evidence in comparison
jthomson04 Sep 23, 2026
c69bab1
test(runtime): analyze exports on allocated compute nodes
jthomson04 Sep 23, 2026
ac51b44
test(runtime): retain packet and environment comparison evidence
jthomson04 Sep 24, 2026
5c51a09
test(runtime): include selected RDMA error counters in report
jthomson04 Sep 24, 2026
507c196
docs(benchmarks): record Tyche response transport comparison
jthomson04 Sep 24, 2026
0548303
fix(runtime): pin Velo handler discovery cache fix
jthomson04 Sep 28, 2026
18a7697
fix(runtime): prepare each Velo frontend once, and use a credit windo…
ryanolson Sep 28, 2026
2d3e2a3
Merge jthomson04/velo-response into rolson/velo-response-prepare-once
ryanolson Sep 29, 2026
d19f072
chore(runtime): pin velo to bee8b8e
ryanolson Sep 29, 2026
a8046e4
chore(runtime): use velo 0.18.0 from crates.io
ryanolson Oct 2, 2026
e55a5c5
perf(runtime): four TCP lanes for Velo response streams
ryanolson Oct 2, 2026
0b4ecc6
fix(runtime): own and shut down mux-only Velo response services
jthomson04 Oct 2, 2026
c177bd5
build(runtime): pin the validated Velo release candidate
jthomson04 Oct 2, 2026
8c29c18
chore(runtime): refresh reviewed Velo integration candidate
jthomson04 Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 55 additions & 34 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ kvbm-logical = { path = "lib/kvbm-logical", version = "1.6.0" }
kvbm-physical = { path = "lib/kvbm-physical", version = "1.6.0" }

# velo
velo = { version = "0.12.0" }
# Combined 0.19 candidate; use the registry release after both Velo cleanup PRs ship.
velo = { version = "0.19.0", git = "https://github.com/ai-dynamo/velo.git", rev = "c271c5837b7df171aa10a72e6d1780e615a150ca", default-features = false }

# External dependencies
anyhow = { version = "1" }
Expand All @@ -102,7 +103,7 @@ async-nats = { version = "0.49.1", features = ["service"] }
async-stream = { version = "0.3" }
async-trait = { version = "0.1" }
blake3 = { version = "1.8.7" }
bytes = { version = "1.9" }
bytes = { version = "1.9", features = ["serde"] }
chrono = { version = "0.4", default-features = false, features = [
"alloc",
"std",
Expand Down
3 changes: 3 additions & 0 deletions benchmark-harness/velo-response/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
__pycache__/
artifacts/
*.log
101 changes: 101 additions & 0 deletions benchmark-harness/velo-response/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Velo response comparison on Tyche

The [completed September 23 comparison](report/README.md) includes all 16 measured
runs, packet and end-to-end results, retained errors, source pins, and build hashes.

The adapter is selected with `DYN_RESPONSE_PLANE=velo` and
`DYN_VELO_RESPONSE_TRANSPORT=tcp|ucx`. UCX requires the `velo-ucx` build feature.
TCP remains the default response plane. QUIC is unchanged.

The companion Velo change adds native graceful stop, ticket cancellation and
bounded UCX send admission. Dynamo polls the Velo stream directly. It preserves
its payload codec, prologue and completion checks. A shared process service owns
the Velo transports; a worker owns only its service reference and request streams.

The harness extends `tyche-main-profile-20260923`. The workload template preserves
2,048 speedup-10 workers in 12 processes, two NUMA-bound frontends, AgentX's 336
traces, seed 12345 and concurrency 6,144. Each run starts new services, uses 32
warmups, a 30-second ramp and a 120-second measurement, then drains and exports.

Before the final campaign, refresh Dynamo main, apply the integration, pin the
Velo commit, and build one UCX-enabled binary. Freeze revisions, all three Cargo locks,
features, build flags, source overlays and binary hashes for all modes. The ZMQ
socket-capacity overlay is benchmark-only and must be identical for all modes.

Run one discard per mode, then four measured rounds in this balanced order:

| Round | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 1 | TCP | QUIC | Velo RDMA | Velo TCP |
| 2 | QUIC | Velo TCP | TCP | Velo RDMA |
| 3 | Velo TCP | Velo RDMA | QUIC | TCP |
| 4 | Velo RDMA | TCP | Velo TCP | QUIC |

TCP and QUIC use the current Ethernet network. Select RDMA explicitly with
`UCX_TLS=rc_mlx5,ud_mlx5,self` and a verified `UCX_NET_DEVICES` port. Preserve UCX
lane logs and hardware counter changes to prove the selected path. Do not accept
silent TCP fallback. Hardware tests and the response saturation check must pass
before the full matrix.

`rootcause_telemetry.py` records Ethernet hardware counters, offloads, IRQs,
softirqs, host network counters and RDMA port counters. Keep wire packet counts
separate from host aggregation and completion counts. InfiniBand `port_rcv_data`
and `port_xmit_data` count four-byte units. Packet-size buckets are reported only
when the hardware exposes them. Keep response-only traffic separate from total
frontend traffic where counters permit. Record fabric, speed, MTU, PCI/NUMA
placement and actual process memory placement.

Require complete exports and 2,048 active KV sources on both frontends. Small
error counts remain in the directional comparison and are reported for every
run. The harness accepts error fractions up to 0.01%; it does not hide those
records or their error types. Keep failed artifacts. Take profiles outside timing
runs. Report client saturation and different fabrics as comparison limits.
Report packet load separately from throughput and tail latency. The provisional
limits versus Dynamo TCP are 5% throughput or p99 latency regression and 10%
serving CPU per request regression. Also compare every metric with QUIC.

The scripts use the existing Tyche cache, model, dataset, AIPerf and Python
environment paths in `configs/template.json`. `prepare_remote.py` installs the
established ZMQ capacity overlay and the Python launcher once, before building.
It requires the prior `dynamo-tyche-hf-runtime-m2048-20260917` source directory.
Retain the resulting overlay patch and hashes with the report.

Stage this worktree at `$ROOT/src/dynamo`, where `ROOT` is the path in the
template. Copy `harness/` to `$ROOT/harness` and the template to `$ROOT/configs`.
Run builds through `srun` in a Tyche allocation. Run `verify_hardware.py` once on
each allocated node. Analysis also checks each process's UCX active-message
lane against its selected RDMA device. After verifying the two RDMA
ports on the allocated nodes, the campaign sequence is:

```bash
python3 "$ROOT/harness/make_configs.py" --root "$ROOT" \
--dynamo "$DYNAMO_REV" --velo "$VELO_REV" \
--rdma-device mlx5_0:1 --rdma-device-numa1 mlx5_4:1
bash "$ROOT/harness/build_grace.sh"
python3 "$ROOT/harness/freeze.py" --root "$ROOT" \
--main "$MAIN_REV" --velo "$VELO_REV"
bash "$ROOT/harness/run_condition.sh" smoke-velo-tcp
bash "$ROOT/harness/run_condition.sh" smoke-velo-rdma
bash "$ROOT/harness/run_condition.sh" preflight-velo-rdma
bash "$ROOT/harness/controller.sh"
python3 "$ROOT/harness/summarize_environment.py"
python3 "$ROOT/harness/report.py"
```

The allocation keeper writes `$ROOT/control/job-id`. `freeze.py --verify`
checks the source revision, overlay, lockfiles and binary before every run.
Use new run labels after a failed attempt; do not replace its artifacts.
The saturation preflight uses concurrency 8,192 and per-process worker metrics.
It is separate from the four-way timing matrix.

`run_condition.sh` stops before a new run when less than 30 minutes remain.
For a continuation, preserve `manifests/nodes.txt` as
`manifests/campaign-original-nodes.txt`, queue the same nodes on a normal
partition, and save the new job ID in `control/continuation-job-id`.
After the controller exits with status 75 and the previous run is complete,
release the idle allocation. When the new keeper writes its job ID, run
`harness/resume_continuation.sh`. It checks the node order, devices, link speeds,
MTU and frozen build, then resumes only unfinished conditions. Analysis uses
the allocation ID saved for each run and includes all 16 measured runs.

No default change is part of this work.
21 changes: 21 additions & 0 deletions benchmark-harness/velo-response/check_consumers.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT=/lustre/fsw/coreai_comparch_trtllm/jothomson/dynamo-velo-response-20260923
SHARED=/lustre/fsw/coreai_comparch_trtllm/jothomson/dynamo-numa
export CARGO_HOME="$SHARED/cache/cargo-home" RUSTUP_HOME="$SHARED/cache/rustup"
export RUSTUP_TOOLCHAIN=1.96.1-aarch64-unknown-linux-gnu
export PROTOC="$SHARED/env/protoc-27.3/bin/protoc"
export PATH="$CARGO_HOME/bin:$(dirname "$PROTOC"):$PATH"
export CARGO_TARGET_DIR="$ROOT/target-runtime" CARGO_BUILD_JOBS=64 PCRE2_SYS_STATIC=1
export BINDGEN_EXTRA_CLANG_ARGS="-isystem $(gcc -print-file-name=include)"
VALIDATION="$ROOT/src/dynamo-validation"
if [[ ! -d "$VALIDATION" ]]; then
GIT_LFS_SKIP_SMUDGE=1 git -c core.hooksPath=/dev/null -C "$ROOT/src/dynamo" worktree add --detach "$VALIDATION" HEAD
fi
cd "$VALIDATION"
cargo metadata --format-version 1 --features dynamo-runtime/velo-ucx > "$ROOT/manifests/workspace-metadata.json"
cargo check -p kvbm-config -p kvbm-engine -p kvbm-physical --no-default-features
cargo metadata --manifest-path lib/bindings/kvbm/Cargo.toml --format-version 1 > "$ROOT/manifests/kvbm-metadata.json"
UCX_TLS=tcp cargo test -p dynamo-runtime --features velo-ucx --lib pipeline::network -- --test-threads=4
export PYTHONPATH="$ROOT/python-test-deps:$ROOT/src/dynamo/lib/bindings/python/src:$VALIDATION/components/src"
/lustre/fsw/coreai_comparch_trtllm/jothomson/dynamo-tyche-sidecar-agentx-c1024-dp1-20260910/src/dynamo/.venv/bin/python -m pytest -q -o addopts= -o filterwarnings=default components/src/dynamo/common/tests/configuration/test_runtime_args.py components/src/dynamo/common/tests/configuration/test_kv_router_args.py components/src/dynamo/mocker/tests/unit/test_config.py -k response_plane
Loading
Loading