Skip to content

Releases: trackdubllc/LinML

LinML v0.5.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 08:29
b3adb5d

What's Changed

  • Fix MIGraphX EP fetch on nested licenses; add QNN plugin to the catalog by @tonythethompson in #35
  • Ship the patched WSL2 TensorRT-RTX build against glibc 2.35 (0.5.1) by @tonythethompson in #36

Full Changelog: v0.5.0...v0.5.1

LinML v0.5.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 05:21

LinML 0.5.0 adds TensorRT-RTX on Linux aarch64 (SBSA), makes provider selection and discovery consistent across commands, and changes a few CLI behaviors (see Behavior changes).

Highlights

  • TensorRT-RTX on Linux aarch64 (SBSA). NVIDIA's TensorRT-RTX 1.6 supports Ubuntu 24.04 SBSA. On aarch64 hosts LinML now selects the aarch64 wheel (manylinux_2_35, the same EP 0.4.0 and bundled TensorRT-RTX 1.6.1 runtime). It installs to ep-plugins/trt-rtx-arm64/, beside the x86_64 build. The catalog and the fetch script refuse a glibc older than 2.35 before downloading.
  • Standalone plugin downloads. TensorRT-RTX and MIGraphX install from curl, sha256sum and unzip commands, without cloning the repository. See Plugin Execution Providers in the README.

Behavior changes

  • requestedProvider is null when no --provider is given. run, serve and --profile report requested: auto in text output. Auto selection never counts as a fallback.
  • A failed explicit --provider X falls back to CPU, not to another accelerator such as TensorRT.
  • Usage errors exit with code 2, as documented. Missing or unknown options print one message instead of the full help.

Fixed

  • providers list matches doctor: catalog plugins are registered before discovery, so trt-rtx and OpenVINO appear. A plugin with no EP devices is marked as such. providers list also gained --root.
  • catalog list reads plugin status after the resolvable plugins are registered, so a working trt-rtx reads Ready. catalog install prints the active library when it differs from the installed one.
  • doctor --model: the smoke Load phase counts plugin EP devices, and each provider gets its catalog libraries. trt-rtx no longer reads NOT READY in smoke mode.
  • Readiness messages: a plugin that is loaded but has no devices says so, and no longer suggests a missing library.
  • serve --port answers on http://localhost:<port> as well as 127.0.0.1.
  • --json is listed once per command, and the global option works before or after the subcommand.
  • --version reports the 0.5 line.

Install

Pre-built archives are on this page: linml-0.5.0-linux-x64.tar.gz and linml-0.5.0-linux-arm64.tar.gz. Check them against SHA256SUMS.txt:

sha256sum -c SHA256SUMS.txt --ignore-missing

Not verified

  • The aarch64 TensorRT-RTX plugin has not been run on aarch64 hardware. The aarch64 CI job runs the test suite, but it has no GPU.
  • The MIGraphX plugin's positive path (an AMD GPU with ROCm) has not been run; its unit tests and the download checks pass.

What's Changed

Full Changelog: v0.4.2...v0.5.0

LinML v0.4.2

Choose a tag to compare

@github-actions github-actions released this 13 Oct 03:02
49cbc37

What's Changed

Full Changelog: v0.4.1...v0.4.2

TensorRT-RTX WSL2 EP 0.4.0-wsl2p2 (opt-in prerelease)

Choose a tag to compare

Opt-in build of NVIDIA's TensorRT-RTX plugin execution provider
(NvTensorRTRTXExecutionProvider) carrying the WSL2 device-enumeration fix
from upstream PR #12.

What changed from 0.4.0-wsl2p1

0.4.0-wsl2p1 was built on a host with glibc 2.43 and needed GLIBC_2.43 (also GLIBCXX_3.4.32, CXXABI_1.3.15), so it failed to load on any distro older than that host, including Ubuntu 24.04 (glibc 2.39): libm.so.6: version `GLIBC_2.43' not found. Do not use p1. This build is the same source commit and the same patch, rebuilt in an ubuntu:22.04 container: it needs at most GLIBC_2.34, GLIBCXX_3.4.29 and CXXABI_1.3.9, so it loads on Ubuntu 22.04, 24.04 and newer, like the stock wheel (manylinux_2_35).

Why

Under WSL2 the stock PyPI wheel registers but exposes zero devices: ONNX
Runtime reports the GPU with the virtual PCI vendor 0x1414 and bus id
176e:00:00.0, which cudaDeviceGetByPCIBusId rejects (rc=101), while CUDA
sees the real device as 0000:0B:00.0. The fix pairs Microsoft virtual
adapters with visible CUDA devices and falls back to CUDA enumeration so the EP
exposes the real GPU.

Requirements

  • WSL2 with NVIDIA GPU passthrough (/dev/dxg), and an RTX Ampere or newer GPU. NVIDIA's TensorRT-RTX 1.6 matrix targets compute capabilities 7.5, 8.6, 8.9, 12.0 and 12.13.
  • ONNX Runtime 1.24 or newer.
  • glibc 2.35 or newer (Ubuntu 22.04+), the same floor as the stock wheel.
  • The stock trt-rtx wheel, installed by the first block below. It supplies the TensorRT-RTX 1.6.1 runtime that this build links against.

Install

No repository clone is needed. Run the two blocks in order. The first installs the stock wheel for this machine's architecture. The second installs this patched build, which is x86_64 only.

(
  set -euo pipefail
  DEPS="$HOME/.local/linml-deps"
  TMP="$(mktemp -d)"
  case "$(uname -m)" in
    x86_64)
      WHEEL=onnxruntime_ep_nv_tensorrt_rtx_cu13-0.4.0-py3-none-manylinux_2_28_x86_64.whl
      URL=https://files.pythonhosted.org/packages/9c/68/093626a054300fa7f4f1a6d18b775d185034c6bb7fb056ac4f9d1e9b50d4/$WHEEL
      SHA256=68b8f7306b50cf76daf997b8be24ec3813498c15d48e0ddd211db14f2a9daa19
      DIR=trt-rtx ;;
    aarch64)
      WHEEL=onnxruntime_ep_nv_tensorrt_rtx_cu13-0.4.0-py3-none-manylinux_2_35_aarch64.whl
      URL=https://files.pythonhosted.org/packages/41/63/ef110d73730969957740d770b29c158ca79a9df32c65ee081b01f8b64124/$WHEEL
      SHA256=0ccf6a636f9f49d74e3e7e3b1b90287aa1c818db770b47fad6e8aa344f4290a5
      DIR=trt-rtx-arm64
      # The aarch64 wheel is manylinux_2_35: refuse an older glibc before downloading it.
      GLIBC="$(getconf GNU_LIBC_VERSION 2>/dev/null | awk '{print $2}')" || GLIBC=""
      if [ -z "$GLIBC" ] || [ "$(printf '%s\n' 2.35 "$GLIBC" | sort -V | head -n 1)" != "2.35" ]; then
        echo "needs glibc 2.35 or newer; this host has ${GLIBC:-no glibc}" >&2; false
      fi ;;
    *) echo "No TensorRT-RTX build for $(uname -m)" >&2; false ;;
  esac
  OUT="$DEPS/ep-plugins/$DIR/onnxruntime_ep_nv_tensorrt_rtx"
  mkdir -p "$OUT"
  curl -fsSL -o "$TMP/$WHEEL" "$URL"
  echo "$SHA256  $TMP/$WHEEL" | sha256sum -c
  unzip -q -j -o "$TMP/$WHEEL" 'onnxruntime_ep_nv_tensorrt_rtx/*' -d "$OUT"
  # The plugin links SONAMEs, but the wheel ships only versioned files: add the links.
  (cd "$OUT" &&
    ln -sf libtensorrt_rtx.so.1.6.1 libtensorrt_rtx.so.1 &&
    ln -sf libtensorrt_onnxparser_rtx.so.1.6.1 libtensorrt_onnxparser_rtx.so.1 &&
    ln -sf "$(ls libcudart.so.13.* | head -n 1)" libcudart.so.13)
  rm -rf "$TMP"
  echo "TensorRT-RTX installed to $OUT"
)
(
  set -euo pipefail
  DEPS="$HOME/.local/linml-deps"
  TMP="$(mktemp -d)"
  ZIP=linml-trt-rtx-ep-0.4.0-wsl2p2-linux-x64.zip
  URL=https://github.com/trackdubllc/LinML/releases/download/ep-trt-rtx-wsl2-0.4.0-wsl2p2/$ZIP
  SHA256=7575c51157110228d581593c04147473868fbb7eefc79aa1b809c5b8bb66c220
  OUT="$DEPS/ep-plugins/trt-rtx-wsl2/linml_trt_rtx_ep"
  curl -fsSL -o "$TMP/$ZIP" "$URL"
  echo "$SHA256  $TMP/$ZIP" | sha256sum -c
  rm -rf "$OUT"   # replaces any earlier build, e.g. 0.4.0-wsl2p1
  mkdir -p "$OUT"
  unzip -q -o "$TMP/$ZIP" 'linml_trt_rtx_ep/*' -d "$TMP/unpacked"
  cp -r "$TMP/unpacked/linml_trt_rtx_ep/." "$OUT/"
  rm -rf "$TMP"
  echo "Patched TensorRT-RTX installed to $OUT"
)

Or, with the LinML CLI: linml setup --trt-rtx-wsl2 installs both.

In a repository checkout, source scripts/env-gpu-deps.sh prefers this build when it is vendored, and TRT_RTX_CUSTOM_EP overrides it.

Verify

linml providers list    # NvTensorRTRTXExecutionProvider appears, with its GPU device
linml doctor            # readiness per provider; MIGraphX reports NOT APPLICABLE without AMD ROCm
linml run --provider trt-rtx --require-provider --model model.onnx --inputs inputs.json
linml run --provider migraphx --require-provider --model model.onnx --inputs inputs.json

A successful run prints Provider: NvTensorRTRTXExecutionProvider (requested: NvTensorRTRTXExecutionProvider).

This build is opt-in: the default trt-rtx pin still points at NVIDIA's wheel. On WSL2 the CLI uses this build only once it is installed.

Contents

  • linml_trt_rtx_ep/libonnxruntime_providers_nv_tensorrt_rtx.so — the patched
    plugin (Apache-2.0; see licenses/ and PATCH-NOTICE.md).
  • linml_trt_rtx_ep/build-info.json — provenance (source commit, ONNX Runtime
    headers, TensorRT-RTX version).

Only the EP .so is shipped; it dynamically links the TensorRT-RTX 1.6.1
runtime libraries and CUDA 13, which the stock trt-rtx wheel provides. The
archive RUNPATH is $ORIGIN.

Provenance

  • Source: https://github.com/tonythethompson/TensorRT-RTX-EP-ABI @
    6777dafa257dd569f489f1708473d5bee0f0a6d7 (upstream PR #12 head, including
    the per-GPU registration commit that the enumeration fix alone needs).
  • Built by scripts/build-trt-rtx-ep-docker.sh (scripts/build-trt-rtx-ep.sh in an ubuntu:22.04 container; scripts/check-elf-floor.sh fails the build if the library needs a newer glibc / libstdc++ than 2.35 / 3.4.30) against ONNX Runtime 1.31.0 headers and
    TensorRT-RTX 1.6.1.120; the archive is byte-stable and pinned by sha256
    (linml-trt-rtx-ep-0.4.0-wsl2p2-linux-x64.zip.sha256).
  • License: Apache-2.0 (unchanged); see PATCH-NOTICE.md for the modification
    notice required by section 4(b).

Verified

objdump -T on the library: GLIBC_ max 2.34, GLIBCXX_ max 3.4.29, CXXABI_ max 1.3.9. NEEDED and RUNPATH are unchanged from p1.

With the stock wheel and this build vendored, ExecutionProviderCatalog.GetDefault().Find(ProviderId.TensorrtRtx)!.EnsureReadyAsync(new EnsureOptions(true)) returns Ready with 1 device and MNIST returns the exact output [11, 22, 13, 24, 15, 26], in fresh ubuntu:24.04 (glibc 2.39) and ubuntu:22.04 (glibc 2.35) containers started with --gpus all on Docker Desktop (WSL2, RTX 5070).

Superseded by

Once PR #12 merges (or NVIDIA ships a fixed wheel), use the default trt-rtx
pin instead.

LinML v0.4.1

Choose a tag to compare

@github-actions github-actions released this 12 Oct 14:24

What's Changed

  • feat(setup): vendor GPU libs, gate OpenVINO to Intel, opt-in WSL2 TRT-RTX by @tonythethompson in #26
  • feat(doctor): hint when vendored libs are installed but fail to load by @tonythethompson in #27

Full Changelog: v0.4.0...v0.4.1

LinML v0.4.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 11:15

LinML v0.4.0

This release adds a Python package for running inference from Python and an opt-in patched TensorRT-RTX plugin that makes the GPU visible under WSL2. It also makes linux-arm64 builds more reliable.

Highlights

Python package

LinML can now be driven from Python.

  • New linml package with InferenceClient and InferenceSession.
  • A CLI wheel bundles the linml binary, so pip install gives you a working CLI.
  • Results now include per-run latency (LatencyMs) and node placement diagnostics, so you can see which execution provider ran each node.
  • Input handling is stricter and clearer:
    • Scalar (rank-0) inputs and outputs are handled correctly.
    • Unsupported boolean tensors raise a clear ValueError.
    • linml.doctor() validates that inputs were supplied.
  • The session manager checks that the server it connects to is serving the model you asked for, so it won't take over an unrelated local server. It also supports IPv6 hosts and has separate startup and request timeouts.
  • The Python wrapper can no longer call itself recursively when it looks for the CLI binary.

TensorRT-RTX on WSL2 (opt-in)

Under WSL2 the stock TensorRT-RTX plugin registers its execution provider but finds no GPU, because WSL2 reports the device with a virtual PCI ID that CUDA rejects.

  • We now ship a patched build that pairs the virtual adapter with the CUDA devices it can see.
  • It is opt-in. The default pin still points to NVIDIA's wheel. To install the patched build:
    bash scripts/fetch-ep-plugins.sh trt-rtx-wsl2
  • Library resolution order is TRT_RTX_CUSTOM_EP, then the vendored WSL2 build, then the stock wheel. TRT_RTX_CUSTOM_EP is now honoured by the CLI.
  • scripts/build-trt-rtx-ep.sh rebuilds the plugin reproducibly, so you can audit it.

linux-arm64

  • linml setup now correctly detects plugins that are already installed on ARM64 (including --dry-run).
  • Release builds of the self-contained linux-arm64 binary are fixed (see Fixes below).

Fixes

  • Release pipeline: the self-contained linux-arm64 publish failed because its runtime was never restored. It is now restored explicitly.
  • Release pipeline: verification no longer tries to run the arm64 binary on an x64 runner. arm64 is still tested natively in CI.
  • CI (ARM64): ONNX Runtime native libraries are installed and LD_LIBRARY_PATH is set, integration tests are excluded from the ARM64 job, and the "already installed" test is skipped on ARM64 because no plugins are recommended there.

Upgrade notes

  • No breaking changes to the CLI or the C# libraries.
  • WSL2 users who want GPU access through TensorRT-RTX should install the patched plugin with the command above.

Downloads

  • linml-linux-x64.tar.gz and linml-linux-arm64.tar.gz, both self-contained, with SHA-256 sums in SHA256SUMS.txt.
  • NuGet: LinML.Contracts and LinML.Catalog 0.4.0.

Full changelog: v0.3.0...v0.4.0

LinML v0.3.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 09:12

LinML v0.3.0 — Model Inspection & Hardened Foundations

🎯 Highlights

  • New linml inspect command — inspect ONNX models without running inference. Reports model identity (SHA-256, size), IR version, opset imports, producer metadata, input/output tensor shapes & dynamic dimensions, graph structure (node count, distinct operators), and per-execution-provider compatibility warnings.
  • Streaming, memory-safe inspection — large models no longer loaded entirely into managed memory; SHA-256 and protobuf parsing stream via FileStream.
  • Hardened protobuf parser — varint length limits, bounds-checked seeks, and graceful error handling for malformed/corrupted ONNX files.
  • Complete fixture & test alignment — fixture model regenerated with stable tensor names (x/y); all integration tests, inputs.json, and manifest updated consistently.

✨ New Features

linml inspect

# Human-readable output
linml inspect --model model.onnx

# Machine-readable JSON for tooling
linml inspect --model model.onnx --json

Report includes:

  • Model identity: file path, SHA-256, size in bytes
  • ONNX metadata: IR version, opset imports (domain + version), producer name/version, domain, model version, description, custom metadata properties
  • Tensor signatures: for each input/output — name, data type, shape, static/dynamic status, symbolic dimension names
  • Graph topology: node count, distinct operator types (alphabetically sorted)
  • Execution Provider compatibility advisories (per provider):
    • CUDA: cuDNN requirement for convolutions, FP16 Tensor Core hints
    • TensorRT: dynamic dimension warnings, unsupported operator list (control flow, NMS, etc.)
    • OpenVINO: opset version ceiling (≤ 21)
    • MIGraphX: control-flow partitioning to CPU

Contracts & Internals

  • IModelInspector / ModelInspectionReport — strongly-typed contracts in LinML.Contracts for programmatic access
  • OnnxModelInspector — combines streaming protobuf parsing (OnnxProtobufReader) with InferenceSession metadata
  • EpCompatibilityAnalyzer — static analysis of operators, opsets, and tensor dimensions for EP-specific warnings

🔧 Fixes & Improvements

Area Change
Memory InspectAsync streams file twice (hash + parse) instead of ReadAllBytesAsync — no OOM on large models
Safety ReadVarint caps at 10 bytes; all length-delimited seeks validated against stream bounds
Robustness Protobuf parser throws InvalidDataException on malformed input instead of crashing/looping
Fallback When InferenceSession fails to open, inspector attempts protobuf tensor extraction (hook in place; full fallback planned)
Output Human-readable report now shows symbolic dimensions for outputs (previously only inputs)
Fixtures Test fixture regenerated with x/y tensor names; inputs.json, fixture-manifest.json, and all 6 integration test files updated

🧪 Quality

  • Build: dotnet build --warnaserror — 0 warnings, 0 errors
  • Tests passing locally: Integration (20/20), Runtime.Onnx (26/26), CLI inspect (4/4), Policy (23/23), Catalog (33/33)
  • CI: GitHub Actions upgraded to latest action versions (checkout v7, setup-dotnet v6, upload-artifact v7, download-artifact v8) — no Node.js 20 deprecation warnings

📦 Assets

Asset Description
linml-0.3.0-linux-x64.tar.gz Self-contained CLI binary (linux-x64) + helper scripts
linml-linux-x64.tar.gz Unversioned alias (latest)
SHA256SUMS.txt SHA-256 checksums for verification

🔗 Links


Upgrading

# Download and verify
curl -L -o linml-0.3.0-linux-x64.tar.gz https://github.com/trackdubllc/LinML/releases/download/v0.3.0/linml-0.3.0-linux-x64.tar.gz
sha256sum -c SHA256SUMS.txt  # verify

# Extract and run
tar -xzf linml-0.3.0-linux-x64.tar.gz
./linml --help

🙏 Contributors

@tonythethompson (all changes this release)

LinML v0.2.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 02:13

LinML v0.2.0 — Plugin EP Catalog & Hardware Auto-Setup

🎯 Highlights

  • Complete plugin EP catalog — OpenVINO 1.6.1, TensorRT-RTX 0.4.0, and MIGraphX 2611.1 (AMD ROCm) now fully integrated with SHA-256 verification, automatic download, and session attachment.
  • linml setup hardware auto-setup — detects host compute accelerators (NVIDIA GPUs, Intel CPUs/GPUs, AMD ROCm GPUs, CPU vector extensions) and automatically installs matching vendor plugin EPs.
  • linml catalog CLI — inspect, download, install, and verify plugin EPs directly from the command line.
  • CI-built MIGraphX EP — reproducible GitHub Actions build of AMD's MIGraphX plugin EP (onnxruntime-ep-amdgpu) with pinned version, SHA-256 verification, and GitHub Release assets.

✨ New Features

linml setup — Hardware Auto-Setup

# Preview hardware detection and recommended plugins without installing
linml setup --dry-run

# Automatically install all matching vendor plugins for detected hardware
linml setup

# Install all catalog plugins regardless of hardware
linml setup --all

# Machine-readable output with hardware inventory and installation plan
linml setup --dry-run --json

Detects: NVIDIA GPUs (via nvidia-smi), Intel CPUs/GPUs, AMD ROCm GPUs, CPU vector extensions (AVX2, AVX-512, AMX).
Installs: OpenVINO, TensorRT-RTX, MIGraphX plugin EPs with SHA-256 verification.

linml catalog — Plugin EP Catalog CLI

# List all 6 execution providers with type, version, readiness status, and location
linml catalog list

# JSON format
linml catalog list --json

# Install a specific plugin execution provider (download, verify SHA256, create symlinks)
linml catalog install openvino
linml catalog install trt-rtx
linml catalog install migraphx

# Install all plugin execution providers
linml catalog install all

# Force re-installation or specify custom cache root
linml catalog install openvino --force --root ~/.local/linml-deps

LinML.Catalog Library

LinML.Catalog is the Linux counterpart to Windows ML's ExecutionProviderCatalog. It unifies:

  • Built-in EPs: CPUExecutionProvider, CUDAExecutionProvider, TensorrtExecutionProvider
  • Plugin EPs: OpenVINOExecutionProvider (1.6.1), NvTensorRTRTXExecutionProvider (0.4.0), MIGraphXExecutionProvider (2611.1)

Key capabilities:

  • Automatic vendoring of pinned plugin EPs with SHA-256 integrity verification
  • Dynamic registration via PluginLibraryRegistry (shared with CLI)
  • AppendFromCatalog() extension method for SessionOptions
  • Readiness probing with clear install hints for missing plugins
using LinML.Catalog;
using LinML.Contracts;

IExecutionProviderCatalog catalog = ExecutionProviderCatalog.GetDefault();
IExecutionProvider openVino = catalog.Find(ProviderId.OpenVino)!;
ProviderEnsureResult ensured = await openVino.EnsureReadyAsync(new EnsureOptions(AllowDownloads: true));

using var sessionOptions = new SessionOptions();
if (ensured.IsReady)
{
    ProviderAppendResult result = sessionOptions.AppendFromCatalog(openVino, [OrtHardwareDeviceType.CPU]);
}

MIGraphX EP Plugin (CI-Built)

  • Source: onnxruntime-ep-amdgpu (AMD's official repo)
  • Pinned version: 2611.1 (configurable via EP_VERSION in scripts/build-migraphx-ep.sh)
  • Build: ROCm 10.0 container in GitHub Actions (rocm/dev-ubuntu-24.04:10.0.0-full)
  • Artifacts: SHA-256 verified, uploaded to GitHub Release ep-migraphx-<version>
  • Verification: Catalog pins by URL + SHA-256; published release never overwritten

🔧 Improvements

Area Change
Verification All plugin EPs verified with SHA-256; catalog refuses mismatched downloads
WSL2 TensorRT-RTX EP correctly detected as WSL2-incompatible (virtual PCI constraint)
Dependencies scripts/setup-gpu-deps.sh installs cuDNN 9.x + TensorRT 10.x to ~/.local/linml-deps
Environment scripts/env-gpu-deps.sh exports LD_LIBRARY_PATH and LINML_EP_LIBRARIES

🧪 Quality

  • Build: dotnet build --warnaserror — 0 warnings, 0 errors
  • Tests: Integration (CPU/CUDA/TensorRT), Catalog (plugin install/registration), Policy (fallback/selection)
  • CI: Separate MIGraphX EP build workflow; main CI validates all built-in EPs

📦 Assets

Asset Description
linml-0.2.0-linux-x64.tar.gz Self-contained CLI binary (linux-x64) + helper scripts
linml-linux-x64.tar.gz Unversioned alias (latest)
SHA256SUMS.txt SHA-256 checksums for verification

🔗 Links


Upgrading

# Download and verify
curl -L -o linml-0.2.0-linux-x64.tar.gz https://github.com/trackdubllc/LinML/releases/download/v0.2.0/linml-0.2.0-linux-x64.tar.gz
sha256sum -c SHA256SUMS.txt  # verify

# Extract and run
tar -xzf linml-0.2.0-linux-x64.tar.gz
./linml --help

🙏 Contributors

@tonythethompson (all changes this release)

TensorRT-RTX WSL2 EP 0.4.0-wsl2p1 (opt-in prerelease)

Choose a tag to compare

Opt-in build of NVIDIA's TensorRT-RTX plugin execution provider
(NvTensorRTRTXExecutionProvider) carrying the WSL2 device-enumeration fix
from upstream PR #12.

Why

Under WSL2 the stock PyPI wheel registers but exposes zero devices: ONNX
Runtime reports the GPU with the virtual PCI vendor 0x1414 and bus id
176e:00:00.0, which cudaDeviceGetByPCIBusId rejects (rc=101), while CUDA
sees the real device as 0000:0B:00.0. The fix pairs Microsoft virtual
adapters with visible CUDA devices and falls back to CUDA enumeration so the EP
exposes the real GPU.

Requirements

  • WSL2 with NVIDIA GPU passthrough (/dev/dxg), and an RTX Ampere or newer GPU. NVIDIA's TensorRT-RTX 1.6 matrix targets compute capabilities 7.5, 8.6, 8.9, 12.0 and 12.13.
  • ONNX Runtime 1.24 or newer.
  • The stock trt-rtx wheel, installed by the first block below. It supplies the TensorRT-RTX 1.6.1 runtime that this build links against.

Install

No repository clone is needed. Run the two blocks in order. The first installs the stock wheel for this machine's architecture. The second installs this patched build, which is x86_64 only.

(
  set -euo pipefail
  DEPS="$HOME/.local/linml-deps"
  TMP="$(mktemp -d)"
  case "$(uname -m)" in
    x86_64)
      WHEEL=onnxruntime_ep_nv_tensorrt_rtx_cu13-0.4.0-py3-none-manylinux_2_28_x86_64.whl
      URL=https://files.pythonhosted.org/packages/9c/68/093626a054300fa7f4f1a6d18b775d185034c6bb7fb056ac4f9d1e9b50d4/$WHEEL
      SHA256=68b8f7306b50cf76daf997b8be24ec3813498c15d48e0ddd211db14f2a9daa19
      DIR=trt-rtx ;;
    aarch64)
      WHEEL=onnxruntime_ep_nv_tensorrt_rtx_cu13-0.4.0-py3-none-manylinux_2_35_aarch64.whl
      URL=https://files.pythonhosted.org/packages/41/63/ef110d73730969957740d770b29c158ca79a9df32c65ee081b01f8b64124/$WHEEL
      SHA256=0ccf6a636f9f49d74e3e7e3b1b90287aa1c818db770b47fad6e8aa344f4290a5
      DIR=trt-rtx-arm64
      # The aarch64 wheel is manylinux_2_35: refuse an older glibc before downloading it.
      GLIBC="$(getconf GNU_LIBC_VERSION 2>/dev/null | awk '{print $2}')" || GLIBC=""
      if [ -z "$GLIBC" ] || [ "$(printf '%s\n' 2.35 "$GLIBC" | sort -V | head -n 1)" != "2.35" ]; then
        echo "needs glibc 2.35 or newer; this host has ${GLIBC:-no glibc}" >&2; false
      fi ;;
    *) echo "No TensorRT-RTX build for $(uname -m)" >&2; false ;;
  esac
  OUT="$DEPS/ep-plugins/$DIR/onnxruntime_ep_nv_tensorrt_rtx"
  mkdir -p "$OUT"
  curl -fsSL -o "$TMP/$WHEEL" "$URL"
  echo "$SHA256  $TMP/$WHEEL" | sha256sum -c
  unzip -q -j -o "$TMP/$WHEEL" 'onnxruntime_ep_nv_tensorrt_rtx/*' -d "$OUT"
  # The plugin links SONAMEs, but the wheel ships only versioned files: add the links.
  (cd "$OUT" &&
    ln -sf libtensorrt_rtx.so.1.6.1 libtensorrt_rtx.so.1 &&
    ln -sf libtensorrt_onnxparser_rtx.so.1.6.1 libtensorrt_onnxparser_rtx.so.1 &&
    ln -sf "$(ls libcudart.so.13.* | head -n 1)" libcudart.so.13)
  rm -rf "$TMP"
  echo "TensorRT-RTX installed to $OUT"
)
(
  set -euo pipefail
  DEPS="$HOME/.local/linml-deps"
  TMP="$(mktemp -d)"
  ZIP=linml-trt-rtx-ep-0.4.0-wsl2p1-linux-x64.zip
  URL=https://github.com/trackdubllc/LinML/releases/download/ep-trt-rtx-wsl2-0.4.0-wsl2p1/$ZIP
  SHA256=e87adedba3dfc86ea96cd7c6f5b9a965de584aeda971ee7792ae6d1e0074d2df
  OUT="$DEPS/ep-plugins/trt-rtx-wsl2/linml_trt_rtx_ep"
  curl -fsSL -o "$TMP/$ZIP" "$URL"
  echo "$SHA256  $TMP/$ZIP" | sha256sum -c
  mkdir -p "$OUT"
  unzip -q -o "$TMP/$ZIP" 'linml_trt_rtx_ep/*' -d "$TMP/unpacked"
  cp -r "$TMP/unpacked/linml_trt_rtx_ep/." "$OUT/"
  rm -rf "$TMP"
  echo "Patched TensorRT-RTX installed to $OUT"
)

Or, with the LinML CLI: linml setup --trt-rtx-wsl2 installs both.

In a repository checkout, source scripts/env-gpu-deps.sh prefers this build when it is vendored, and TRT_RTX_CUSTOM_EP overrides it.

Verify

linml providers list    # NvTensorRTRTXExecutionProvider appears, with its GPU device
linml doctor            # readiness per provider; MIGraphX reports NOT APPLICABLE without AMD ROCm
linml run --provider trt-rtx --require-provider --model model.onnx --inputs inputs.json
linml run --provider migraphx --require-provider --model model.onnx --inputs inputs.json

A successful run prints Provider: NvTensorRTRTXExecutionProvider (requested: NvTensorRTRTXExecutionProvider).

This build is opt-in: the default trt-rtx pin still points at NVIDIA's wheel. On WSL2 the CLI uses this build only once it is installed.

Contents

  • linml_trt_rtx_ep/libonnxruntime_providers_nv_tensorrt_rtx.so — the patched
    plugin (Apache-2.0; see licenses/ and PATCH-NOTICE.md).
  • linml_trt_rtx_ep/build-info.json — provenance (source commit, ONNX Runtime
    headers, TensorRT-RTX version).

Only the EP .so is shipped; it dynamically links the TensorRT-RTX 1.6.1
runtime libraries and CUDA 13, which the stock trt-rtx wheel provides. The
archive RUNPATH is $ORIGIN.

Provenance

  • Source: https://github.com/tonythethompson/TensorRT-RTX-EP-ABI @
    6777dafa257dd569f489f1708473d5bee0f0a6d7 (upstream PR #12 head, including
    the per-GPU registration commit that the enumeration fix alone needs).
  • Built by scripts/build-trt-rtx-ep.sh against ONNX Runtime 1.31.0 headers and
    TensorRT-RTX 1.6.1.120; the archive is byte-stable and pinned by sha256
    (linml-trt-rtx-ep-0.4.0-wsl2p1-linux-x64.zip.sha256).
  • License: Apache-2.0 (unchanged); see PATCH-NOTICE.md for the modification
    notice required by section 4(b).

Verified

WSL2 (RTX 5070): the patched EP is selected with no fallback, and MNIST returns
the exact output [11, 22, 13, 24, 15, 26]. Re-checked with the standalone commands below.

Superseded by

Once PR #12 merges (or NVIDIA ships a fixed wheel), use the default trt-rtx
pin instead.

MIGraphX EP plugin 2611.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Oct 00:51
9a54b7e

AMD MIGraphX plugin execution provider (onnxruntime-ep-amdgpu), built by scripts/build-migraphx-ep.sh at 9a54b7e.

Requirements

  • Linux x86_64 with an AMD GPU, and ROCm installed at /opt/rocm.
  • MIGraphX 2.17 or newer. The plugin loads libmigraphx_c.so.3. Check it with ls /opt/rocm/lib/libmigraphx_c.so.3.
  • ONNX Runtime 1.24 or newer.

Install

No repository clone is needed:

(
  set -euo pipefail
  DEPS="$HOME/.local/linml-deps"
  TMP="$(mktemp -d)"
  ZIP=linml-migraphx-ep-2611.1-linux-x64.zip
  URL=https://github.com/trackdubllc/LinML/releases/download/ep-migraphx-2611.1/$ZIP
  SHA256=968bdb1aa294c1ab4af04cfec0d4318fb2ffa4c69f0b34bc3b98532a199acd86
  OUT="$DEPS/ep-plugins/migraphx/linml_migraphx_ep"
  curl -fsSL -o "$TMP/$ZIP" "$URL"
  echo "$SHA256  $TMP/$ZIP" | sha256sum -c
  mkdir -p "$OUT"
  unzip -q -j -o "$TMP/$ZIP" 'linml_migraphx_ep/*' -d "$OUT"
  rm -rf "$TMP"
  echo "MIGraphX installed to $OUT"
)

Or, with the LinML CLI: linml catalog install migraphx.

Verify

linml doctor
linml run --provider migraphx --require-provider --model model.onnx --inputs inputs.json

Without AMD ROCm, linml doctor reports MIGraphX as NOT APPLICABLE. A run with --require-provider exits with code 3 and fails with libmigraphx_c.so.3: cannot open shared object file.

Contents

  • linml_migraphx_ep/libmigraphx-ep.so: the plugin.
  • linml_migraphx_ep/build-info.json: provenance.
  • LICENSE and the third-party license texts (Apache-2.0, BSD-3-Clause, MIT, MPL-2.0, LLVM-exception).

sha256 of the zip: 968bdb1aa294c1ab4af04cfec0d4318fb2ffa4c69f0b34bc3b98532a199acd86