ONNX 发布¶
ONNX 项目未来计划大约每四个月发布一次。我们遵循 Semver 版本控制方法,并将在每次发布时由社区决定进行主版本更新还是次版本更新。
准备工作¶
联系 SIG Arch/Infra 负责人,确认发布分支所需的检查项是否仍然有效且已更新,以及是否存在依赖已过时的硬编码的运行器镜像版本,这些可能需要更新。检查发布分支的“必需检查项”是否仍然是最新的或需要调整:“Branches” -> “Branch protection rules”。
确定新版本的版本号(X.Y.Z)
在 Slack 频道 Releases(https://lfaifoundation.slack.com/archives/C018VGGJUGK)中讨论
对于 (v.X.Y.Z),如果发布版本为 1.16.0,则
X=1, Y=16, Z=0
新分支将是
rel-1.16.0
分支保护规则会自动应用于符合此格式的分支。
新标签将是
v1.16.0
在 发布后勤维基 中为新版本创建页面
在创建发布分支之前,强烈建议您提前准备好**初步的发布说明**——最好保存在共享位置,例如**发布维基页面**。这些说明应包含**新功能**的清晰摘要、**错误修复**列表、任何**已知问题**,以及特别是任何**弃用或移除项**,并附上相关工单或文档的链接。准备好这些信息可确保团队在分支创建后立即自信且迅速地创建
rc1
(发布候选 1),而无需延迟。在此阶段迅速行动也有助于**减少在主分支和发布分支上进行并行工作**的需求,从而最大程度地减少合并冲突、重复工作和协调开销。此做法支持更顺畅、更透明的发布流程。为了生成良好的发布说明,如果拉取请求的名称有意义且具有相应的标签,那将很有帮助。标签也可以追溯性地添加到已经合并的拉取请求中。
使用的标签可以在 此处 找到
在 GitHub 上起草发布时获得的初步发布说明。
创建发布分支¶
在 `main` 分支中,创建发布分支之前
在 version.h 中增加 `LAST_RELEASE_VERSION`。
设置为 X.Y.Z,这与您当前正在创建的发布分支相同。
在发布分支创建后,`main` 分支中的 `VERSION_NUMBER` 将被增加到下一个未来版本。
在 ONNX proto 文件、Versioning.md、schema.h、helper.py 和 helper_test.py 中,确保新发布的发布版本、IR 版本、ai.onnx opset 版本、ai.onnx.ml opset 版本和 ai.onnx.training opset 版本是正确的。
创建发布分支
在 branches 中点击“New branch”,选择 `main` 作为 Source。
确保新分支上的所有测试都通过。
创建发布分支后
创建 PR 以将 `main` 分支中的 `VERSION_NUMBER` 文件设置为下一个未来版本,即 `X.Y+1.0`。
创建 PR 以将新发布分支中的 `VERSION_NUMBER` 文件设置为 `X.Y.Zrc1`。
例如,1.16.0 的第一个发布候选版本将是 `1.16.0rc1`。
在 `onnx/defs/operator_sets.h` 和 `onnx/defs/schema.h` 中增加 ai.onnx 域的 opset 版本,以便将来添加和修改运算符时使用。
例如,这个 演示 PR。
将发布候选版本上传到 TestPyPI(无需离线步骤,从 onnx 版本 1.19 开始)¶
转到“Actions” -> 选择 “Create Releases” -> 点击“Run workflow”按钮,并使用以下配置:
RC-Candidates
Build-mode: Release
此按钮将触发不同操作系统的构建。
所有单个运行的工件都可以在对应的作业中找到。
在最终合并之前,必须通过设置的部署环境手动确认。
将发布候选版本上传到 TestPyPI(适用于截至 1.18(含)的版本 / 1.19 的后备方案)¶
重要提示
**等待** PR 合并并构建以设置发布分支的 `VERSION_NUMBER`,然后再继续。
如果您尚未安装 `twine`,请安装:`pip install twine`
当 `twine` 命令提示输入密码时,请使用 API 令牌。您的密码将不起作用。
注意:TestPyPI 和 PyPI 是独立的账户,因此请确保您使用的账户与您上传到的位置相符。
与 PyPI 类似,发布版本只能上传到 TestPyPI **一次**。
要更新已上传的文件,您必须增加 `VERSION_NUMBER`,重新构建,并上传新的 X.Y.Zrc2 等。
要测试上传命令,您可以使用 docker 或 podman 创建本地 pypi 服务器。
启动服务器 `docker run --rm -it --platform linux/amd64 -p 80:8080 pypiserver/pypiserver:latest run -a . -P .`
这将启动一个本地 pypiserver,无需身份验证(任何用户/密码都可用)。
容器不保存状态。停止并重新启动它将允许您多次推送同一版本。
上传文件
wheels: `twine upload --repository-url http://127.0.0.1:80 --verbose -u fake -p fake *.whl`
source: `twine upload --repository-url http://127.0.0.1:80 --verbose -u fake -p fake dist/*`
从您的测试服务器拉取和安装
pip uninstall -y onnx && pip install --index-url http://127.0.0.1:80/simple/ --pre onnx
推送 Wheels
从 ONNX Github Actions 收集发布候选版本的 wheel 文件。
ONNX GitHub Action
找到发布分支的运行
或者通过点击“Run workflow”,选择发布分支,然后点击“Run Workflow”来启动一次运行。
点击已完成的运行,滚动到“Artifacts”部分(底部),然后点击“wheels”下载文件。
解压 wheels.zip 文件并将它们的内容合并到一个文件夹中。
手动将生成的 wheels 上传到 TestPyPI:`twine upload --repository testpypi --verbose -u
/*.whl`。 ONNX 项目的当前所有者之一需要授予您项目访问权限,您才能推送文件。
文件中构建的项目名称和版本。
Source Distribution
确保所有 git 子模块都已更新。
git submodule update --init
确保 git checkout 是干净的——
运行
git clean -nxd
确保不存在以下自动生成的头文件。
onnx/onnx-operators.pb.cc
onnx/onnx-operator.pb.h
onnx/onnx.pb.cc
onnx/onnx.pb.h
如果存在,请运行
git clean -ixd
并从您的本地分支中删除这些文件。
生成源分发文件:`python -m build --sdist`
如果您还没有 `build` 包,请运行 `pip install build`。
将源分发文件上传到 TestPyPI:`twine upload --repository testpypi --verbose -u
dist/*` 备注
ONNX 项目的当前所有者之一需要授予您项目访问权限,您才能推送文件。
文件中构建的项目名称和版本。
确认 TestPyPI 包可以安装
Wheel 安装:`pip uninstall -y onnx && pip install -i https://test.pypi.org/simple/ --pre onnx`
假设您的环境有预先构建好的 wheel,否则将开始源码安装。
源码安装:`pip uninstall -y onnx && pip install -i https://test.pypi.org/simple --no-binary onnx --pre onnx`
软件包验证¶
合作伙伴验证
用户应使用 _pip install –no-deps -i https://test.pypi.org/simple/ onnx_(并手动安装其依赖项,以免从 test-pypi 获取)来安装 rc-packages。
使用 onnxruntime 包进行测试
使用已安装的 onnxruntime 包运行 test_with_ort.py 中的测试脚本。
这些脚本使用 onnxruntime 函数(如 `InferenceSession` 和 `InferenceSession.run`)在特定的示例 ONNX 模型上测试 ONNX 函数,例如 `load`、`checker.check_model` 和 `shape_inference.infer_shapes`。
向外部仓库的开放问题
在转换器仓库中创建 GitHub issue,为它们提供软件包链接并测试发布版,然后再公开发布。
https://github.com/microsoft/onnxruntime
注意:他们的仓库中存在 How_To_Update_ONNX_Dev_Notes,其中记录了如何引入新的 ONNX 版本。
如果发现问题,应在 onnx `main` 分支中修复这些 bug,然后将其 cherry-pick 到发布分支。
跟进报告人,确保问题得到解决(并在新的 rc 中得到验证)或推迟到下一个版本。
正式发布¶
在此之前必须完成验证步骤!这是不可逆转的点。
发布后不应更改 git 标签。
一旦推送到 PyPI,就无法更新发布。必须进行新发布。
设置最终版本号¶
创建 PR 以从发布分支的 `VERSION_NUMBER` 文件中删除“rcX”后缀。
创建发布标签¶
根据发布分支起草发布。
在确定不再需要更改之前,请勿点击“Publish release”。
如果需要保存和稍后更新,请使用“Save Draft”。
发布将创建新的 git 标签。
Tag:请参见 准备工作 的顶部,了解要创建的标签。
Target:刚刚创建的发布分支。
Previous tag:选择上一个版本。
Write
使用 之前的发布 作为模板。
使用 Release logistics wiki 中的信息,该信息应在分支创建前创建。
添加自编写维基以来合并到发布中的任何其他提交。
.tar.gz 和 .zip 将在发布后自动生成。
上传到官方 PyPI¶
从 1.19 版本开始,最终发布也将通过 Github 的“Action” -> “Create releases”(见上文)推送到 pypi。使用以下配置进行正式发布:
注释:¶
软件包上传到 PyPI 后,**您无法在同一 PyPI 实例上覆盖它**。
**请确保 TestPyPI 上的一切都正常后再上传到 PyPI。**
PyPI 拥有与 TestPyPI 分开的登录、密码和 API 令牌,但过程相同。ONNX PyPI 所有者需要授予访问权限等。
旧注释(使用 twine)¶
按照上面“上传发布候选版本到 TestPyPI”中的**Wheels**和**Source Distribution**步骤进行,并做以下更改:
在您的 PyPI 账户(**API 令牌**部分)中,为上传 onnx wheel 创建一个名为 `onnx` 的新 API 令牌。
推送 wheels 和源后,删除创建的令牌。
上传时,从 twine 命令中删除 `--repository testpypi`。
验证上传时,从 pip 命令中删除 `-i https://test.pypi.org/simple/` 和 `--pre`。
PyPI 发布后¶
公告
Slack
在 `onnx-release` 和 `onnx-general` 频道发布。
通过电子邮件列表通知 ONNX 合作伙伴
ONNX News 发布
更新 news.json,请参见 示例 news.json PR。
更新 conda-forge 包,使用新的 ONNX 版本。
ONNX 的 Conda 构建通过 conda-forge/onnx-feedstock 进行,该项目为构建包并将其上传到 conda-forge 提供基础设施。
在发布版本在 https://github.com/onnx/onnx/releases 上可用几小时后,`regro-cf-autotick-bot` 将自动创建一个 PR。
如果自动 PR 构建失败
创建 conda-forge/onnx-feedstock 的个人 fork。
基于自动 PR 分支创建个人分支。
解决构建问题。
提交一个基于您分支的替换 PR。
如果未创建自动 PR,则需要手动提交 PR。
注意:使用发布版本的 tar.gz 文件(来自 https://github.com/onnx/onnx/releases)的 sha256 哈希值(`sha256sum onnx-X.Y.Z.tar.gz`)。
合并到 main 分支
检查发布分支的哪些更改也与 main 分支相关。
如果在发布分支中直接进行了紧急更改,则将发布分支合并回 main 分支。
如果所有合并到发布分支(在分支创建后)的 PR 都是从 main 分支 cherry-pick 的,那么合并 PR 将显示为空,则无需此步骤。
移除 PyPI 上旧的 onnx-weekly 包
从 PyPI 中移除刚刚发布的版本的 onnx-weekly 包,以节省空间。
步骤
-
这是与 onnx 发布不同的项目,您可能需要从所有者那里请求访问权限。
点击目标软件包 -> Options -> Delete。
-
移除 PyPI 上旧的 release-candidate 包
从 PyPI 中移除 `onnx-release-candidate` 包,至少追溯到上一个发布版本指定的时间,以节省空间。
步骤
-
这是与 onnx 发布不同的项目,您可能需要从所有者那里请求访问权限。
点击目标软件包 -> Options -> Delete。
-