onnx - 机器学习互操作性的开放标准

Created at: 2017-09-07 12:53:45
Language: Python
License: Apache-2.0

构建状态 构建状态 构建状态 关键信息基础设施最佳实践

开放式神经网络交换 (ONNX) 是一个开放的生态系统,使 AI 开发人员能够随着项目的发展选择合适的工具。ONNX 为 AI 模型(深度学习和传统 ML)提供开源格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。目前,我们专注于推理(评分)所需的功能。

ONNX 受到广泛支持,可以在许多框架、工具和硬件中找到。实现不同框架之间的互操作性并简化从研究到生产的路径有助于提高人工智能社区的创新速度。我们邀请社区加入我们,进一步发展 ONNX。

使用 ONNX

了解 ONNX 规范

用于使用 ONNX 图形的编程实用程序

贡献

ONNX 是一个社区项目。我们鼓励你加入这项工作,并提供反馈、想法和代码。你可以参加特殊兴趣小组工作组,以塑造 ONNX 的未来。

查看我们的贡献指南以开始使用。

如果你认为应该将某些运算符添加到 ONNX 规范中,请阅读此文档

讨论

我们鼓励你打开议题,或使用 Slack(如果你尚未加入,请使用此链接加入群组)进行更实时的讨论。

关注我们

随时了解最新的 ONNX 新闻。[脸书][推特]

安装

官方 Python 包

ONNX 发布的包在 PyPi 中发布。

pip install onnx

每周包在测试 pypi 中发布,以支持实验和早期测试。

vcpkg 软件包

onnx 在 vcpkg 的维护列表中,你可以轻松使用 vcpkg 来构建和安装它。

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.bat # For powershell
./bootstrap-vcpkg.sh # For bash
./vcpkg install onnx

康达套餐

ONNX 的二进制构建可从 Conda 获得,在 conda-forge 中:

conda install -c conda-forge onnx

从源构建 ONNX

在从源代码构建之前,请卸载任何现有版本的 onnx 。

pip uninstall onnx

需要 c++17 或更高版本的 C++编译器版本才能从 Windows 上的源代码构建 ONNX。对于其他平台,请使用 C++11 或更高版本。

一般来说,你需要先安装 protobuf C/C++ 库和工具,然后再继续。然后,根据你安装 protobuf 的方式,你需要将环境变量 CMAKE_ARGS 设置为 “-DONNX_USE_PROTOBUF_SHARED_LIBS=ON” 或 “-DONNX_USE_PROTOBUF_SHARED_LIBS=OFF”。例如,你可能需要运行以下命令:

Linux:

export CMAKE_ARGS="-DONNX_USE_PROTOBUF_SHARED_LIBS=ON"

窗户:

set CMAKE_ARGS="-DONNX_USE_PROTOBUF_SHARED_LIBS=ON"

开/关取决于你拥有的原型库类型。共享库是以 *.dll/*.so/*.dylib 结尾的文件。静态库是以 *.a/*.lib 结尾的文件。此选项取决于你获取 protobuf 库的方式及其构建方式。并且它是默认关闭的。如果你希望使用静态 protobuf 库,则无需运行上述命令。

窗户

如果要从源代码生成 ONNX,建议同时在本地将 Protobuf 构建为静态库。使用 conda-forge 分发的版本是一个 DLL,但 ONNX 希望它是一个静态库。在本地构建 protobuf 还可以控制 protobuf 的版本。经过测试和推荐的版本是 3.20.2。

本自述文件中的说明假定你使用的是 Visual Studio。建议从从“VS 2019 的 x64 本机工具命令提示符”开始的 shell 运行所有命令,并在构建 protobuf 和 ONNX 时保持一致的 cmake 构建系统生成器(例如,cmake -G “Visual Studio 16 2019”)。

你可以通过运行以下命令来获取 protobuf:

git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git checkout v3.20.2
cd cmake
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX=<protobuf_install_dir> -Dprotobuf_MSVC_STATIC_RUNTIME=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_EXAMPLES=OFF .
msbuild protobuf.sln /m /p:Configuration=Release
msbuild INSTALL.vcxproj /p:Configuration=Release

然后,它将被构建为静态库并安装到<protobuf_install_dir>。请将 bin 目录(包含 protoc.exe)添加到你的 PATH 中。

set PATH=<protobuf_install_dir>/bin;%PATH%

请注意:如果你的protobuf_install_dir包含空格,请不要在其周围添加引号。

替代方法:如果你不想更改 PATH,可以改为设置ONNX_PROTOC_EXECUTABLE。

set CMAKE_ARGS=-DONNX_PROTOC_EXECUTABLE=<full_path_to_protoc.exe>

然后,你可以将 ONNX 构建为:

git clone https://github.com/onnx/onnx.git
cd onnx
git submodule update --init --recursive
# prefer lite proto
set CMAKE_ARGS=-DONNX_USE_LITE_PROTO=ON
pip install -e .

Linux目录

首先,你需要安装 protobuf。ONNX 所需的最低 Protobuf 编译器 (protoc) 版本为 3.0.0。请注意,旧的 protoc 版本可能无法与 一起使用。

CMAKE_ARGS=-DONNX_USE_LITE_PROTO=ON

Ubuntu 18.04(及更高版本)用户可以选择通过以下方式安装 protobuf

apt-get install python3-pip python3-dev libprotobuf-dev protobuf-compiler

在这种情况下,需要在 ONNX 生成步骤中添加CMAKE_ARGS。

-DONNX_USE_PROTOBUF_SHARED_LIBS=ON

更通用的方法是从源代码构建和安装它。有关更多详细信息,请参阅以下说明。

从源代码安装 Protobuf

Debian/Ubuntu:

  git clone https://github.com/protocolbuffers/protobuf.git
  cd protobuf
  git checkout v3.20.2
  git submodule update --init --recursive
  mkdir build_source && cd build_source
  cmake ../cmake -Dprotobuf_BUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
  make -j$(nproc)
  make install

CentOS/RHEL/Fedora:

  git clone https://github.com/protocolbuffers/protobuf.git
  cd protobuf
  git checkout v3.20.2
  git submodule update --init --recursive
  mkdir build_source && cd build_source
  cmake ../cmake  -DCMAKE_INSTALL_LIBDIR=lib64 -Dprotobuf_BUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
  make -j$(nproc)
  make install

这里的“-DCMAKE_POSITION_INDEPENDENT_CODE=ON”是至关重要的。默认情况下,静态库是在没有“-fPIC”标志的情况下构建的,它们不是与位置无关的代码。但共享库必须是与位置无关的代码。Python C/C++ 扩展(如 ONNX)是共享库。因此,如果静态库不是使用 “-fPIC” 构建的,则无法将其链接到此类共享库。

生成成功后,更新 PATH 以包含 protobuf 路径。

然后,你可以将 ONNX 构建为:

git clone https://github.com/onnx/onnx.git
cd onnx
git submodule update --init --recursive
# Optional: prefer lite proto
export CMAKE_ARGS=-DONNX_USE_LITE_PROTO=ON
pip install -e .

苹果电脑

export NUM_CORES=`sysctl -n hw.ncpu`
brew update
brew install autoconf && brew install automake
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.20.2/protobuf-cpp-3.20.2.tar.gz
tar -xvf protobuf-cpp-3.20.2.tar.gz
cd protobuf-3.20.2
mkdir build_source && cd build_source
cmake ../cmake -Dprotobuf_BUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
make -j${NUM_CORES}
make install

生成成功后,更新 PATH 以包含 protobuf 路径。

然后,你可以将 ONNX 构建为:

git clone --recursive https://github.com/onnx/onnx.git
cd onnx
# Optional: prefer lite proto
set CMAKE_ARGS=-DONNX_USE_LITE_PROTO=ON
pip install -e .

验证安装

安装后,运行

python -c "import onnx"

以验证它是否有效。

通用构建选项

有关完整列表,请参阅 CMakeLists.txt 环境变量

  • USE_MSVC_STATIC_RUNTIME
    应为 1 或 0,而不是 ON 或 OFF。设置为 1 时,onnx 静态链接到运行时库。默认值:USE_MSVC_STATIC_RUNTIME=0

  • DEBUG
    应为 0 或 1。设置为 1 时,onnx 在调试模式下内置。或调试依赖项的版本,你需要打开 CMakeLists 文件并在包名称行的末尾附加一个字母。例如,将成为 .默认值:调试 = 0
    d
    NAMES protobuf-lite
    NAMES protobuf-lited

CMake 变量

  • ONNX_USE_PROTOBUF_SHARED_LIBS
    应为“开”或“关”。 默认值:ONNX_USE_PROTOBUF_SHARED_LIBS=OFF USE_MSVC_STATIC_RUNTIME=0 确定 onnx 如何链接到 protobuf 库。
    ONNX_USE_PROTOBUF_SHARED_LIBS

    • 当设置为 ON - onnx 将动态链接到 protobuf 共享库时,PROTOBUF_USE_DLLS将按照此处所述进行定义,Protobuf_USE_STATIC_LIBS将设置为 OFF,并且必须为 0。
      USE_MSVC_STATIC_RUNTIME
    • 设置为 OFF 时 - onnx 将静态链接到 protobuf,Protobuf_USE_STATIC_LIBS将设置为 ON(强制使用静态库),可以是 0 或 1。
      USE_MSVC_STATIC_RUNTIME
  • ONNX_USE_LITE_PROTO
    应为“打开”或“关闭”。当设置为 ON onnx 时,使用 lite protobuf 而不是完整的 protobuf。默认值:ONNX_USE_LITE_PROTO=关闭

  • ONNX_WERROR
    应为“打开”或“关闭”。设置为 ON 时,警告被视为错误。默认值:在本地生成中为 ONNX_WERROR=OFF,在 CI 和发布管道中为 ON。

常见错误

  • 注意:该命令在源签出目录中不起作用;在本例中,你将看到 。切换到另一个目录以修复此错误。

    import onnx
    ModuleNotFoundError: No module named 'onnx.onnx_cpp2py_export'

  • 如果你在将 Protobuf 构建为静态库时遇到任何问题,请确保共享的 Protobuf 库(如 libprotobuf)未安装在你的设备或 conda 环境中。如果存在这些共享库,请删除它们以从源代码构建 Protobuf 作为静态库,或者跳过源代码中的 Protobuf 构建以直接使用共享版本。

  • 如果在从源代码构建 ONNX 时遇到任何问题,并且错误消息显示“找不到 pythonXX.lib”,请确保常见命令(如 和 )具有一致的 Python 版本。清理所有现有生成文件,然后再次重新生成 ONNX。

    python
    pip

测试

ONNX 使用 pytest 作为测试驱动程序。为了运行测试,你首先需要安装 pytest:

pip install pytest nbval

安装 pytest 后,使用以下命令运行测试。

pytest

发展

有关说明,请查看贡献者指南

许可证

Apache 许可证 v2.0

行为准则

ONNX 开源行为准则