Skip to content

chore: ORT バージョン floor 統一と CI gate 拡張 (Issue #372) - #404

Merged
ayutaz merged 2 commits into
devfrom
chore/issue-372-ort-version-sync
May 9, 2026
Merged

chore: ORT バージョン floor 統一と CI gate 拡張 (Issue #372)#404
ayutaz merged 2 commits into
devfrom
chore/issue-372-ort-version-sync

Conversation

@ayutaz

@ayutaz ayutaz commented May 9, 2026

Copy link
Copy Markdown
Owner

Closes #372

Summary

Issue #372Option C (各ランタイム独立の最新 stable を許容、ただし floor は C++ canonical 以上) を実装。PR #403 で C++ パイプラインの 1.17.0 → 1.20.0 統一 + CI gate 化が済んでいるので、本 PR はその上に floor pin 統一 + CI gate を全ランタイムに拡張 を載せる。

なぜ Option C か

  • Option A (全部 1.20.0 に揃える): C# (1.24.3) / Go (1.27.0) を ダウングレード する必要があり ecosystem 慣習に反する。
  • Option B (canonical を 1.24.x に上げる): iOS pod-archive / Android Maven / 各 OS pre-built tgz / sha256 を全部更新する必要があり、PR feat: G2P を文単位で並列化し Python は ORT 推論ともオーバーラップ (Python/Rust/C#/Go/C++、Issue #383) #403 直後に再度大きい移行をするコストが高い。
  • Option C: 最新 stable に追従しつつ、floor pin だけ揃えて「明示的に古いものを使ってしまう」事故を防ぐ。bit-exactness は捨てる代わりに、ecosystem-native な選択を維持。

変更内容

A. drift 修正 (5 ファイル)

ファイル Before After
docker/cpp-dev/Dockerfile 1.17.0 (URL 5 行) 1.20.0 (canonical 整合)
src/python/pyproject.toml (train/inference/inference-gpu の 3 ヶ所) >=1.17 >=1.20.0
src/python_run/requirements.txt >=1.11.0 >=1.20.0
src/python_run/requirements_gpu.txt >=1.11.0,<2 >=1.20.0,<2
src/python_run/setup.py extras_require gpu >=1.11.0,<2 >=1.20.0,<2

B. CI gate 拡張 (scripts/check_ort_versions.py)

  • 既存 exact-match group に docker/cpp-dev/Dockerfile を追加
  • 新規 floor-check group を実装:
    • Python (pyproject.toml / requirements*.txt / setup.py)
    • C# (5 csproj: PiperPlus.{Core,Cli,Cli.Tests,Core.Tests,Bench})
    • Go (go.mod)
    • WASM (package.json peerDependencies)
  • ecosystem 別の version 抽出 regex (Python PEP 508 / C# csproj / Go go.mod / npm peerDep)
  • parse_version() で SemVer-ish 比較 (短形式 1.20(1, 20, 0)、pre-release 剥がし対応)
  • C# 1.24.3 / Go 1.27.0 / WASM 1.21.0 はそのまま (>= 1.20.0 を満たす)

C. テスト (scripts/test_check_ort_versions.py)

22 テスト追加で 合計 39 テスト:

  • parse_version 正規化 (7 ケース): leading v、短形式パディング、pre-release / build-metadata 剥がし
  • SemVer ordering (1 テスト): tuple comparison が major > minor > patch を正しく扱う
  • ecosystem 別パターン抽出 (8 ケース): Python / C# / Go / npm の各形式
  • floor 違反検出 (1)
  • canonical 一致時 pass (1)
  • canonical 超過時 pass (1, C# 1.24.3 / Go 1.27.0 を想定)
  • 短形式の境界 (2)
  • 同一ファイル内 dedup (1)

D. workflow (ort-version-sync.yml)

  • trigger paths に floor 対象ファイルを追加 (pyproject.toml / requirements*.txt / setup.py / csharp/**/*.csproj / go.mod / package.json / Dockerfile)
  • 既存 paths を 「Source of truth + script」 「Exact-match group」 「Floor-check group」 に整理

E. spec (docs/spec/ort-versions.md)

  • Policy セクション (Option C 方針) を追加
  • 全ランタイムのマトリクスを最新化、Floor (Issue #372) 列で各ファイルが gate を通っているか可視化
  • Updating セクションに canonical bump 時の手順 (Python / C# / Go / WASM への波及含む) を追加
  • Rust ort exemption セクションで RC 例外の理由 + action items を明記

Rust ort 2.0.0-rc.12 を扱わない理由

ort crate は 2026-05 現在 stable 版が crates.io に未公開 (2.0.0-rc.12 が最新)。

  • ort 1.x stable は存在するが API が大きく異なり、piper-core / piper-cli / piper-python / piper-wasm の 4 crate を書き換える必要あり
  • ort 2.x stable のリリース待ちが現実的

→ 本 PR では Rust に手を入れず、docs/spec/ort-versions.md に「ort 2.x stable リリース待ち、別 issue でトラッキング」と明記。

検証

  • python scripts/check_ort_versions.py --verbose ローカル成功 (canonical: 1.20.0、全ファイル OK)
  • pytest scripts/test_check_ort_versions.py ローカル成功 (39/39 pass)
  • ruff format / ruff check クリーン
  • CI: ORT version sync gate pass
  • CI: 既存 Python lint + tests に regression なし

Test plan

  • CI 全 workflow pass を待つ
  • ort-version-sync.yml が新しい paths でも trigger することを確認
  • レビュー: Option C のポリシー判断が docs/spec/ort-versions.md で読み取れること
  • レビュー: Rust ort RC を別 issue でトラッキングする方針に同意できること

Option C 方針 (各ランタイム独立の最新 stable を許容、ただし floor は
C++ canonical 以上) を実装:

- docker/cpp-dev/Dockerfile: 1.17.0 → 1.20.0 (canonical 整合)
- Python (pyproject.toml の train/inference/inference-gpu extras +
  requirements.txt + requirements_gpu.txt + setup.py extras_require)
  の onnxruntime{,-gpu} floor を >=1.20.0 に統一
- scripts/check_ort_versions.py に floor-check モード追加
  (Python / C# / Go / WASM の dep ファイルが canonical 以上か検証)
- scripts/test_check_ort_versions.py に 22 テスト追加 (合計 39)
- ort-version-sync.yml の検査 paths を floor 対象まで拡張
- docs/spec/ort-versions.md を Option C 方針 + 最新マトリクスで更新

Rust ort 2.0.0-rc.12 は upstream に stable 版がないため (2026-05 時点)、
本 PR では触らず docs/spec/ort-versions.md に「別途トラッキング」と明記。
Copilot AI review requested due to automatic review settings May 9, 2026 08:20
@ayutaz ayutaz self-assigned this May 9, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Issue #372 の Option C 方針に基づき、C++ canonical ORT バージョンを基準に各ランタイムの floor pin を統一し、さらにそれを CI gate として自動検証するよう拡張するPR。

Changes:

  • Python ランタイム/学習系の ORT 依存 floor を >=1.20.0 に引き上げ
  • scripts/check_ort_versions.py に floor-check group を追加し、CI gate 対象を全ランタイムへ拡張
  • テスト・spec・workflow の更新で運用手順と検知範囲を明文化

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/python_run/setup.py GPU extras の ORT floor を >=1.20.0 に更新
src/python_run/requirements_gpu.txt GPU requirements の ORT floor を >=1.20.0 に更新
src/python_run/requirements.txt CPU requirements の ORT floor を >=1.20.0 に更新
src/python/pyproject.toml train/inference の ORT floor を >=1.20.0 に更新
scripts/test_check_ort_versions.py floor-check / parse_version を含むテストを追加
scripts/check_ort_versions.py exact-match + floor-check の2段検証に拡張
docs/spec/ort-versions.md Option C ポリシー、対象範囲、更新手順を追記
docker/cpp-dev/Dockerfile dev image の ORT を canonical(1.20.0) に整合
.github/workflows/ort-version-sync.yml floor 対象ファイルも paths に追加し gate 対象拡張

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread scripts/check_ort_versions.py
Comment thread scripts/check_ort_versions.py
Comment thread scripts/check_ort_versions.py Outdated
Comment 1: Python/npm の floor regex を operator バリエーションに対応
- Python: `>=` 限定 → `==` / `~=` も検出 (PEP 440 のうち lower-bound
  を構成する operator)
- npm: `>=` 限定 → `^` / `~` / 無印 (exact pin) も検出
- 実運用での `onnxruntime==1.19.0` や `"onnxruntime-web": "^1.19.0"`
  といった指定で gate がすり抜けないことをテスト 5 ケースで pin

Comment 2: 必須ファイル missing を warn+skip → fail に変更
- TARGETS / FLOOR_TARGETS の missing は failures に積んで rc=1 にする
- 「移動/削除/リネームに気付けない」リスクを排除
- ファイルが存在/不存在の双方を unit test で検証 (3 ケース新設)

Comment 3: csproj XML 属性順序非依存
- `Include` 先 / `Version` 先の両方を許容する 2 本の regex に分割
- 全 floor regex を named groups (`?P<pkg>` / `?P<ver>`) に統一して
  順序差を helper 側で吸収
- `Version` 先・属性間に無関係な属性を挟むケースのテストを追加

テスト合計: 39 → 55 (+16)
@ayutaz

ayutaz commented May 9, 2026

Copy link
Copy Markdown
Owner Author

Copilot 3 件のレビューコメント、全て対応しました (commit 07b77fb)。

Comment 1: 実運用 operator のすり抜け対策

>= 限定の regex を operator バリエーションに拡張:

  • Python: >= / == (exact pin) / ~= (compatible release) を全部検出
  • npm: >= / ^ (caret) / ~ (tilde) / 無印 (exact pin) を全部検出

< / <= は upper bound なので意図的に対象外 (今回のリポジトリで使用例なし、検出は別 gate の責務)。テスト 5 ケースで「==1.19.0^1.19.0 で floor すり抜けを検出する」ことを pin。

Comment 2: 必須ファイル missing を fail 化

TARGETS / FLOOR_TARGETS の missing は failures に積んで rc=1 で終了。warn+skip だと「ファイル移動/削除/リネームで gate が無効化されても気付けない」というご指摘の通り。

実装済み:

  • exact-match 側: TARGETS 中の missing → fail (理由メッセージ + 対処手順)
  • floor-check 側: FLOOR_TARGETS 中の missing → fail (同上)
  • unit test 3 ケースで「missing → rc=1 / fail メッセージ含む」「全部存在 → rc=0」を検証

Comment 3: csproj XML 属性順序非依存

XML 仕様上 Include / Version の順序は意味を持たないため、両方の順序を許容する 2 本の regex に分割。同時に全 floor pattern を named groups (?P<pkg> / ?P<ver>) に統一し、helper 側で順序差を吸収するように。

テストでカバー:

  • Include="..." Version="..." (canonical 順、既存)
  • Version="..." Include="..." (順序逆、新規)
  • Include="..." PrivateAssets="all" Version="..." (属性間に他属性が挟まる、新規)

XML パーサ採用も検討しましたが、現状 regex の運用簡潔さ + named groups で属性順序を吸収する方針で十分堅牢と判断。


テスト: 39 → 55 (+16) 全 pass、ruff クリーン、scripts/check_ort_versions.py --verbose ローカル成功。

@ayutaz
ayutaz merged commit 1595f63 into dev May 9, 2026
49 checks passed
@ayutaz
ayutaz deleted the chore/issue-372-ort-version-sync branch May 9, 2026 14:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: ONNX Runtime バージョンを各言語間で整合する

2 participants