Runtime Key 和 Bridge Package 怎么选
TensorRtSharp4.0 将托管 API、项目自有 native bridge 与 NVIDIA 原厂运行库分开管理。当前发布面只有 managed package、与 runtime key 对应的 .Bridge package,以及不包含第三方二进制的源码归档。CUDA、cuDNN、TensorRT 和可选 NVRTC 由用户自行安装。
真正的选择题不是“下载哪种完整 runtime 包”,而是“目标机器需要哪个 ABI 组合的 bridge,以及怎样证明它加载的是匹配的主机 NVIDIA 依赖”。
适用读者
- 需要为 Windows/Linux 应用选择 runtime key 的用户。
- 已安装 NVIDIA SDK,需要引用 C# API 和小型 bridge 包的团队。
- 负责 native build、package consumer 和发布证据的维护者。
- 正在从旧 vendor-bundle 方案迁移到 bridge-only 方案的 owner。
当前策略
权威规则位于 pack/external-vendor-runtime-policy.json。允许发布的 package kind 只有:
- managed:
JYPPX.TensorRT.CSharp.API。 - bridge:package id 以
.Bridge结尾,包内只包含项目自行编译的jyppxtrtbridge.dll或libjyppxtrtbridge.so。
禁止把 nvinfer*、nvonnxparser*、cudart*、cublas*、cudnn*、nvrtc* 等 NVIDIA 文件放进 nupkg 或 GitHub Release asset。旧 full、vendor split、collection、meta、builder-resource 身份只为远端清理和历史证据解释保留,不得重新打包或发布。
三层依赖关系
flowchart TD
M["Managed API package"] --> APP["Consumer application"]
B["Project-owned Bridge package"] --> APP
H["Host-installed CUDA, cuDNN, TensorRT and optional NVRTC"] --> B
APP --> V["Clean consumer runtime validation"]
| 层 | 示例身份 | 内容与来源 |
|---|---|---|
| Managed API | JYPPX.TensorRT.CSharp.API |
C# API,由项目发布 |
| Bridge | runtime key + .Bridge |
一个项目自有 C ABI bridge,由项目发布 |
| Vendor runtime | TensorRT/CUDA/cuDNN/NVRTC | 用户通过 NVIDIA 官方方式安装 |
managed 包不会隐式提供 native bridge;bridge 包也不会隐式提供 NVIDIA 依赖。consumer 必须同时满足 package identity、ABI 和主机 runtime 三个条件。
Runtime key 是第一选择条件
key 形如:
<os>-<arch>-<distro>-trt<version>-cuda<version>-cudnn<version>
Windows 示例:
win-x64-trt8.6-cuda11.8-cudnn8.9
win-x64-trt10.11-cuda12.9-cudnn9.22
win-x64-trt11.0-cuda13.2-cudnn9.22
Linux 示例还包含发行版:
linux-x64-ubuntu22.04-trt11.0-cuda12.9-cudnn9.22
linux-x64-ubuntu24.04-trt11.0-cuda13.2-cudnn9.22
当前 manifest 共 18 个 key:6 个 Windows、12 个 Linux。key 的存在表示项目建模了对应 bridge 编译输入和主机兼容组合,不表示公开包已经发布,也不表示目标主机已有 runtime proof。
Windows 六个 key
| Runtime key | Native build preset |
|---|---|
win-x64-trt8.6-cuda11.8-cudnn8.9 |
win-x64-trt8-cuda11-release |
win-x64-trt8.6-cuda12.1-cudnn8.9 |
win-x64-trt8-cuda12-release |
win-x64-trt10.11-cuda11.8-cudnn8.9 |
win-x64-trt10-cuda11-release |
win-x64-trt10.11-cuda12.9-cudnn9.22 |
win-x64-trt10-cuda12-release |
win-x64-trt11.0-cuda12.9-cudnn9.22 |
win-x64-trt11-cuda12-release |
win-x64-trt11.0-cuda13.2-cudnn9.22 |
win-x64-trt11-cuda13-release |
这些 preset 决定 bridge 使用哪一套 headers、import libraries 和 ABI line。它们不授权把 preset 指向的 NVIDIA DLL 收集到包中。
Linux key
Linux key 还要区分 Ubuntu 20.04、22.04、24.04 等发行版。不能把 linux-x64 泛化包用于所有发行版,也不能把 x64、SBSA arm64 和 Jetson/L4T 当成同一 ABI。目标 key 必须与实际 runner、glibc、loader path 和 NVIDIA repository 支持范围一致。
Linux bridge 包内只允许 runtimes/<rid>/native/libjyppxtrtbridge.so。TensorRT、CUDA、cuDNN 和 NVRTC .so 由 runner 镜像或目标机器安装。
唯一消费路线
当前唯一受支持的 package 组合是:
JYPPX.TensorRT.CSharp.API
+
JYPPX.TensorRT.CSharp.API.Runtime.<runtime-key-with-dots>.Bridge
+
matching host-installed NVIDIA dependencies
用户不应寻找 vendor runtime package、split meta package 或 monolithic package。若目标机器尚未安装匹配的 NVIDIA runtime,正确动作是先完成主机安装或容器镜像配置,再引用 .Bridge 包。
选择决策树
flowchart TD
A["确定 OS, architecture and distro"] --> B["确定 TensorRT line"]
B --> C["确定 CUDA and cuDNN line"]
C --> D["检查 GPU driver compatibility"]
D --> E["安装 NVIDIA host dependencies"]
E --> F["引用 managed + matching Bridge"]
F --> G["Dependency probe and runtime smoke"]
不能用“最新版本”代替明确组合,也不能只因为机器上存在 CUDA_PATH 就跳过 TensorRT/cuDNN/driver 检查。
查看兼容 Manifest
$manifest = Get-Content -Raw .\pack\runtime\runtime-packages.manifest.json |
ConvertFrom-Json
$manifest.packages |
Select-Object key,platform,tensorRtVersion,cudaVersion,cudnnVersion,buildPreset |
Format-Table -AutoSize
检查单个 key:
$key = 'win-x64-trt11.0-cuda12.9-cudnn9.22'
$entry = $manifest.packages | Where-Object key -eq $key
if ($null -eq $entry) { throw "Unknown runtime key: $key" }
$entry | ConvertTo-Json -Depth 8
重点字段:
| 字段 | 当前用途 |
|---|---|
key、rid、platform |
选择目标 OS/architecture |
tensorRtLine、tensorRtVersion |
bridge ABI 与主机 TensorRT 版本 |
cudaLine、cudaVersion |
CUDA bridge target 与 driver/runtime 检查 |
cudnnMajor、cudnnVersion |
主机 cuDNN 检查 |
buildPreset、bridgeFile |
项目 bridge 构建与包内容 |
tensorRtFiles、cudaFiles、cudnnFiles |
主机依赖诊断范围,不是包资产 |
安装主机 NVIDIA 依赖
按 NVIDIA 官方安装方法准备目标组合,并记录安装来源、版本和路径。Windows 上要确认 loader 可找到对应 DLL;Linux 上要确认 ldconfig、LD_LIBRARY_PATH 或容器 loader 配置。使用 RTC 时必须同时安装 NVRTC 与同版本 builtins。
不要从仓库历史 Release、旧 GitHub Package 或另一台机器复制 vendor DLL 来构成正式安装证据。临时复制只能标记为诊断,不能进入 package proof。
应用引用示例
以下示例只展示 identity 结构,<version> 与 <approved-source> 必须来自真实发布记录:
<ItemGroup>
<PackageReference Include="JYPPX.TensorRT.CSharp.API" Version="<version>" />
<PackageReference
Include="JYPPX.TensorRT.CSharp.API.Runtime.win-x64.trt10.11.cuda12.9.cudnn9.22.Bridge"
Version="<version>" />
</ItemGroup>
dotnet restore --force-evaluate --source <approved-source>
dotnet build -c Release
bridge nupkg 中应只有项目自有 native binary 和 NuGet metadata。若发现 NVIDIA 文件,eng/Test-ExternalVendorRuntimePackagePolicy.ps1 必须失败。
两条公开来源
GitHub Release 通道提供 managed + bridge assets,经 immutable URL、digest、SHA256、大小、nuspec repository URL/commit 校验后进入 verified staging。NuGet-compatible source 通道直接按 package id/version restore managed + bridge packages。
不论使用哪条通道,managed 和 bridge 必须绑定同一个 source commit。-AllowCrossCommitPair 只允许真实历史资产诊断,结果必须是 diagnostic-only,不能晋级 package-consumer-runtime 或 post-publish proof。
本地 Bridge 构建
本地维护者可以解析 runtime root 并编译 bridge,但不得收集 vendor assets:
pwsh -NoProfile -ExecutionPolicy Bypass -File .\eng\Invoke-LocalSplitRuntimePackage.ps1 `
-SourceRuntimeKey win-x64-trt11.0-cuda12.9-cudnn9.22 `
-Version <candidate-version> `
-SplitPackageRole bridge
pwsh -NoProfile -ExecutionPolicy Bypass -File .\eng\Test-ExternalVendorRuntimePackagePolicy.ps1
eng/Invoke-LocalRuntimePackage.ps1、full role、vendor role、collection/meta 和 all-role 请求必须 fail closed。
安装后资产检查
Windows 输出目录中应出现 managed assemblies 和 jyppxtrtbridge.dll。不应因为 PackageReference 出现 nvinfer*、cudart*、cudnn* 或 nvrtc*。这些文件应来自系统安装路径,并在 dependency report 中记录实际 resolved path 和 version。
Linux 同理:包只复制 libjyppxtrtbridge.so,ldd 显示的 NVIDIA .so 必须解析到用户安装或容器镜像位置。
验证结果分层
| 层级 | 能证明什么 | 不能证明什么 |
|---|---|---|
| package policy | nupkg 不含禁止的 vendor binary | 主机 runtime 可运行 |
| restore/build | managed + bridge 引用可解析 | bridge 依赖可加载 |
| dependency probe | loader 能解析外部依赖 | TensorRT enqueue 正确 |
| runtime smoke | 指定主机完成真实执行 | 所有 GPU/模型/版本都兼容 |
| strict public proof | 公开来源、hash、提交和日志闭环 | 自动授权未来发布 |
local feed、ProjectReference 和 direct .nupkg 适合开发诊断,但不能替代公开 package source。
常见错误
Bridge 找不到
检查 .Bridge PackageReference、RID、输出目录和 NativeBridgePathResolver。不要先修改系统 PATH 掩盖 package identity 错误。
Vendor dependency 找不到
检查用户安装的 TensorRT/CUDA/cuDNN/NVRTC 路径、版本和 loader 配置。bridge 包不负责复制这些文件。
ABI line 混用
TRT8、TRT10、TRT11 的 DLL 命名与 ABI 不同。不要让输出目录和 PATH 同时混入多个 line,再依据偶然加载成功判断兼容。
CUDA error 35
这通常表示 driver 不支持目标 CUDA runtime。结论应保留为 blocked-by-cuda-driver,并换兼容主机复测,而不是删除 blocker。
Restore 成功但运行失败
restore 只验证 NuGet 图。继续检查 bridge asset、host dependency listing、dependency probe、runtime smoke、stdout/stderr 和 host metadata。
发布前证据
公开消费记录至少要绑定 public source URL、managed/bridge package id/version、两份 nupkg SHA256、两份 repository commit、clean consumer root、restore/build/runtime JSON/stdout/stderr hash、installed vendor asset listing、host metadata、exit code 和 strict validator 结果。
GitHub Release verified staging 与 NuGet-compatible source 都必须各自留下可验证记录。包可下载不等于 runtime 可用,单机 runtime 可用也不等于 post-publish verification 已完成。
边界说明
本文是选择和本地验证指南,不执行 package push,不证明任何 package 当前已在公开源可用。build-only、dry-run、template、local feed、ProjectReference、direct .nupkg、TensorRtExec report、YoloVision matrix、OnnxToEngine report 和 readonly diagnostics 都不是 runtime proof。
状态保持 performsPublish=false、canPublishPublicly=false、canCloseReleaseIssue=false。文章、截图、candidate inventory、failedBlockerCount=0 和 dependency-probe-only 结果不能覆盖这些边界。
选择清单
- [ ] 已确定唯一 runtime key。
- [ ] 已安装匹配的 TensorRT、CUDA、cuDNN 和可选 NVRTC。
- [ ] 只引用一个 managed 包和一个
.Bridge包。 - [ ] bridge nupkg 不含 NVIDIA binary。
- [ ] managed/bridge 来源提交一致。
- [ ] dependency probe 记录实际主机依赖路径。
- [ ] runtime smoke 在兼容 GPU 主机执行。
- [ ] public source、hash、日志与 validator 证据齐全。
下一步
完成选择后,按 runtime-package-installation-deep-dive.md 建立 clean consumer,并用 Invoke-PublicReleaseBridgePackageConsumer.ps1 或批准的 NuGet-compatible source 执行真实验证。只有 package-consumer-runtime 与 post-publish strict validator 接受真实输入后,才能推进 release close。