开放式神经网络交换 (ONNX) 是一个开放的生态系统,使 AI 开发人员能够随着项目的发展选择合适的工具。ONNX 为 AI 模型(深度学习和传统 ML)提供开源格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。目前,我们专注于推理(评分)所需的功能。
ONNX 受到广泛支持,可以在许多框架、工具和硬件中找到。实现不同框架之间的互操作性并简化从研究到生产的路径有助于提高人工智能社区的创新速度。我们邀请社区加入我们,进一步发展 ONNX。
ONNX 是一个社区项目。我们鼓励你加入这项工作,并提供反馈、想法和代码。你可以参加特殊兴趣小组和工作组,以塑造 ONNX 的未来。
查看我们的贡献指南以开始使用。
如果你认为应该将某些运算符添加到 ONNX 规范中,请阅读此文档。
我们鼓励你打开议题,或使用 Slack(如果你尚未加入,请使用此链接加入群组)进行更实时的讨论。
ONNX 发布的包在 PyPi 中发布。
pip install onnx
每周包在测试 pypi 中发布,以支持实验和早期测试。
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 。
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 .
首先,你需要安装 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
更通用的方法是从源代码构建和安装它。有关更多详细信息,请参阅以下说明。
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
USE_MSVC_STATIC_RUNTIME
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
有关说明,请查看贡献者指南。