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` 分支中,创建发布分支之前

    1. version.h 中增加 `LAST_RELEASE_VERSION`。

      • 设置为 X.Y.Z,这与您当前正在创建的发布分支相同。

      • 在发布分支创建后,`main` 分支中的 `VERSION_NUMBER` 将被增加到下一个未来版本。

    2. ONNX proto 文件Versioning.mdschema.hhelper.pyhelper_test.py 中,确保新发布的发布版本、IR 版本、ai.onnx opset 版本、ai.onnx.ml opset 版本和 ai.onnx.training opset 版本是正确的。

  • 创建发布分支

    1. branches 中点击“New branch”,选择 `main` 作为 Source。

    2. 确保新分支上的所有测试都通过。

  • 创建发布分支后

    1. 创建 PR 以将 `main` 分支中的 `VERSION_NUMBER` 文件设置为下一个未来版本,即 `X.Y+1.0`。

    2. 创建 PR 以将新发布分支中的 `VERSION_NUMBER` 文件设置为 `X.Y.Zrc1`。

      • 例如,1.16.0 的第一个发布候选版本将是 `1.16.0rc1`。

    3. 在 `onnx/defs/operator_sets.h` 和 `onnx/defs/schema.h` 中增加 ai.onnx 域的 opset 版本,以便将来添加和修改运算符时使用。

将发布候选版本上传到 TestPyPI(无需离线步骤,从 onnx 版本 1.19 开始)

  • 转到“Actions” -> 选择 “Create Releases” -> 点击“Run workflow”按钮,并使用以下配置:

RunWorkflow

RC-Candidates

create_releases_overview_jobs
  • 所有单个运行的工件都可以在对应的作业中找到。

create_releases_artifact_overview
  • 在最终合并之前,必须通过设置的部署环境手动确认。

将发布候选版本上传到 TestPyPI(适用于截至 1.18(含)的版本 / 1.19 的后备方案)

重要提示

  • **等待** PR 合并并构建以设置发布分支的 `VERSION_NUMBER`,然后再继续。

  • 如果您尚未安装 `twine`,请安装:`pip install twine`

    • 当 `twine` 命令提示输入密码时,请使用 API 令牌。您的密码将不起作用。

  • 与 PyPI 类似,发布版本只能上传到 TestPyPI **一次**。

    • 要更新已上传的文件,您必须增加 `VERSION_NUMBER`,重新构建,并上传新的 X.Y.Zrc2 等。

    • 要测试上传命令,您可以使用 docker 或 podman 创建本地 pypi 服务器。

      1. 启动服务器 `docker run --rm -it --platform linux/amd64 -p 80:8080 pypiserver/pypiserver:latest run -a . -P .`

        • 这将启动一个本地 pypiserver,无需身份验证(任何用户/密码都可用)。

        • 容器不保存状态。停止并重新启动它将允许您多次推送同一版本。

      2. 上传文件

        • 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/*`

      3. 从您的测试服务器拉取和安装

        • pip uninstall -y onnx && pip install --index-url http://127.0.0.1:80/simple/ --pre onnx

推送 Wheels

  1. 从 ONNX Github Actions 收集发布候选版本的 wheel 文件。

    • ONNX GitHub Action

    • 找到发布分支的运行

      • 或者通过点击“Run workflow”,选择发布分支,然后点击“Run Workflow”来启动一次运行。

      • 点击已完成的运行,滚动到“Artifacts”部分(底部),然后点击“wheels”下载文件。

      • 解压 wheels.zip 文件并将它们的内容合并到一个文件夹中。

  2. 手动将生成的 wheels 上传到 TestPyPI:`twine upload --repository testpypi --verbose -u /*.whl`。

    • ONNX 项目的当前所有者之一需要授予您项目访问权限,您才能推送文件。

    • 文件中构建的项目名称和版本。

Source Distribution

  1. 确保所有 git 子模块都已更新。

    • git submodule update --init

  2. 确保 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 并从您的本地分支中删除这些文件。

  3. 生成源分发文件:`python -m build --sdist`

    • 如果您还没有 `build` 包,请运行 `pip install build`。

  4. 将源分发文件上传到 TestPyPI:`twine upload --repository testpypi --verbose -u dist/*`

    • 备注

      • ONNX 项目的当前所有者之一需要授予您项目访问权限,您才能推送文件。

      • 文件中构建的项目名称和版本。

  5. 确认 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`

软件包验证

合作伙伴验证

正式发布

在此之前必须完成验证步骤!这是不可逆转的点。

  • 发布后不应更改 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。使用以下配置进行正式发布:

RunWorkflow_Final

注释:

  • 软件包上传到 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 发布后

公告

更新 conda-forge 包,使用新的 ONNX 版本。

ONNX 的 Conda 构建通过 conda-forge/onnx-feedstock 进行,该项目为构建包并将其上传到 conda-forge 提供基础设施。

合并到 main 分支

  • 检查发布分支的哪些更改也与 main 分支相关。

    • 如果在发布分支中直接进行了紧急更改,则将发布分支合并回 main 分支。

    • 如果所有合并到发布分支(在分支创建后)的 PR 都是从 main 分支 cherry-pick 的,那么合并 PR 将显示为空,则无需此步骤。

移除 PyPI 上旧的 onnx-weekly 包

  • 从 PyPI 中移除刚刚发布的版本的 onnx-weekly 包,以节省空间。

  • 步骤

    • 转到 PyPI onnx-weekly/releases

      • 这是与 onnx 发布不同的项目,您可能需要从所有者那里请求访问权限。

    • 点击目标软件包 -> Options -> Delete。

移除 PyPI 上旧的 release-candidate 包

  • 从 PyPI 中移除 `onnx-release-candidate` 包,至少追溯到上一个发布版本指定的时间,以节省空间。

  • 步骤

    • 转到 PyPI onnx-weekly/releases

      • 这是与 onnx 发布不同的项目,您可能需要从所有者那里请求访问权限。

    • 点击目标软件包 -> Options -> Delete。