yalue/onnxruntime_go
A Go (golang) library wrapping microsoft/onnxruntime.
解决的问题
想要在应用程序中运行 ONNX 神经网络的 Go 开发者面临一个挑战:官方 ONNX Runtime 库主要提供 C 和 C++ API,而现有的 Go 封装在 Windows 上经常失败,因为它们依赖 MSVC 编译器,而 Go 的 cgo 在 Windows 上需要 Mingw。这个库通过在运行时加载 ONNX Runtime 共享库来消除这种摩擦,因此相同的 Go 代码可以在 Windows、Linux、macOS 和 ARM64 系统上加载和运行 ONNX 模型,而无需针对 ONNX Runtime 源代码进行编译。
工作原理
该封装仅将 cgo 用于 Go 胶水代码,但不直接链接 ONNX Runtime。相反,它调用 SetSharedLibraryPath 指向当前平台正确的 onnxruntime.so、.dll 或 .dylib,然后使用 ONNX C API 头文件手动从该共享库加载函数。这种方法使 Windows 能够正常工作,并在所有平台上保持相同的模式。该库还利用 Go 的泛型来定义类型化张量(NewTensor、NewEmptyTensor),因此你可以使用常见数据类型(如 float32)而无需额外转换。会话通过 NewAdvancedSession 创建,你可以在其中提供输入和输出张量名称以及预分配的张量;调用 Run() 执行网络并更新输出张量。为了快速迭代,还有一个 DynamicAdvancedSession,允许你在 Run() 时提供张量,而不是在会话创建时提供。
适用人群
适用于希望将 ONNX 神经网络推理集成到应用程序中的 Go 开发者,尤其是那些针对包括 Windows 在内的多个操作系统的开发者。也适用于需要处理特定 ONNX Runtime 版本并希望进行简单、版本固定的设置的团队。该库足够简单,可用于小型脚本,但在底层 ONNX Runtime 构建包含 CUDA、TensorRT 和 CoreML 等高级执行提供程序时,它也支持这些提供程序。
亮点
- 跨平台支持:通过运行时加载共享库而不是链接,适用于 Windows、Linux、macOS 和 ARM64。
- 基于泛型的张量:
NewTensor和NewEmptyTensor使用 Go 泛型,因此你可以使用原生 Go 切片处理常见数据类型,而无需样板代码。 - 预分配张量以提高性能:创建一次输入和输出张量,然后在多次
Run()调用中重用它们,以获得轻微的速度提升。 - 执行提供程序支持:已确认与 CUDA、TensorRT 和 CoreML 兼容,并且测试会在库不包含加速器时自动跳过加速器测试。
- 版本控制:项目固定使用 ONNX Runtime 1.31.0,并通过替换头文件和共享库提供简单的升级路径。
相关
- 项目
- 项目
- 项目
- 项目
- 项目