Release notes#
0.1.0-beta.1 — preparation#
This is the first beta publication candidate, not a publication record.
The maintainer publishes and approves the tag separately. The last published
Rust milestone is 0.1.0-alpha.1 from 7cc48490; beta.1 is 0.1.0b1 on
PyPI. No Python release predates it. OrbiTE is a transfer engine for LLM
inference on NVIDIA; scope and non-goals
separate byte movement from the consumer’s cache and discovery policy.
Changes since alpha.1#
Rust is primary; Python is a PEP 8 binding to the same retained owners. The Rust inventory and Python inventory describe today’s surface, not a freeze. Public enums and field records are non-exhaustive except
TransferOp.NVLinkStatsbecameNvlinkStats,MemTypebecameTopologyMemoryKind, andMemoryBackingis the retained backing type. Hidden binding helpers require the Python crate’s exact core-version pin.TENT wire, API, configuration and naming compatibility are removed.
TentSettings,from_tent_*,MC_TENT_CONF, legacy environment mappings, TENT-shaped Python names and transport-ID conversions are gone. UseEngineConfig::from_json/from_file/from_env; onlyORBITE_CONFselects an environment document. Unknown keys and wrong types fail. Metrics useorbite_names. Frozen TENT v0.3.14 remains the design reference, CPU oracle and performance baseline, not a runtime dependency.C ABI, C++/classic-TE adapters, device plugin ABI and diagnostics C exports are removed. The CLI is
orbite diagnostics version [--json], replacingtent. Python ships notentormooncake.enginealias.Discovery is P2P-only. Consumers publish endpoint and authoritative source epoch. Rust
close_segmentfences a peer, drains it and reclaims identities after their last reference; uncertain cleanup stays retained and charged. Python segment close remains reversible handle invalidation.FABRIC/libfabric is excluded: NVIDIA platforms only; AWS EFA is a non-goal. Its feature, transport, configuration and metrics are removed; remaining transport discriminants are unchanged. CUDA fabric handles and MNNVL/EGM are unaffected. MPComm is deferred: no consumer or available provider.
File vectors accept retained host/CUDA ranges and padding: zero-fill on WRITE, discard on READ, with completed-prefix semantics. Runtime GDS disable and lazy probing preserve feature isolation and strict explicit selection.
rdma.gpu_direct_registration = auto | dmabuf | peermemadds a checked, fail-closed CUDA dma-buf route with optional verbs symbol lookup. Explicit Direct registration never silently becomes staging. Export flags remain zero; Grace topology-specific PCIe forcing is not implemented. The opt-in GPU source reuse route remains unqualified.Local-copy
submit(direction, descriptors, LocalCopyOptions)replaces the optional event argument; options carry intent, priority and readiness.kernel_cta_limitbounds the grid;kernel_threshold_backgrounddefaults tousize::MAX, keeping background DeviceToHost Auto on DMA until calibration.Noneretains the original CTA budget; normal Auto uses 128 compiled DMA operations.LocalCopyStatsadds per-class diagnostics and is no longerCopy. Forced backends, overlap ordering and event-retained owners remain. These APIs are Rust-only; installed calibration is unrun.TCP reuses bounded, epoch-scoped streams. Small eligible host-file work can complete on the caller with a deadline-bounded wait of at most 200 µs. Unfinished rings transfer to the existing drain owner without resubmission. Worker exit/start failures retain submitted owners as sticky
Unquiesced; exceptional GDS group paths settle common admission and metrics accounting.
Qualification and limits#
Profile on this source |
Evidence / limit |
|---|---|
TCP DRAM, configuration |
Qualified on Linux CI: named jobs and controls; loopback/multiple processes, not physical two-host qualification |
HP-TCP, SHM |
Qualified on Linux CI: loopback rails and same-host DRAM; no physical multi-rail or CXL claim |
io_uring DRAM/file |
Qualified on Linux CI: real ext4/tmpfs; unavailable kernels fail explicitly |
Python CPU/TCP and quickstart |
Installed-wheel CI, CPython 3.10–3.14, Linux x86_64/aarch64; exporter lifetime and GIL controls remain. Including native features in a wheel does not qualify hardware |
GPU, RDMA, GDS, NVLink, MNNVL/EGM, CXL and physical rails |
Implemented; installed profiles unqualified on this artifact. Older H20/RoCE artifacts qualify only their recorded revisions. Verification queue |
Missing public documentation remains a pre-0.1.0 gate: close the findings and
turn the audit into -D missing-docs. The NIXL plugin is not implemented; its
upstream and hardware prerequisites remain separate.
Known performance limits#
These are byte-checked CPU-runner measurements, not general speed guarantees. Benchmarks pins revisions, hosts, sample counts and every row; raw results remain CI artifacts. p99 uses 100 samples per trial. Timed WRITEs exclude durability barriers. There is no GPU, RNIC or physical NVMe claim.
Workload |
Recorded result / remaining limit |
|---|---|
Scattered 64 × 4 KiB TCP |
READ p50 8.59→4.23 ms; WRITE 9.33→6.30 ms, still 3.7% above TENT’s 6.07 ms on the paired runner. Single 4 KiB READ CPU falls 370→190 µs; TENT 256 µs. One exclusive lane per peer has no concurrent-caller performance claim |
Small tmpfs WRITE (#193) |
4 KiB p50 117.9→57.3 µs on stable and 192.8→76.1 µs on 1.85; after/TENT 1.02×/0.96×. A missed caller window still needs worker drain |
Bounded-wait trade-off (#193) |
Stable tmpfs 4 KiB READ p50 +9.3%; ext4 64 KiB WRITE p99 331→544 µs (+64.4%), separate trial ranges. A miss can delay handoff; its contribution versus VM/device variation is not isolated |
Clean-harness ext4 tail (#186) |
Rust 1.85 gapped WRITE p99 16.26 ms versus TENT 3.59 ms, overlapping three-trial ranges. Bulk-verifier and offered-load counterfactuals reproduce the tail in unchanged TENT. This stays a P11 limit; physical NVMe measurement is in the hardware batch, with no more virtual-disk tuning planned |
Other TCP regression |
Rust 1.85 64 MiB READ p50/p99 +2.8%/+10.7% while CPU falls 4.2%; wake latency versus host variation is not isolated |
Earlier S26 ext4 values are old-harness evidence: truncate/rewrite reset
writeback overlapped 31,999 of 32,000 measured windows. Both harnesses now
preallocate once, reset in place and fdatasync before timing; zero fixed
windows contained reset writeback. The intermediate clean-reset comparison
still used different verification reads. Keep those historical tables under
reset isolation and the subsequent
block-layer comparison;
they are not current release performance claims.
Compatibility boundary#
Breaking Rust/Python API changes remain allowed before 0.1.0, including between
betas. The 0.1.x API and wire freeze begins at 0.1.0: same-0.1.x peers will
interoperate, with breaking API or wire changes requiring a minor bump under
0.x semver. Until then, both peers must run the same build. The native
control-plane VERSION remains 1 and cannot detect a build mismatch;
there is no pre-0.1.0 compatibility promise. See the
wire rule. Timeout, cancellation
and logical terminal status never substitute for physical retirement, and an
uncertain WRITE is never replayed.
Maintainer publication procedure#
This section configures a future publication. This PR creates no tag, package
publication or GitHub Release. Source versions stay 0.1.0-beta.1 and
0.1.0b1. Only the maintainer approves publication.
One-time setup#
Use PyPI Trusted Publishing
and crates.io Trusted Publishing,
so neither job stores a long-lived registry token. The crate already exists
under owner feichai0017; the Python distribution is a pending publisher until
its first successful upload (a pending publisher does not reserve the name).
In repository Settings → Environments, create
pypiandcrates-io. Each must require a maintainer reviewer (for examplefeichai0017), prohibit administrator bypass, and allow deployment tags matchingv*only, no branches. If the sole maintainer also starts the run, leave “prevent self-review” off so that their separate approval is possible; enabling it requires a second authorized reviewer. Do not run a publishing tag before these protection rules exist. GitHub must offer required reviewers for the repository’s visibility/plan.In the maintainer’s PyPI account, Publishing → Add a new pending publisher: project
orbite, ownerOrbitInfra, repositoryOrbiTE, workflow filenamerelease.yml, environmentpypi. Confirm the name remains available. After first upload, manage the publisher under the project’s Publishing tab.As the existing crates.io owner, add a GitHub trusted publisher to
orbite: ownerOrbitInfra, repositoryOrbiTE, workflowrelease.yml, environmentcrates-io. No publisher is configured for the unpublished Python Rust crate.Allow the pinned official publishing actions. Only the two protected jobs receive
id-token: write. Only the final GitHub Release job receivescontents: write. Build/test jobs have read-only repository access.
The published wheels are the combined RDMA/CUDA/io_uring/GDS/metrics
profile, one for each CPython 3.10–3.14 × Linux x86_64/aarch64. They are built
in pinned official manylinux 2.28 images
with maturin --manylinux 2_28, supporting glibc 2.28 and newer (including
RHEL/Rocky 8 and Ubuntu 20.04). No dependency requires a newer glibc.
The artifact check rejects grafted verbs/provider, CUDA and cuFile libraries;
ELF checks reject linked verbs symbols. Every publication wheel runs the
unchanged quickstart in a separate container without those libraries.
CPU quickstarts need none of them. Configured GPU/RDMA/GDS paths need the
host’s NVIDIA driver, rdma-core/providers and cuFile respectively, and remain
unqualified on hardware for this artifact. The sdist uses the same profile and its rebuild
requires native build headers. CPU + io_uring and MSRV wheels remain review
artifacts; profiles share filenames and must never be uploaded together.
Build dependency installation checks dpkg -s first. Only absent packages
are requested, with at most three 180-second update/install attempts that
alternate the runner mirror and Ubuntu’s archive (ports on aarch64). Exhaustion
is fatal. No failed test job is retried automatically. The workflow recovery
hook retries only an initial failed run whose created jobs all succeeded or
were skipped, the GitHub uncreated-matrix failure case. Tag and dispatched
release runs are excluded; their registry receipts always require manual review.
Review and dry run#
A pull request from a release/ branch runs release.yml as a dry run.
It calls the ordinary CI, wheel and oracle jobs once; their standalone PR
instances skip only to avoid duplicate copies of those same jobs.
After merge, the maintainer can also run:
gh workflow run release.yml --repo OrbitInfra/OrbiTE --ref main -f dry_run=true
gh run list --repo OrbitInfra/OrbiTE --workflow release.yml
# Choose the displayed run ID; then watch and download its tested artifacts.
gh run watch RUN_ID --repo OrbitInfra/OrbiTE --exit-status
gh run download RUN_ID --repo OrbitInfra/OrbiTE --name release-artifacts --dir release-artifacts
(cd release-artifacts && sha256sum -c SHA256SUMS)
The workflow checks versions, exact Python core pin and tag, reruns both
Rust toolchains/all CI features, strict docs and docs.rs without verbs headers,
the frozen oracle/480-row comparisons, all wheels and the sdist rebuild.
It installs and runs the packaged quickstarts. Package allowlists reject logs,
traces (except the frozen CPU fixture), generated HTML and hardware run output.
The reviewed set contains ten wheels, one sdist, one .crate, SHA256SUMS and
these release notes. Dry runs cannot obtain registry credentials or publish.
Approved publication and partial failure#
Only after separate approval, from the accepted clean commit:
git switch main
git pull --ff-only
# Verify HEAD is the approved release-preparation commit before creating the tag.
git tag -a v0.1.0-beta.1 -m 'OrbiTE 0.1.0-beta.1'
git push origin refs/tags/v0.1.0-beta.1
The tag starts a fresh gate/build run. Mismatched tags fail, including during
dry runs. Approve each environment only after reviewing the gates and artifact
hashes. The publishing jobs run once, verify registry SHA-256 receipts, and
only then create a prerelease on GitHub for the existing tag with notes and
checksums. Receipt visibility can lag a successful upload: the checker polls
missing entries or HTTP 404 within a 60-second budget, at most 13 reads. A
different checksum or other read error fails immediately. This never repeats
an upload. No branch/manual run can publish unless its ref is that matching tag.
For an existing tag, an explicitly approved manual run uses
gh workflow run release.yml --ref v0.1.0-beta.1 -f dry_run=false; do not use it
to blindly repeat a partly successful publication.
If one registry fails, the workflow summary preserves the other’s result and
creates no GitHub Release. A failed upload may already have published some
files. Compare PyPI’s version JSON filename/digest list and crates.io’s version
checksum with the retained SHA256SUMS before recovery. Do not move the tag,
rebuild a different artifact under the same version, enable skip-existing,
or rerun successful publishing jobs. A maintainer may rerun only a failed job
once they establish that it uploaded nothing. For partial PyPI uploads, approve
a recovery uploading only the missing files from the original checked set;
for a verification/network failure after upload, verify receipts read-only.
python3 scripts/verify-registry.py pypi release-artifacts and the
crates-io variant perform those checks without uploading. Create the GitHub
Release only after both complete receipts are verified. No automatic recovery
or deletion of published versions is part of this workflow.