ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ONNX Runtime NuGet 包体系解析:Managed 与 Native 双包架构、打包参数与生成验证流水线

ONNX Runtime NuGet 包体系解析:Managed 与 Native 双包架构、打包参数与生成验证流水线 ONNX Runtime NuGet 包体系解析Managed 与 Native 双包架构、打包参数与生成验证流水线【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime本文以 ONNX Runtime 仓库中tools/nuget目录的 NuGet 打包说明与配套脚本为主体解析 ONNX Runtime 面向 .NET 平台的 NuGet 包矩阵Microsoft.ML.OnnxRuntime、.Gpu、.DirectML、.QNN、Intel.ML.OnnxRuntime.OpenVino等原生Native包各自内置的执行提供者Execution Provider与平台二进制以及Microsoft.ML.OnnxRuntime.ManagedC# 绑定包的构建方式。读完本篇你能清楚各 NuGet 包之间的依赖关系、包的内部布局runtimes 目录、build targets、本地打包时的关键 MSBuild 参数与验证脚本的用法从而能够正确选型、消费并本地验证 ONNX Runtime 的 NuGet 产物。一、包矩阵总览Native 包与 Managed 包各司其职tools/nuget/nupkg.README.md给出的核心信息是ONNX Runtime 的 NuGet 生态由「Native 包」和「Other 包」两大类组成前者携带各平台的原生共享库与执行提供者后者提供 C# 语言绑定。两者的分工在仓库文档 csharp/readme.md 中被特别强调因为命名上确实容易混淆该解决方案中的Microsoft.ML.OnnxRuntime工程产出的是Microsoft.ML.OnnxRuntime.Managed包而名为Microsoft.ML.OnnxRuntime的 NuGet 包其内容是各平台的原生C代码。也就是说包名与源码工程名存在偏移工程csharp/src/Microsoft.ML.OnnxRuntime产出的托管包 ID 被硬编码为Microsoft.ML.OnnxRuntime.Managed这一事实可以在 Microsoft.ML.OnnxRuntime.csproj 中确认PackageIdMicrosoft.ML.OnnxRuntime.Managed/PackageId与注释 The package name is always hardcoded as the package created by this project only contains managed assemblies。1. Native 包清单源自 nupkg.README.md包名支持平台内置执行提供者Microsoft.ML.OnnxRuntime所有受支持平台CPU EPCoreML EPmacOS/iOSXNNPACK EPAndroid/iOSMicrosoft.ML.OnnxRuntime.GpuWindows、LinuxTensorRT EPCUDA EPCPU EPMicrosoft.ML.OnnxRuntime.DirectMLWindowsDirectML EPCPU EPMicrosoft.ML.OnnxRuntime.QNN64 位 WindowsQNN EPCPU EPIntel.ML.OnnxRuntime.OpenVino64 位 WindowsOpenVINO EPCPU EP这些清单在打包脚本中有对应的实现印证。tools/nuget/generate_nuspec_for_native_nuget.py 的--execution_provider参数取值范围为cuda / dnnl / openvino / migraphx / tensorrt / snpe / qnn / None并按包名判断是否为 GPU 包、QNN 包、Windows AI 包等--package_name则形如Microsoft.ML.OnnxRuntime.Gpu。脚本还会把不同包的description写成差异化文案例如 GPU 子包Microsoft.ML.OnnxRuntime.Gpu.Linux/Windows的描述为 This package contains Linux/Windows native shared library artifacts for ONNX Runtime with CUDA.OpenVINO 包Intel.ML.OnnxRuntime前缀的描述为 This package contains native shared library artifacts for ONNX Runtime with OpenVINO.。2. 其他包Microsoft.ML.OnnxRuntime.ManagedC# 语言绑定源码位于 csharp/src/Microsoft.ML.OnnxRuntime包含OrtEnv、InferenceSession、OrtValue、OrtSessionOptions如 InferenceSession.shared.cs、OrtValue.shared.cs 等全部*.shared.cs源文件。Microsoft.ML.OnnxRuntime.Extensions提供所有受支持平台上的自定义前后处理算子属于 ONNX Runtime 扩展体系与主仓库解耦。3. 依赖关系所有 Native 包都依赖 Managed 包从 generate_nuspec_for_native_nuget.py 的add_common_dependencies()可以看到每个 Native 包的 nuspec 在NETCOREAPP、NETSTANDARD、NETFRAMEWORK三组 targetFramework 下都会声明对同版本Microsoft.ML.OnnxRuntime.Managed的依赖GPU 主包还会额外依赖平台子包Microsoft.ML.OnnxRuntime.Gpu.Windows与Microsoft.ML.OnnxRuntime.Gpu.LinuxDirectML 包则追加Microsoft.AI.DirectML依赖。因此一个典型的 GPU 使用方只需安装Microsoft.ML.OnnxRuntime.Gpu托管绑定与平台相关的 CUDA 二进制会经由依赖链自动补齐。这一「主包只做依赖、子包装二进制」的设计在脚本注释中也有明确说明CUDA 二进制被拆分到平台相关的Microsoft.ML.OnnxRuntime.{Linux|Windows}子包中而不是放在基础的Microsoft.ML.OnnxRuntime.Gpu包里is_this_file_needed()对Microsoft.ML.OnnxRuntime.Gpu直接返回False。验证脚本 tools/nuget/validate_package.py 中的同名注释进一步印证In Nuget GPU package, onnxruntime.dll is in dependent package——主 GPU 包内不检查onnxruntime.dll而 GPU 子包Gpu.Windows/Gpu.Linux则要求必须携带onnxruntime_providers_shared、onnxruntime_providers_cuda、onnxruntime_providers_tensorrt三个库的.dll/.libWindows或.soLinux。二、Native 包的内部布局runtimes 目录与 C API 头文件1. 二进制按平台-架构分发generate_nuspec_for_native_nuget.py 的generate_file_list_for_ep()按 C API 发布包的目录命名规则onnxruntime-{os}-{arch}[-{ep}]例如onnxruntime-win-x64、onnxruntime-linux-aarch64-cuda、onnxruntime-osx-arm64扫描产物并把文件写入 nuspec 的files节目标路径形如runtimes/win-x86|win-x64/native.dll、.lib可选.pdbruntimes/osx-x64|osx-arm64/native.dylib带版本号的.1.x.0.dylib之类的文件会被正则过滤掉runtimes/linux-x64|linux-arm64/native.soruntimes/android/native.aarruntimes/ios/native.zip。这正是 NuGet 对「平台依赖运行时」的标准约定只有匹配运行时ID的项目才会把相应二进制复制到输出目录。2. 包内附带 C API 头文件可直接给 C 项目引用除托管程序外Native 包还面向 Native C 消费者。脚本会把源仓库的头文件打入build\native\includeGPU 包使用buildTransitive\native\include注释说明 GPU 子包不包含onnxruntime主头文件通用头include/onnxruntime/core/session/onnxruntime_*.h、onnxruntime_*.inc以及 provider_options.h、cpu_provider_factory.h按 EP 追加OpenVINO 追加openvino_provider_factory.hDNNL 追加dnnl_provider_options.hDirectML 追加dml_provider_factory.hTraining 包追加orttraining/orttraining/training_api/include/onnxruntime_training_*.h。validate_package.py头部的gpu_related_header_files/dmlep_related_header_files/training_related_header_files三个清单则定义了对应包必须包含的头文件集合作为出包前的硬性检查项。三、Managed 包的本地构建关键 MSBuild 参数与命令csharp/readme.md 给出了在 Windows 上构建Microsoft.ML.OnnxRuntime.Managed包的完整步骤这些命令依赖 OnnxRuntime.CSharp.sln / OnnxRuntime.CSharp.proj 与 C# 工程文件。1. 环境要求WindowsVisual Studio 2022 17.2.4含 Xamarin 工作负载17.2.4 自带 .NET SDK 6.0.301。若要包含 MAUI 目标需安装工作负载dotnet workload install maui android ios maccatalyst并把IncludeMobileTargets设为true正式出包时即为 true。本地测试打包还需要nuget.exe并在 PATH 中可用。Linux安装 .NET SDK 与 Mono并以 mono 方式包装nuget.exereadme 中给出了安装脚本。2. 还原、构建与出包命令:: 先 restore生成 obj\project.assets.json 等配置再 build两次 msbuild msbuild -t:restore .\src\Microsoft.ML.OnnxRuntime\Microsoft.ML.OnnxRuntime.csproj -p:IncludeMobileTargetstrue msbuild -t:build .\src\Microsoft.ML.OnnxRuntime\Microsoft.ML.OnnxRuntime.csproj -p:IncludeMobileTargetstrue :: 创建 NuGet 包OrtPackageId 决定条件逻辑 msbuild .\OnnxRuntime.CSharp.proj -t:CreatePackage -p:OrtPackageIdMicrosoft.ML.OnnxRuntime -p:ConfigurationDebug -p:PlatformAny CPULinux 侧则通过顶层构建脚本--build_nuget配合--msbuild_extra_options传入 MSBuild 属性readme 给出的是构建 CUDA GPU 包的示例./build.sh \ --configRelease \ --cmake_generator Ninja \ --use_cuda \ --cuda_home/usr/local/cuda \ --cudnn_home/usr \ --build_nuget \ --msbuild_extra_options \ /p:SelectedTargetsNet6 \ /p:Net6Targetsnet6.0 \ /p:TargetFrameworksnetstandard2.0 \ /p:IsLinuxBuildtrue文档特别提示若要构建纯 CPU 的开发包需在--msbuild_extra_options中追加/p:OrtPackageIdMicrosoft.ML.OnnxRuntime否则会尝试创建 Xamarin 移动目标在普通开发机上可能未正确配置。产出的.nupkg位于构建根目录如build/Release消费方式为把本地 nupkg 放到一个目录后dotnet add package microsoft.ml.onnxruntime.managed -s ./packages --prerelease dotnet add package microsoft.ml.onnxruntime.gpu -s ./packages --prerelease3. 关键参数在 csproj 中的含义对照 Microsoft.ML.OnnxRuntime.csproj 可以精确定位上述参数背后的逻辑OrtPackageId默认Microsoft.ML.OnnxRuntime它不改变产出包名永远是.Managed而是驱动条件逻辑——当OrtPackageId为Microsoft.ML.OnnxRuntime或.Azure且IncludeMobileTargetstrue时追加 MAUI 移动目标net9.0-android;net9.0-ios;net9.0-maccatalystTraining包则只追加net9.0-android。基础目标为netstandard2.0;net8.0。IncludeMobileTargets默认trueOnnxRuntime.DesktopOnly.CSharp解决方案下被强制为false注释说明没有 Xamarin 时无法在 sln 中按项目排除故维护一份去掉 iOS/Android/Droid 项目的副本解决方案见 csharp/readme.md 的 Solution files 一节。EnableTrainingApis默认true定义编译常量__ENABLE_TRAINING_APIS__。注释明确警告若设备上安装的原生包未以enable_training_apis构建调用训练 API 时会抛出 Training is disabled in the current build... 异常。平台条件编译常量Android 目标加__ANDROID__iOS/MacCatalyst 加__IOS__iOS/MacCatalyst/macOS 加__ENABLE_COREML__——这与 nupkg.README.md 中 CoreML EP on macOS/iOS 的声明相互印证。出包内容RenameFilesToPack目标在 Pack 前把仓库根的 LICENSE 复制为LICENSE.txt、把 targets/netstandard/targets.xml 复制为$(PackageId).targets放入构建输出目录ItemGroup 再把tools/nuget/nupkg.README.md作为包的README.md、docs/Privacy.md 与 ThirdPartyNotices.txt 一并打入包内。也就是说本文所依据的nupkg.README.md本身就是随托管包发布给最终用户的包说明。4. targets 文件托管包的「安装时钩子」Managed 包通过 MSBuild targets 把runtimes/RID/native下的原生库接入宿主项目targets/netstandard/targets.xml 定义Microsoft_ML_OnnxRuntime_CheckPrerequisites在BeforeBuild前校验PlatformTarget仅支持AnyCPU、x64、arm32、arm64、x86.NET Core 可移植应用PlatformTarget为空的情况被豁免iOS 目标豁免可用SuppressOnnxRuntimePlatformCompatibilityErrortrue抑制该错误。这与 nupkg.README.md「Native libraries for all supported platforms」的口径一致也是选型时的硬约束。targets/net9.0-android/targets.xml 在$(AndroidApplication)true时把包内runtimes\android\native\*作为AndroidLibrary引入使 Android 应用能直接拿到 AAR 内的原生库。同目录还存在props.xml、props_qnn.xml以及 net9.0-ios、net9.0-maccatalyst 目标后者附带说明文件 targets/net9.0-maccatalyst/README.md。四、Native 包的 nuspec 生成与内容验证1. generate_nuspec_for_native_nuget.py 的命令行参数脚本描述为 ONNX Runtime create nuget spec script (for hosting native shared library artifacts)完整参数如下摘自 tools/nuget/generate_nuspec_for_native_nuget.py参数必填说明--package_name是包名如Microsoft.ML.OnnxRuntime.Gpu--package_version是包版本如1.0.0--target_architecture是目标架构如x64--build_config是构建配置如RelWithDebInfo--ort_build_path是ORT 构建目录--native_build_path是原生构建输出目录--packages_path是NuGet 包输出目录--sources_path是ONNX Runtime 源码根目录--commit_id是该包包含的最后一个提交 ID写入repository节--is_release_build否true/false决定 release notes 与调试工具的取舍--execution_provider否cuda / dnnl / openvino / migraphx / tensorrt / snpe / qnn / None默认None--sdk_info否依赖 SDK 信息写入 release notes--nuspec_name否默认NativeNuget.nuspec值得注意的两个行为细节release notes 来自 CI 环境变量generate_release_notes()读取BUILD_SOURCEBRANCH、BUILD_SOURCEVERSION、BUILD_BUILDID生成 Release Def: Branch/Commit/Build 文本并附带--sdk_info提供的依赖 SDK 信息。调试工具只进非 Release 包onnxruntime_perf_test与onnx_test_runner仅在--is_release_build不为true且架构为x64时被放入runtimes/.../tools/目录注释指出 Linux 下若不单独放tools子目录NuGet 会报出误导性错误。2. validate_package.py出包后的完整性校验tools/nuget/validate_package.py 描述为 Validate ONNX Runtime native nuget containing native shared library artifacts spec script支持三种--package_typenuget、tarball、zip。参数包括--package_name、--package_path该路径下必须只有一个包、--platforms_supported逗号分隔、无空格如linux-x64,win-x86,osx-x64、--verify_nuget_signingtrue/false、--is_release_build。校验逻辑要点对 nuget 类型把.nupkg改名成 zip 后按 namelist 检查文件清单要求按--platforms_supported逐一存在Windows 平台的runtimes/win-arch/native/onnxruntime.dllWindows AI 包为_native目录、Linux 平台的libonnxruntime.so、macOS 平台的libonnxruntime.dylib以及按 EP 类型要求的头文件集合check_if_headers_are_present()缺失即抛异常。对 GPU 包做前述「主包不含库、子包必须含三个 CUDA/TensorRT 相关库」的差异化检查package_contains_library/package_contains_cuda_binaries的推导。支持 NuGet 签名校验check_if_nuget_is_signed()查找 CI 产出的CodeSignSummary文件并检查内容包含 Pass。脚本中有一处环境限制需要说明validate_nuget()在非 Windows 上会直接抛出 Nuget validation is currently supported only on Windows。五、选型与使用建议以当前仓库为准综合nupkg.README.md的清单与打包脚本的实现可以给出如下结论均以上述仓库文件为证据边界默认选择Microsoft.ML.OnnxRuntimeCPU EP 覆盖所有受支持平台且在 macOS/iOS 自带 CoreML、在 Android/iOS 自带 XNNPACK 的执行提供者。安装托管绑定时Native 包会自动带入同版本Microsoft.ML.OnnxRuntime.Managed。Windows/Linux 的 CUDA/TensorRT 加速选Microsoft.ML.OnnxRuntime.Gpu它本身只是依赖聚合实际二进制来自Gpu.Windows/Gpu.Linux子包因此升级时主包与子包版本必须一致依赖按同版本声明。Windows 上的 DirectML / QNN、OpenVINO 加速分别对应.DirectML、.QNN仅 64 位 Windows、Intel.ML.OnnxRuntime.OpenVino仅 64 位 Windows。QNN 包在非 x64 架构下还会包含QnnHtp系列驱动桩与libQnnHtpVxxSkel.so来自generate_nuspec_for_native_nuget.py的is_qnn_package分支。平台约束是硬性的托管包 targets 只放行AnyCPU/x64/arm32/arm64/x86外加可移植 .NET Core 与 iOS 豁免在非常规PlatformTarget的 Exe/WinExe 项目上构建会直接报错这是从 targets.xml 可直接确认的行为。需要训练 API 时托管包默认编译进训练绑定EnableTrainingApis默认 true但前提是原生包以enable_training_apis构建否则运行期调用会抛出 Training is disabled in the current build. 异常——选型时应确认原生包来源。六、延伸阅读路径包清单与 EP 归属tools/nuget/nupkg.README.md打包/验证脚本tools/nuget/generate_nuspec_for_native_nuget.py、tools/nuget/validate_package.py、tools/nuget/generate_nuspec_for_custom_nuget.py托管包工程与构建说明csharp/readme.md、csharp/src/Microsoft.ML.OnnxRuntime/Microsoft.ML.OnnxRuntime.csproj、csharp/OnnxRuntime.CSharp.proj平台 targets 钩子csharp/src/Microsoft.ML.OnnxRuntime/targetsC API 头文件include/onnxruntime/core/session【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表