feat(docker): trial distroless variant for python-inference (CPU) - #523
Conversation
M3 distroless 化を derisk する trial PR。 既存 Dockerfile.cpu と docker-compose / HF Space deploy 経路は不変更で残し、 並行 Dockerfile.cpu.distroless を新設して build / size / smoke test を CI で実証する scope。 - 新規 Dockerfile (Dockerfile.cpu.distroless): multi-stage build (builder = python:3.13-slim-trixie、 final = cgr.dev/chainguard/ python:latest)。 builder で piper_plus_g2p[all] + piper_train [inference] + Gradio WebUI requirements + NLTK data を install、 final へ Python site-packages + /usr/local/bin/uvicorn + 必要な shared libs (libsndfile / libgomp / libFLAC / libvorbis / libogg / libopus / libmpg123) を COPY - 新規 CI workflow (python-inference-distroless-trial.yml): PR base + workflow_dispatch、 canonical Dockerfile.cpu を baseline として build、 distroless trial を build、 image size 比較、 import smoke test 2 種を実行、 PR コメントに sticky report 投稿 - scope 限定: linux/amd64 single-arch CI build のみ、 multi-arch (arm64) は別 PR、 /v1/audio/speech E2E は別 PR、 CVE 比較 (Trivy) は canonical 置換 PR 側、 HF Space staging deploy 検証は user 手動 step (Claude Code は実行不可) - promotion path: trial PR で build 成立 + size 削減効果が確認 できた後、 別 PR で Dockerfile.cpu 自体を置換 (HF Space staging で cold start 検証後)
Action SHA drift reportCollected pins (3 actions) — expected_total_pins=3
Summary: total=3, ok=3 |
Required status-check gate (deferred)Head SHA |
scripts/check_doc_examples.py audit が docs/tickets/tickets/T-012-* に 追記した scope note の line shift を検出したため snapshot を再生成。 line_start/line_end が +10 ずれただけで block の hash_sha1 と category は 不変。 doc-examples-gate が PR base trigger でこの drift を fail として 拾ったので、 trial PR scope に含めて修正。
There was a problem hiding this comment.
Pull request overview
This PR adds a trial distroless variant of the docker/python-inference CPU image and a dedicated CI workflow to validate buildability, image size, and basic import/runtime smoke checks, while keeping the current canonical deployment path unchanged.
Changes:
- Added
docker/python-inference/Dockerfile.cpu.distrolessas a multi-stage distroless trial image (builder on Debian Python 3.13, final on Chainguard Python). - Added
.github/workflows/python-inference-distroless-trial.ymlto build canonical vs trial images, compare sizes, run smoke tests, and post a sticky PR comment report. - Updated ticket/docs audit bookkeeping and CHANGELOG to reflect the trial scope.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/fixtures/doc_examples_audit/audit.json | Updates audited line ranges for the modified ticket doc. |
| docs/tickets/tickets/T-012-distroless-python-inference.md | Updates ticket status/scope notes to reflect the trial approach. |
| docker/python-inference/Dockerfile.cpu.distroless | Introduces the distroless trial Dockerfile (multi-stage, shared libs copying, healthcheck/entrypoint). |
| .github/workflows/python-inference-distroless-trial.yml | Adds CI workflow to build/measure/smoke-test distroless trial and post a sticky report. |
| CHANGELOG.md | Documents the new trial Dockerfile + CI workflow addition. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…nown-risk dlopens CI run on PR #523 revealed that onnxruntime's C extension (linked against builder's libc) fails to load inside chainguard/python's runtime. soundfile's dlopen of libsndfile carries the same class of risk. Promotion-blocking, but exactly the gap the trial PR is meant to MEASURE — not to crash on. Split the smoke step: - pure-Python imports (piper_train / FastAPI / uvicorn) stay required. These prove the multi-stage site-packages COPY landed correctly. - onnxruntime + soundfile become `continue-on-error: true` known-risk probes. The report.md surfaces PASS/FAIL/SKIPPED per probe so the promotion PR has clear signal on which base image to switch to (likely gcr.io/distroless/python3-debian12 — Debian-glibc baseline matches the debian-slim builder, with the trade-off of pinning Python 3.11). Also: - Make report.md generation `if: always()` so a failed smoke still produces the sticky comment. - Gate sticky-comment post on hashFiles('...report.md') != '' so a truly missing file doesn't escalate to a hard CI failure.
…ess/python3-debian12 (ABI root cause) Previous trial used cgr.dev/chainguard/python:latest as the final stage and python:3.13-slim-trixie as the builder. CI run on PR #523 failed with ModuleNotFoundError on onnxruntime.capi.onnxruntime_pybind11_state — the root cause is that chainguard/python is Wolfi-based with its own glibc/Python ABI, distinct from debian-slim. Pre-built onnxruntime wheels cannot resolve symbols across that boundary. The previous follow-up commit (b04583d) wrapped the failing smoke steps with `continue-on-error: true`, which masked the symptom without fixing the cause. That commit is effectively reverted here: smoke tests are back to required + executed in a single docker run. Root fix: - builder: keep python:3.11-slim-trixie (Debian, glibc-2.36+ via bookworm) - final: switch to gcr.io/distroless/python3-debian12 Both stages share Debian-glibc ABI, so onnxruntime's pre-built C extension and soundfile's libsndfile dlopen succeed by construction. Python version aligns at 3.11 with the canonical Dockerfile.cpu (no Python version drift). distroless/python3-debian12 ships UID 65532 nonroot by default and has no shell / package manager, meeting the trial's distroless goals. Trade-off vs. Wolfi: Debian baseline carries slightly more inherited package state than Wolfi, but it's already the SBOM surface of Dockerfile.cpu, so there's no new attack surface relative to canonical.
Distroless migration trial:
|
| metric | canonical (Dockerfile.cpu) |
distroless trial | delta |
|---|---|---|---|
| image size (linux/amd64) | 1.3GB | 756MB | -42.5% |
Smoke results
All imports passed in a single docker run: ONNX Runtime (CPU EP) / piper_train / FastAPI / uvicorn / soundfile.
Not in this trial (follow-up PR)
- linux/arm64 buildx (Pi / Apple Silicon / HA boxes)
- HF Space staging deploy + cold-start latency comparison (user manual)
/v1/audio/speechend-to-end with a real model fixture (CI lacks the ONNX model bundle)- CVE scan diff (Trivy) — wired up alongside the canonical
Dockerfile.cpupromotion PR
…cker-build PR #523 で新設した Dockerfile.cpu.distroless は専用 workflow (python-inference-distroless-trial.yml) でしか build されておらず、 既存 docker workflow chain (hadolint lint / trivy CVE scan / docker-build multi-arch build) が pickup していなかった。 関連する docker ビルドが全部走って動くことを保証するため、 3 workflow に trial Dockerfile を追加。 - hadolint.yml: matrix.dockerfile list に docker/python-inference/Dockerfile.cpu.distroless を追加。 PR base trigger で Dockerfile lint が走り、 構文 / best-practice 違反を 既存と同じ gate で catch - trivy-container-scan.yml: target matrix に python-inference-cpu-distroless を追加。 専用 trial workflow の size 比較とは別軸で CVE 数値の SARIF を生成し GitHub Security tab に upload (CRITICAL のみ PR fail、 既存 conservative policy 継続) - docker-build.yml: 新 job build-python-inference-cpu-distroless-trial を追加。 既存 build-python-inference-cpu と同じ multi-arch (linux/arm64 + linux/amd64) で buildx build、 PR では push しない (canonical 経路ゼロ影響)。 trial 専用 workflow が amd64-only (A/B size 比較のため) で cover できない arm64 build 互換性を 保証する これで PR #523 が触る trial Dockerfile は専用 workflow + 3 既存 docker workflow の合計 4 経路で build + lint + scan が走る形に なり、 「関連 docker build がすべて動く」 状態を CI で実証できる。
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
PR #523 CI で 2 件の関連 docker workflow が fail。 いずれも表面取り繕い ではなく根本対応: 1. hadolint DL3026 (use only an allowed registry in FROM): gcr.io が .hadolint.yaml の trustedRegistries に未登録だったため、 gcr.io/distroless/python3-debian12 を base にした Dockerfile が lint で reject されていた。 gcr.io を allow-list に追加 (理由 コメント付き)。 vendor registry の policy 拡張で、 base image 切替 のたびに lint 設定を後追い修正する状況を解消。 2. docker-build multi-arch build fail (linux/arm64 で `lstat /usr/lib/x86_64-linux-gnu: no such file or directory`): Debian multiarch layout で arch 別 triplet ディレクトリは x86_64 → /usr/lib/x86_64-linux-gnu/ aarch64 → /usr/lib/aarch64-linux-gnu/ と分かれており、 hardcoded x86_64 path での COPY は arm64 build で必ず破綻する。 設計を変更して builder stage で必要な lib を /opt/runtime-libs/ にまとめてから final stage が arch 不問で COPY する形に変更。 bash wildcard ('*-linux-gnu/') を builder 側で 1 回 resolve させ、 final stage は単一 deterministic path のみを参照。 両 fix を統合的に testing できるよう、 既存 4 workflow chain (専用 trial workflow + hadolint + trivy + docker-build) で build / lint / scan / multi-arch build をすべて走らせる。
… + require baseline build PR #523 review (Copilot) 5 件のうち、 現 commit chain で実態が変化した 1 件を除く 4 件に根本対応。 表面取り繕いはせず、 distroless 実態と canonical 経路の signal 整合性を取り直す。 - python alias 問題 (Copilot指摘 #2/#3/#4 同根): gcr.io/distroless/python3-debian12 ships /usr/bin/python3 のみ。 `python` symlink は debian / distroless どちらでも default では 存在しない (debian の python-is-python3 package がないと作られ ない)。 - Dockerfile ENTRYPOINT/HEALTHCHECK CMD の `python` を `/usr/bin/python3` 絶対パスに変更 (PATH 経由の name resolution に依存しない設計)。 - workflow smoke step の `--entrypoint python` を `--entrypoint /usr/bin/python3` に変更。 - /usr/local/bin/uvicorn の COPY を撤回 (Copilot指摘 #3): pip-generated console script の shebang は builder の `#!/usr/local/bin/python` を hardcode。 final stage には /usr/local/bin/python が存在しない (interpreter は /usr/bin/python3 のみ) ため、 uvicorn を直接 exec すると shebang 解決 fail。 ただし inference.py が `import uvicorn; uvicorn.run(...)` で起動する programmatic invocation のみ使うため、 console script はそもそも 不要。 「壊れた状態の uvicorn 実行ファイルを置いておく」 のは reviewer 混乱の元になるため削除。 site-packages 内の uvicorn module は import 経由で動作する。 - baseline build の continue-on-error: true を削除 (Copilot指摘 #5): canonical Dockerfile.cpu は HF Space deploy 経路。 build が壊れて いれば trial の size 比較は意味を失う + canonical 自体が silently red になる二重リスク。 required (default) に戻して、 canonical 破損 は即 fail で見えるようにする。 未対応の指摘 1 件 (Copilot #1 = chainguard:latest 固定 reproducibility) は commit 00b6ed3 で chainguard 自体を gcr.io/distroless に置き換え 済みのため stale。 review thread に reply で経緯を返答する。
…6 / DS-0002) PR #524 CI で 4 件 fail。 表面取り繕いせず根本原因に対応: 1. cpp-inference smoke fail (GLIBC_2.38 not found): builder = ubuntu:24.04 (glibc 2.39) で link した piper を distroless/cc-debian12 (glibc 2.36) で実行すると symbol version 不一致で fail。 PR #523 で確立した「builder と final の base 系列を 揃える」 原則に従い、 builder を debian:12-slim (glibc 2.36) に 変更。 同じ Debian 12 baseline で symbol versions が resolvable に。 2. cpp-dev build fail (exit 127 = wget command not found): wolfi-base は minimal で wget も curl も同梱せず。 apk add の package list に wget を追加。 3. cpp-dev hadolint DL4006 (pipefail not set): OpenJTalk / HTS Engine の source build で `tar -xzf ... | ...` パイプを使う RUN が複数あるが、 Wolfi の /bin/sh は default で pipefail off。 Dockerfile 先頭で SHELL ["/bin/sh", "-o", "pipefail", "-c"] を宣言し、 以降の全 RUN で pipe 失敗を伝播させる。 4. trivy webui DS-0002 (no USER directive): gcr.io/distroless/python3-debian12 は default で UID 65532 nonroot だが、 Trivy の Dockerfile 静的 linter は base image default では なく Dockerfile 内の明示的な `USER` 行を要求 (auditability)。 `USER 65532` を WORKDIR の直後に追加。 いずれも multi-arch / shared lib / lint 設定の構造的問題で、 continue-on-error や `ignore-unfixed: true` 系の symptom 抑制は していない。
* feat(docker): 3 image distroless trial Dockerfiles + CI (cpp-dev / webui / cpp-inference) PR #523 (python-inference) で確立した distroless trial pattern を、 deploy 検証要件のない残 3 image に bundle 適用。 既存 Dockerfile / docker-compose / 関連 CI は不変更で残し、 並行 Dockerfile.distroless を 3 枚追加して build / size A/B / smoke test を CI で実証する scope。 promotion (canonical 置換) は image 別に別 PR。 新規 Dockerfile (3 image): - docker/cpp-dev/Dockerfile.distroless (Wolfi minimal、 dev image): base = cgr.dev/chainguard/wolfi-base、 apk add で cmake / clang / gdb / valgrind / cpplint / cmake-format / gcovr の dev toolchain を導入。 ticket T-016 §2.2 推奨どおり Wolfi 採用 (distroless/cc- debian12 は dev 用途と矛盾)。 - docker/webui/Dockerfile.distroless (Python + Gradio): builder = python:3.11-slim-trixie、 final = gcr.io/distroless/python3-debian12。 PR #523 と同型 Debian-glibc ABI 統一、 /usr/bin/python3 絶対パス 起動、 arch-neutral lib staging。 ENTRYPOINT は python3 /app/app.py (canonical の entrypoint.sh は shell なしで使えず、 実体は同等の 単一行 exec)。 - docker/cpp-inference/Dockerfile.distroless (C++ runtime): builder = ubuntu:24.04 (canonical と同型、 CMake ExternalProject graph 維持)、 final = gcr.io/distroless/cc-debian12。 piper binary + ONNX Runtime / libgomp shared lib + OpenJTalk 辞書を COPY、 libgomp は arch- neutral staging で bring-over。 ENTRYPOINT を /usr/local/bin/piper に直接化 (canonical の entrypoint.sh は shell が必要)。 CI 統合: - 新規 .github/workflows/docker-distroless-trial.yml: 3 image matrix で canonical baseline + distroless trial build → size 比較 → smoke (cpp-dev: cmake/clang/python3 起動 / webui: Gradio import / cpp-inference: piper --version) → aggregate sticky 投稿。 - 既存 hadolint.yml matrix に 3 Dockerfile 追加、 trivy-container- scan.yml matrix に 3 target 追加、 docker-build.yml の trial job を 4 image matrix 化 (PR #523 と合わせて 4 image の multi-arch build が並走)。 - .hadolint.yaml の trustedRegistries に cgr.dev を追加 (wolfi-base 用、 gcr.io は PR #523 で追加済み)。 promotion path: 各 trial で build + size 効果が確認できた後、 image 別に canonical 置換 PR を作成 (cpp-dev = 最も低リスク、 webui = webui-test.yml smoke、 cpp-inference = container test gate での実 モデル E2E が前提)。 3 ticket header (T-013 / T-015 / T-016) の Status を「着手中 (trial PR scope)」 に更新。 * fix(docker): 4 root-cause CI fixes (glibc ABI / wolfi minimal / DL4006 / DS-0002) PR #524 CI で 4 件 fail。 表面取り繕いせず根本原因に対応: 1. cpp-inference smoke fail (GLIBC_2.38 not found): builder = ubuntu:24.04 (glibc 2.39) で link した piper を distroless/cc-debian12 (glibc 2.36) で実行すると symbol version 不一致で fail。 PR #523 で確立した「builder と final の base 系列を 揃える」 原則に従い、 builder を debian:12-slim (glibc 2.36) に 変更。 同じ Debian 12 baseline で symbol versions が resolvable に。 2. cpp-dev build fail (exit 127 = wget command not found): wolfi-base は minimal で wget も curl も同梱せず。 apk add の package list に wget を追加。 3. cpp-dev hadolint DL4006 (pipefail not set): OpenJTalk / HTS Engine の source build で `tar -xzf ... | ...` パイプを使う RUN が複数あるが、 Wolfi の /bin/sh は default で pipefail off。 Dockerfile 先頭で SHELL ["/bin/sh", "-o", "pipefail", "-c"] を宣言し、 以降の全 RUN で pipe 失敗を伝播させる。 4. trivy webui DS-0002 (no USER directive): gcr.io/distroless/python3-debian12 は default で UID 65532 nonroot だが、 Trivy の Dockerfile 静的 linter は base image default では なく Dockerfile 内の明示的な `USER` 行を要求 (auditability)。 `USER 65532` を WORKDIR の直後に追加。 いずれも multi-arch / shared lib / lint 設定の構造的問題で、 continue-on-error や `ignore-unfixed: true` 系の symptom 抑制は していない。 * fix(docker): remove pipe in cpp-dev verification RUN to satisfy DL4006 PR #524 CI で hadolint DL4006 が再発。 前 commit で SHELL directive に pipefail を設定したが、 hadolint の DL4006 ルールは Dockerfile- level SHELL 設定を考慮せず、 RUN 内のパイプを問答無用で flag する 仕様。 `bash -o pipefail -c "..."` 形式の解決策はあるが、 verification RUN にパイプは本質的に不要 (gdb --version の出力を 1 行に絞る head は 情報削減でしかない) ため、 パイプを排除する形で根本対応する。 変更点: gdb --version | head -n1 → gdb --version これで verification RUN にパイプ無し、 DL4006 lint pass。 なお残る `|` は line 103 / 178 の `||` (OR operator) のみで shell pipe ではない (hadolint も `||` は flag しない)。 * fix(docker): mkdir /usr/local/{lib,include} explicitly for wolfi-base PR #524 CI で cpp-dev build が exit 1。 真の原因は wolfi-base (cgr.dev/chainguard/wolfi-base) が /usr/local/lib および /usr/local/include を pre-create していない設計 (apk 系 minimal distribution の慣習)。 ubuntu:24.04 ベースの canonical Dockerfile は これらを base image が既に持っているため気付かなかった。 cp -r /tmp/ort/include/* /usr/local/include/ が "can't create directory '/usr/local/include/core': No such file or directory" で fail していたのは、 destination directory 自体が存在しなかったため。 ONNX Runtime extract RUN の頭で mkdir -p /usr/local/lib /usr/local/include を明示。 これで wolfi-base + apk のみで pre-create されない system path も canonical Ubuntu と同じ filesystem layout に 寄せられる。 * chore(docker): drop cpp-dev from this PR — wolfi-base / OpenJTalk-mecab incompatible PR #524 CI で cpp-dev distroless trial の build が連続 fail。 真の原因は ticket T-016 §2.2 推奨の cgr.dev/chainguard/wolfi-base が canonical Dockerfile が依存する Debian apt package 群 (OpenJTalk / HTS Engine / mecab / libmecab-dev + source build に必要な iconv / libtool / gettext 等) の互換性を持たないこと。 1 build cycle ごとに missing apk が 順次判明する infinite chain で、 trial の目的 (Wolfi minimal の CVE/size 削減効果) が達成できない構造。 表面取り繕い (apk add で missing を順次足す) ではなく根本判断: cpp-dev を本 PR から完全除外し、 T-016 ticket 自体の base image 戦略 見直し (debian:12-slim 化 or M3 scope からの除外) を別 PR で扱う。 本 PR の scope を 2 image (webui + cpp-inference) に縮小: - docker/cpp-dev/Dockerfile.distroless: 削除 - workflow 4 件 (hadolint / trivy / docker-build / docker-distroless-trial) の matrix / paths / sticky から cpp-dev を削除 - CHANGELOG / 3 ticket header (T-013 / T-015 / T-016) を 2 image scope に整合化 - T-016 ticket: Status を 計画中 に戻し、 wolfi-base 試行の結果と 再設計の選択肢 (debian:12-slim / scope 除外 / Wolfi 継続) を Note に 記録、 bare URL を markdown link 形式に修正 (MD034) - tests/fixtures/doc_examples_audit/audit.json: T-016 ticket header の Note 追記で line_start が shift したため snapshot を再生成 .hadolint.yaml の cgr.dev allow-list は将来の Wolfi 採用に備えて forward-compat として残置 (本 PR では未使用)。 * fix(docker): port entrypoint logic into distroless images (PR #524 review) PR #524 review (Copilot) 4 件のうち、 cpp-dev 関連 1 件は本 PR で cpp-dev を削除済みのため stale (別途 reply で resolve)。 残 3 件は distroless final stage に shell がないため canonical entrypoint.sh の ロジックを失う構造的問題で、 表面取り繕いせず根本対応。 - webui: canonical docker/webui/entrypoint.sh が PIPER_MODEL の自動 DL + PIPER_MODEL_DIR / PIPER_OUTPUT_DIR の引き渡しを行う。 distroless では shell が無いので docker/webui/entrypoint_distroless.py に Python port を作成し、 ENTRYPOINT を /app/entrypoint_distroless.py 経由に 切替。 env-var 契約 / 終了コード / 引数透過の動作 parity を維持。 ruff S606 (process without shell) と PLC0415 (function-level import) は両方とも意図的設計 (execvp は PID-1 ハンドオフの本質、 lazy import は no-model path での import cost 回避) のため noqa + 理由 comment。 - cpp-inference: canonical entrypoint.sh の LD_LIBRARY_PATH=/usr/local/lib を Dockerfile の ENV に明示。 MODEL_PATH → PIPER_MODEL_PATH の var remap は piper binary 自体が env を読まず --model 引数経由のため、 promotion PR で「MODEL_PATH ユーザは --model に切替」 と documented migration step として扱う。 - webui Dockerfile.distroless の uv pin コメント: canonical が unpinned pip install uv のままなことを明記、 trial 側で pin する意図を明示。 cpp-dev review thread (wget/curl) は本 PR で cpp-dev 削除済みのため stale reply + resolve で対応 (別 commit 不要)。
* chore(docs): scope-out cpp-dev distroless, narrow M3 to 4 images PR #524 (distroless webui + cpp-inference trial bundle) で M3 distroless spike の本来目的 (multi-stage build pattern / glibc ABI 整合 / entrypoint 移植) は達成済。 cpp-dev は dev image (production 推論経路なし、 GHCR 配布は dev 用) で、 distroless 哲学と本質的に不整合 (cmake / clang / gdb を final stage に残さざるを得ない) のため、 supply chain 大目的 (CVE 80% 削減 / size 50% 削減) への寄与が限定的と判断し scope-out 確定。 - cpp-dev ticket: Status「計画中」→「除外確定」、 §Note に scope-out rationale (spike 目的達成 + dev image 構造的不整合 + production 経路なしで supply chain 寄与限定) を明記、 旧 wolfi-base trial Note は履歴記録として保持 - M3 milestone doc: §1 直下に 5 image → 4 image scope 縮小注記、 §2 配下チケット表 header と本文を 4 image に更新、 cpp-dev 行は strikethrough + 除外確定、 §2 依存関係 を 4 件に - doc-examples audit fixture: ticket / milestone の line shift 吸収のため regenerate (block 数 446 不変、 中身は line offset 更新のみ) 個別 ticket Status の merged 反映 (python-inference trial PR #523 / webui + cpp-inference trial PR #524) は別 PR で扱う scope。 * fix(docs): align cpp-dev ticket schema to canonical format Copilot review (PR #526) 指摘 3 件への対応: - PR フィールドを他 ticket 同じ `#NNN (...)` 形式に揃える (`PR ` prefix 除去) - 実在しない例示パス `docs/tickets/proposals/...` を抽象表現「別 proposal doc」に書き換え (factual error fix) - 未設定値 `―` を canonical 表記 `なし` に統一 (grep / 自動処理整合) ticket 内容は不変、 schema / 表記の正規化のみ。
… distroless trial Copilot review (PR #528) 指摘の factual error 修正。 ticket Status 行と変更履歴に記載した base image / builder が、 実際の merged Dockerfile (docker/python-inference/Dockerfile.cpu.distroless) と乖離していた: - base `cgr.dev/chainguard/python:latest` → `gcr.io/distroless/python3-debian12` (Debian-glibc 整合のため、 webui trial と同構成) - builder `python:3.13-slim-trixie` → `python:3.11-slim-trixie` (final stage の Python 3.11 と minor 一致) PR #523 の body draft の古い表現を元に書いてしまい、 実 file との照合を怠った結果。 promotion PR で base/builder 構成を参照するときに誤誘導するため修正必須。 §2.2 移行後 base image 候補比較表 (line 41 / 87) は ticket 設計時の論述として正しいため不変更。
…#528) * docs(tickets): reflect python-inference distroless trial merged state PR #523 merged 2026-05-20 で python-inference の Dockerfile.cpu.distroless が投入されたが、 ticket Status / PR フィールド / Note の PR 番号が「TBD / 着手前」表現のまま残り、 trial 投入済の事実と HF Space promotion が未完である点が ticket から読み取れなかった。 - Status 行: 「trial 投入済 (PR #523 merged 2026-05-20、 base `cgr.dev/chainguard/python:latest`、 multi-stage `python:3.13-slim-trixie` builder)」 + canonical 置換は promotion PR (HF Space staging 検証後) であることを明記 - PR 行: 起票予定ブランチ名 → 実 PR 番号 #523 + merged 日付 + base image - §Trial PR scope note のヘッダを「PR #TBD」→「PR #523、 merged 2026-05-20」 - 変更履歴に 2026-05-20 行追加 (投入ファイル / 新規 CI workflow / smoke test 実証範囲 + promotion で必要な検証 = CVE 数値計測 / HF Space staging cold start) canonical Dockerfile.cpu / docker-compose / deploy-huggingface.yml は不変更、 ticket 整合性のみの保守的な更新。 * fix(docs): correct base/builder image references for python-inference distroless trial Copilot review (PR #528) 指摘の factual error 修正。 ticket Status 行と変更履歴に記載した base image / builder が、 実際の merged Dockerfile (docker/python-inference/Dockerfile.cpu.distroless) と乖離していた: - base `cgr.dev/chainguard/python:latest` → `gcr.io/distroless/python3-debian12` (Debian-glibc 整合のため、 webui trial と同構成) - builder `python:3.13-slim-trixie` → `python:3.11-slim-trixie` (final stage の Python 3.11 と minor 一致) PR #523 の body draft の古い表現を元に書いてしまい、 実 file との照合を怠った結果。 promotion PR で base/builder 構成を参照するときに誤誘導するため修正必須。 §2.2 移行後 base image 候補比較表 (line 41 / 87) は ticket 設計時の論述として正しいため不変更。
…tickets Copilot review (PR #529) 6 件指摘の整合性破綻を一括修正。 前回 PR の cleanup で私が「歴史的記述として残す」 と判断した旧計画記述が、 scope-out 後の現状と矛盾して読まれる状態が残っていた。 - M3 milestone Status: 「計画中」 → 「進行中 (Distroless trial 3/4 投入済 PR #523 / #524、 promotion 観測中。 SLSA L3 未着手)」 — 実態に合わせて milestone 全体 status を更新 - M3 milestone post-M3 retrospective 項目: 「T-012〜T-016 完了で」 → 「T-012〜T-015 完了で (cpp-dev scope-out で対象外)」 - 各 ticket の §M3 内推奨実装順 quote block (T-012/T-013/T-014/T-015 冒頭): 旧計画「cpp-dev → cpp-inference → webui → python-inference → wyoming」 を「旧計画、 PR #523/#524 trial bundle と PR #526 scope-out で再編済」 と注記化、 PR 番号で実際の cadence を併記 - T-012 Trial scope note: 「5+ PR cadence」 → 「4+ PR cadence」、 「T-013/T-014/T-015/T-016 + canonical 置換」 → 「T-013/T-014/T-015 + canonical 置換」 - T-012 §2.2 base image 候補比較表: 「shell + apk で柔軟、 T-016 で実績」 → 「shell + apk で柔軟」 + 短所列に「PR #524 wolfi-base trial で apk packaging 不足 (OpenJTalk / mecab tooling chain は Debian apt 前提) と判明、 dev image 文脈での失敗実証済」 - T-013 §2.7: 「T-016 と同 format」 → 「distroless-report.md format (旧 T-016 で想定された M3 共通 format、 cpp-dev scope-out で未作成、 promotion PR で別途定義予定)」 - T-014: 「5 image 中で最後に着手」 → 「distroless 4 image 中で最後に着手予定」、 「M3 全 5 image」 → 「M3 distroless 4 image (cpp-dev scope-out で対象外)」 - T-015 (最大規模、 9 箇所): §推奨 (cc-dynamic + T-016 統一) → 「PR #524 trial で `debian:12-slim` + `gcr.io/distroless/cc-debian12` 採用」、 §並列度 (T-016 完了後着手) → 「PR #524 で T-013 と trial bundle として直接着手・merged」、 §採否 (T-016 spike 結果次第) → 「PR #524 trial で size -2.2% 実証済」、 §6.結論 (T-016 retrospective) → 「M3 全体 retrospective に持ち越し」、 §7.2 Handoff (T-016 と整合) → 「cpp-dev wolfi-base trial で構造的失敗実証済、 採用不可」、 §7.3 未解決質問 (T-016 retrospective で決定) → 「PR #524 で確定」 へ更新 - doc-examples audit fixture を regenerate (ticket file の line shift 吸収、 block 数 444 不変) production paths / build pipeline / contract gate 影響ゼロ、 docs integrity の最終確保のみ。
) * chore(docs): finalize M3 distroless cleanup, delete cpp-dev ticket PR #526 で確定した M3 distroless scope 縮小 (cpp-dev 除外) と PR #523 / #524 の trial merged 状態を docs 全体に反映する一括整理。 - cpp-dev ticket file (旧 T-016) を削除。 経緯は git history + PR #524 (wolfi trial 失敗) + PR #526 (scope-out 確定) で参照可能 - M3 milestone 表の Status / PR 列を ticket 本体と sync: python-inference / webui / cpp-inference を「計画中」→「着手中 (trial merged 2026-05-20、 promotion 観測中)」 + PR 列に #523 / #524 を記入、 cpp-dev 行は表から除去 (補足注記で git history を案内) - tickets/README の M3 ticket list から cpp-dev link 除去、 「5 image」→「4 image」、 milestone status を「計画中」→「進行中 (trial 3/4 投入済)」 へ - 各 ticket §先行チケット (T-012/T-013/T-014/T-015) の T-016 link を除去し scope-out 経緯を注記 - T-015 §着手前提 「T-016 完了推奨 (Wolfi multi-stage の知見を流用)」 → 「なし (T-016 scope-out で wolfi-base trial は失敗実証済、 PR #524 で webui との trial bundle として直接着手)」 (factual error 修正、 wolfi 失敗実証済の事実反映) - CHANGELOG [Unreleased] の cpp-dev entry を「本 PR から除外、 別 PR で扱う」 (時点表現) → 「scope-out 確定 (PR #526)、 ticket file 削除済」 (確定表現) へ更新、 scope-out 根拠 (production 経路なし + distroless 哲学不整合 + 大目的への寄与限定) を併記 - doc-examples audit fixture を regenerate (T-016 削除で block 数 446 → 444、 内訳は bash=191 / python=19 等で言語別総数は実体に同期) production paths (canonical Dockerfile / docker-compose / deploy-huggingface.yml / build pipeline) は不変更、 docs integrity 確保のみの保守的な一括整理。 * fix(docs): remove dangling link to deleted cpp-dev ticket in M3 milestone lychee (PR #529) が `docs/tickets/milestones/M3-supply-chain.md` line 20 の `[T-016 §Note](../tickets/T-016-distroless-cpp-dev.md)` を broken link として検出。 cpp-dev ticket file 削除に伴う dangling reference の修正漏れ。 詳細誘導先を file link から PR #526 (scope-out 確定) + 削除済 ticket は git history で参照可能、 の text 記述へ書き換え。 * fix(docs): finish T-016 scope-out integrity across all M3 distroless tickets Copilot review (PR #529) 6 件指摘の整合性破綻を一括修正。 前回 PR の cleanup で私が「歴史的記述として残す」 と判断した旧計画記述が、 scope-out 後の現状と矛盾して読まれる状態が残っていた。 - M3 milestone Status: 「計画中」 → 「進行中 (Distroless trial 3/4 投入済 PR #523 / #524、 promotion 観測中。 SLSA L3 未着手)」 — 実態に合わせて milestone 全体 status を更新 - M3 milestone post-M3 retrospective 項目: 「T-012〜T-016 完了で」 → 「T-012〜T-015 完了で (cpp-dev scope-out で対象外)」 - 各 ticket の §M3 内推奨実装順 quote block (T-012/T-013/T-014/T-015 冒頭): 旧計画「cpp-dev → cpp-inference → webui → python-inference → wyoming」 を「旧計画、 PR #523/#524 trial bundle と PR #526 scope-out で再編済」 と注記化、 PR 番号で実際の cadence を併記 - T-012 Trial scope note: 「5+ PR cadence」 → 「4+ PR cadence」、 「T-013/T-014/T-015/T-016 + canonical 置換」 → 「T-013/T-014/T-015 + canonical 置換」 - T-012 §2.2 base image 候補比較表: 「shell + apk で柔軟、 T-016 で実績」 → 「shell + apk で柔軟」 + 短所列に「PR #524 wolfi-base trial で apk packaging 不足 (OpenJTalk / mecab tooling chain は Debian apt 前提) と判明、 dev image 文脈での失敗実証済」 - T-013 §2.7: 「T-016 と同 format」 → 「distroless-report.md format (旧 T-016 で想定された M3 共通 format、 cpp-dev scope-out で未作成、 promotion PR で別途定義予定)」 - T-014: 「5 image 中で最後に着手」 → 「distroless 4 image 中で最後に着手予定」、 「M3 全 5 image」 → 「M3 distroless 4 image (cpp-dev scope-out で対象外)」 - T-015 (最大規模、 9 箇所): §推奨 (cc-dynamic + T-016 統一) → 「PR #524 trial で `debian:12-slim` + `gcr.io/distroless/cc-debian12` 採用」、 §並列度 (T-016 完了後着手) → 「PR #524 で T-013 と trial bundle として直接着手・merged」、 §採否 (T-016 spike 結果次第) → 「PR #524 trial で size -2.2% 実証済」、 §6.結論 (T-016 retrospective) → 「M3 全体 retrospective に持ち越し」、 §7.2 Handoff (T-016 と整合) → 「cpp-dev wolfi-base trial で構造的失敗実証済、 採用不可」、 §7.3 未解決質問 (T-016 retrospective で決定) → 「PR #524 で確定」 へ更新 - doc-examples audit fixture を regenerate (ticket file の line shift 吸収、 block 数 444 不変) production paths / build pipeline / contract gate 影響ゼロ、 docs integrity の最終確保のみ。
Issue #527 / M2 Phase 2: distroless × 2 image を Python 3.13 + Debian 13 で統一。 builder と final の Debian release を揃えることで glibc ABI 整合 を保つ (PR #523 と同型対応)。 更新内容: - docker/python-inference/Dockerfile.cpu.distroless: * builder: python:3.11-slim-bookworm → python:3.13-slim-trixie * final: gcr.io/distroless/python3-debian12 → debian13 * 内部パス /usr/local/lib/python3.11 → /usr/local/lib/python3.13 (4 箇所) * PYTHONPATH も同様に書換 * コメント中の説明文を Issue #527 経緯付きで更新 - docker/webui/Dockerfile.distroless: * 同パターン (builder + final + 内部パス 4 箇所書換) - docker/cpp-inference/Dockerfile.distroless: * コメント中の python-inference distroless 参照を新版に更新 (Python 利用なしのため image 本体は据置、 OQ-09 で別 issue 推奨) 受入基準 (M2 Exit Criteria): - docker build success (CI で確認、 docker-build.yml) - distroless/python3-debian13 で python3 --version が 3.13.x - import onnxruntime / soundfile / pyopenjtalk-plus 成功 (G-01, G-02) - Trivy CVE diff で new HIGH/CRITICAL なし - Wyoming smoke (wyoming-smoke.yml) 継続 green 詳細: docs/reference/python-313/specifications.md FR-02-02/03
Issue #527 / M2 Phase 2: distroless × 2 image を Python 3.13 + Debian 13 で統一。 builder と final の Debian release を揃えることで glibc ABI 整合 を保つ (PR #523 と同型対応)。 更新内容: - docker/python-inference/Dockerfile.cpu.distroless: * builder: python:3.11-slim-bookworm → python:3.13-slim-trixie * final: gcr.io/distroless/python3-debian12 → debian13 * 内部パス /usr/local/lib/python3.11 → /usr/local/lib/python3.13 (4 箇所) * PYTHONPATH も同様に書換 * コメント中の説明文を Issue #527 経緯付きで更新 - docker/webui/Dockerfile.distroless: * 同パターン (builder + final + 内部パス 4 箇所書換) - docker/cpp-inference/Dockerfile.distroless: * コメント中の python-inference distroless 参照を新版に更新 (Python 利用なしのため image 本体は据置、 OQ-09 で別 issue 推奨) 受入基準 (M2 Exit Criteria): - docker build success (CI で確認、 docker-build.yml) - distroless/python3-debian13 で python3 --version が 3.13.x - import onnxruntime / soundfile / pyopenjtalk-plus 成功 (G-01, G-02) - Trivy CVE diff で new HIGH/CRITICAL なし - Wyoming smoke (wyoming-smoke.yml) 継続 green 詳細: docs/reference/python-313/specifications.md FR-02-02/03
) (#537) * docs: add Python 3.11 → 3.13 migration scoping for #527 Issue #527 (デフォルト Python 3.11 → 3.13) の影響範囲調査をまとめ、 4 Phase 分割の移行アプローチを提案する。 - pyproject.toml の requires-python 下限は据置 (>=3.11 維持) - CI workflow: 既に 3.13 が 41 箇所で過半、 残 3.11 25 箇所を統一 - Dockerfile: wyoming/webui は既に 3.13、 残 5 image の切替難度を整理 - 最大ブロッカーは python-train Dockerfile の torch==2.2.1 (cp313 wheel なし) * docs: expand Python 3.13 migration with concerns C1-C8 追加調査で 8 個の個別ブロッカーを特定 (C1-C8): - C1: monotonic_align/setup.py が distutils (3.12 で削除済) を import setuptools shim 経由で偶然動いている状態 → Phase 0 で先行修正 - C2: distroless final image は debian12 (= python 3.11) のため builder + final を Trixie 揃えで debian13 (= python 3.13) へ - C3: CUDA Docker (Ubuntu 22.04 Jammy) は python3.13 を apt 提供しない deadsnakes PPA 経由が最小変更案 - C4: runtime-parity-deep.yml の "Match dump-python (3.11)" pin は 実装 (stdlib wave) を見ると不要、 両方 3.13 へ - C5-C8: piper-phonemize wheel / PyPI metadata / tarfile filter 等は据置可 uv.lock 直読で cp313 wheel 提供状況も整理: - torch 2.11.0 / numba 0.65.1 / onnxsim-prebuilt 0.4.39 / wandb 0.26.1 すべて cp313 wheel 利用可能 - 真のブロッカーは docker/python-train Dockerfile の torch==2.2.1+cu121 のみ Phase 0 (distutils → setuptools 書換) を新設し、 検証チェックリスト追加。 * docs: evaluate library bumps alongside Python 3.13 migration Q: 3.13 化と同時に torch 等を bump できないか? A: 3.13 化単体では library bump はほぼ起きない (floor pin が 3.11 据置のため)。 uv.lock 現状確認: - torch 2.11.0+cu128 / onnxruntime 1.26.0 / numpy 2.4.4 / scipy 1.17.1 すべて既に最新近く、 floor を上げても resolver は同じ wheel を選ぶ - 3.11 を切らないと使えない library は現状存在しない 必須同時 bump (Phase 3 セット): - docker/python-train Dockerfile の torch 2.2.1+cu121 → 2.11.0+cu128 (torch 2.2 は cp313 wheel 提供なし、 これは強制セット) 別 PR で評価推奨 (本 Issue スコープ外): - pytorch-lightning >=2.0 → >=2.4 - wandb >=0.16 → >=0.20 - librosa >=0.10 → >=0.11 - numba >=0.59 → >=0.61 revert 単位を肥大化させないため上記は chore(deps) 系で個別 PR 化する。 * docs: add CUDA version mapping for #527 migration plan CUDA は base image / torch wheel / uv index の 3 層で個別 pin されており、 3.13 化との関係を整理した。 現状: - base image: nvidia/cuda 12.6.3 + cuDNN 9 (PR #532-#533 で bump 済) - torch wheel (uv workspace): cu128 (CUDA 12.8 対応) - torch wheel (docker/python-train): cu121 (CUDA 12.1 対応) — 古い forward-compat で動く理屈: - 12.6 driver は 12.1 / 12.8 wheel bundle を dlopen 可能 - torch wheel は site-packages/nvidia/{cublas,cudnn}/lib を優先するため、 base image の cuDNN 9 ではなく wheel bundle 側 (cu121 → cuDNN 8.9 / cu128 → cuDNN 9.x) が使われる Phase 3 で同時 bump: - torch wheel suffix cu121 → cu128 (uv.lock canonical と整合) - --extra-index-url を cu121 → cu128 - base image (12.6.3) は据置 (forward-compat で動作) 別 issue 切り出し: - base image 12.6.3 → 12.8.x bump (PR #532-#533 で最近やったため過度な追従回避) - dependabot の nvidia/cuda minor bump ignore 解除 (PR #427 経緯で据置) * docs: analyze CUDA 12.8 optimization benefits for #527 「3.13 のタイミングで CUDA 12.8 にして最適化恩恵は受けられるか?」 を分析。 結論: wheel を cu121 → cu128 に bump するだけで CUDA 12.8 恩恵の 80% を享受可能。 base image bump は実測 0-2% で別 issue。 恩恵の主因: - wheel bundle cuDNN 8.9 → 9.5+ (conv kernel 5-10% 高速) - wheel bundle cuBLAS 12.1 → 12.8 (GEMM dispatch 改善 3-7%) - wheel bundle NCCL 2.20 → 2.23+ (multi-GPU all-reduce 5-10%) - Triton 2.x → 3.x (torch.compile autotune 高速化) V100 学習想定での期待値: - 単 GPU: 5-12% 学習速度向上 - multi-GPU (Template A --devices 4): 8-15% 向上 - --compile warm 後: 追加 5-10% 恩恵がないもの (使わない 12.8 新機能): - FP8 (E4M3/E5M2) — sm_90+ 専用、 V100/A100 では未対応 - Flash Attention 3 — sm_90+ 専用 - Blackwell sm_120 — 該当ハードなし - CUDA Graphs Enhanced Conditional — Lightning ループと噛み合わない - NVSHMEM / NVLink Sharp — H100+ DGX 専用 V100 リスク: - 将来 CUDA 13.x で sm_70 deprecation の可能性 (現状 12.x は問題なし) - --precision 16-mixed の遅さは Volta ハードウェア制約のため 12.8 でも改善しない * docs: revise #527 plan for new GPU lineup (T4/Ada6000/RTX5090) 学習サーバー GPU が V100 → T4/Ada 6000/RTX 5090 へ移行することが確定 (2026-05-21)。 CUDA 12.8 化の優先度評価が「恩恵あり」 から「Blackwell サポートのため事実上必須」 に昇格したため全面改訂。 新 GPU 別の対応: - T4 (sm_75): 推論専用 (VRAM 16GB で 6lang base 学習は厳しい) - Ada 6000 (sm_89, 48GB): メイン学習機。 FP8/FA3/TF32/BF16 解禁 - RTX 5090 (sm_120, 32GB): 次世代学習機。 CUDA 12.8 + cu128 wheel 必須 学習速度期待値 (V100 比): - Ada 6000 + BF16 + TF32 + FA2: 3-5x - Ada 6000 + FP8 + FA3 (要 transformer_engine): 5-8x - RTX 5090 + BF16 + FA3: 5-7x - RTX 5090 + FP8 + FA3 (フル活用): 7-10x Phase 3 のスコープ拡大: - torch 2.2.1+cu121 → 2.11.0+cu128 (RTX 5090 起動の必須条件に格上げ) - torch.backends.cuda.matmul.allow_tf32 = True を __main__.py に追加 - CLAUDE.md / training-guide / wavlm-guide の V100 言及を新 GPU 前提に置換 - Phase 3 を "Docker bump" から "performance optimization PR" に格上げ 新 GPU 実機検証 (merge 前必須): - Ada 6000 で Template B 1 epoch smoke - RTX 5090 で sm_120 起動確認 + 学習速度測定 - T4 で推論 only smoke - TF32 enable 前後の validation loss 比較 base image bump (12.6 → 12.8) は引き続き別 PR で評価 (wheel cu128 で恩恵の 95%+ 取れるため)。 * docs: move Python 3.13 migration into dedicated folder docs/reference/python-313-migration.md → docs/reference/python-313/README.md で zh-en-loanword/ と同じサブフォルダ構造に揃える。 今後 Phase 個別ノートを 追加する際の置き場として使う。 - docs/reference/README.md の索引を新パスに更新 - python-313/README.md の冒頭にサブフォルダ navigation 表を追加 * docs: switch to fully-aligned Docker strategy (CUDA 12.8 + Python 3.13) ユーザー要望に基づき、 Docker 全 image を「CUDA 12.8 + Python 3.13」 で 完全統一する fully-aligned 戦略に転換。 従来の「base image 12.6 据置 + wheel cu128 で forward-compat」 戦略は廃止。 主要変更: - Fully-aligned target を冒頭に明記 (Python 3.13.x / CUDA 12.8.x / cuDNN 9.x / Ubuntu 24.04 / torch cu128 で全 image 揃え) - Phase 構成を 0-4 に拡大: - Phase 0: distutils → setuptools (前提) - Phase 1: 低リスク CI / docs / CPU Docker - Phase 2: distroless × 2 を debian13 で統一 - Phase 3: CUDA Docker base を 12.8 + Ubuntu 24.04 + deadsnakes 3.13 - Phase 4: 新 GPU 学習最適化 (TF32 / bf16-mixed) - 「base image bump は別 PR」 → 「Phase 3 必須項目」 へ格上げ - C3 (Ubuntu の python3.13 提供) に Dockerfile 実装例を追加 - 全 Dockerfile の現状 → 統一後 target を表で明示 - CUDA image 選択肢比較 (A. Ubuntu 24.04 + deadsnakes / B. Jammy / C. multi-stage python:3.13 流用) と推奨理由 Fully-aligned 戦略のメリット: - forward-compat 依存を解消 - Trivy CVE 管理が単一 CUDA major で完結 - nsys / nvprof / observability tool が version mismatch なく動作 - Ubuntu EOL 2027 → 2029 で OS 寿命延長 - RTX 5090 (sm_120) の "wheel-only forward-compat" 不確定性が解消 * docs: add Phase dependency / diff samples / rollback / PR templates 実装に必要な詳細情報を追補: - Phase 依存関係図 (Phase 0 → 1 → 2 → 3 → 4 の順序と並列可否) - Phase 別 diff サンプル (Phase 0 / 1 / 2 / 3 / 4 の代表的な before/after) - ロールバック手順 (各 Phase の戻し方とデータロス可能性) - PR テンプレート (Phase 0 / Phase 3 の Title / Summary / Type / Risk Level / Affected Components / Test Plan サンプル) これで「ドキュメントを見ながら Phase ごとに PR を出せる」 状態に整備完了。 * docs: add Issue #527 requirements specification README.md (実装計画 / HOW) から独立した要求定義書 (WHAT/WHY) を作成し、 docs/reference/python-313/requirements.md として配置。 要求定義書の章構成: 1. 目的 2. 背景 (現状の課題 / 環境変化 / 機会) 3. 要求事項 - 3.1 機能要求 (FR-01 〜 FR-10) — 受入基準付き - 3.2 非機能要求 (NFR-01 〜 NFR-09) — 後方互換 / セキュリティ / OS 寿命 等 - 3.3 制約事項 (C-01 〜 C-06) — requires-python 据置 / matrix 維持 等 4. スコープ (対象 / 対象外、 別 issue 化候補リスト) 5. 成功基準 (MUST / SHOULD / MAY) 6. 前提条件 (A-01 〜 A-06) — host driver / 新 GPU 利用可能性 等 7. ステークホルダー (6 ロール × 関心事項 × 関与 Phase) 8. リスク管理 (R-01 〜 R-08) — 影響度 / 発生確率 / 緩和策 9. 用語定義 10. 関連ドキュメント フォルダ内ナビゲーション (README + requirements) を更新し、 上位 docs/reference/README.md の索引も両方リンク。 * docs: enumerate breaking changes from 3.13 + CUDA 12.8 + torch 2.11 + TF32 要求定義書に「9. 互換性影響評価 (Breaking Changes 棚卸し)」 を追加し、 最適化と引き換えに失われる互換性を 6 カテゴリ × 27 項目で体系化: A. ハードウェア互換性 (B-A1〜A5) - V100/Pascal/Maxwell の新機能利用不可 - host driver R570+ 必須 - nvidia-container-toolkit 1.14+ 必須 B. ソフトウェア互換性 (B-B1〜B6) - Ubuntu 22.04 wheel 経路の断捨離 - glibc 2.35 → 2.39 - deadsnakes PPA への dependency C. データ・モデル互換性 (B-C1〜C4) - PyTorch 2.2 optimizer state_dict の forward-compat 非保証 - ONNX opset default 変更可能性 - TF32 / bf16-mixed の reproducibility 影響 D. PyTorch API 互換性 (B-D1〜D6) - torch.cuda.amp → torch.amp - torch.set_default_tensor_type deprecated 等 E. 数値再現性 (B-E1〜E4) - TF32 で matmul mantissa 23 → 10 bit - cuDNN 8.9 → 9.5 で algorithm 選択変更 - deterministic algorithms との非互換 F. ドキュメント・サポート互換性 (B-F1〜F3) - V100 トラブルシューティング無効化 - --precision 32-true が legacy 扱い 加えて K-01〜K-10 で「維持される互換性」 を明示、 G-01〜G-06 で 「グレーゾーン (要検証)」 を Phase 別に列挙。 結論: 断念するのは V100/Pascal/Maxwell + CUDA 11 driver + TF32 bit-exact 再現性のみ。 API/データ/ランタイム/G2P 互換は全維持。 NFR-01 から本セクションへの参照リンクを追加。 * docs: add Issue #527 system requirements specification (要件定義書) 要求定義 (requirements.md) を技術的な要件定義 (specifications.md) に 落とし込み。 各 FR/NFR を具体的な実装仕様 + 測定可能閾値 + 受入基準 として再定義。 要件定義書の章構成: 1. システム概要 (対象/対象外) 2. システム構成要件 (SCR-01〜05) - Python 3.13.x / CUDA 12.8.x / Ubuntu 24.04 / cuDNN 9.x / torch 2.11.0+cu128 / uv + deadsnakes PPA 3. 機能要件詳細 (FR-01〜10 を FR-XX-YY 形式に分解) - 26 個の workflow 別更新表 - 7 個の Dockerfile 別変更仕様 (before/after + 受入基準) 4. 非機能要件詳細 (NFR-01〜09 に測定可能閾値) 5. データ要件 (DR-01〜04) - ckpt 互換 / OPSET=15/17 据置 / phoneme set 173 / WandB metric 6. 外部 IF 要件 (EIR-01〜04: PyPI/Docker/HF/GHA) 7. テスト要件 (TR-01〜05) - 単体/ビルド/実機/互換/パフォーマンス 8. 移行要件 (MR-01〜03) 9. 運用要件 (OR-01〜03) 10. トレーサビリティマトリクス (要求 ID ⇔ 要件 ID) 11. 既知の前提・調査結果 (DF-01〜04) 追加調査結果 (DF-01〜04): - piper-train code の deprecated PyTorch API 利用は実質ゼロ (torch.cuda.amp 直接利用なし、 jit.script は 1 箇所のみ、 onnx.export は opset 明示で安全) - 3.11 を使う workflow は 26 個 (single 23 + matrix 3) - ONNX OPSET は main=15 / speaker_encoder=17 据置 - python:3.13-slim-trixie / distroless/python3-debian13 / nvidia/cuda:12.8.1-ubuntu24.04 / deadsnakes ppa の存在確認済 3 文書体系を完成: - requirements.md (要求定義: 339 行) WHAT/WHY - specifications.md (要件定義: 701 行) HOW MUCH/HOW PRECISELY - README.md (実装計画: 969 行) HOW STEP-BY-STEP フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: add Issue #527 milestone definition (M1-M5) Phase 0-4 を上位の stakeholder 視点マイルストーン (M1-M5) として束ね、 進捗管理ドキュメントを追加。 GitHub の milestone 機能には登録せず、 本ドキュメント内のみで管理 (PR 数を絞る方針)。 マイルストーン構成: - M1: 基盤整備 + 軽量切替 (Phase 0 + 1、 0.5 日) - M2: 非 GPU Docker 統一 (Phase 2、 0.5 日) - M3: GPU Docker 統一 — CUDA 12.8 + Ubuntu 24.04 + Python 3.13 (Phase 3、 1 日 + 実機検証) - M4: 新 GPU 学習最適化 — TF32 + bf16-mixed + 実機検証 (Phase 4、 1-2 日) - M5: リリース + clean-up — v1.13.0 + migration guide (Phase 外、 0.5 日) 合計工数: 3.5-4.5 日 (人日) 各マイルストーンに以下を定義: - 目的 / 含む Phase / Deliverables (件数つき) - Entry Criteria / Exit Criteria (checkbox) - 依存関係 / リスクゲート (重要度 high の項目に対応案) - ステークホルダー / 想定所要時間 加えて: - マイルストーン依存図 (ASCII art) - 累積進捗トラッキング表 (実装時に更新) - 中間チェックポイント (CP-01〜05) - マイルストーン管理ルール (M-RULE-01〜05) - PR と Milestone の対応 - Exit Criteria の checkbox 化 - リスクゲート発動時の処理 - 進捗トラッキング更新ルール - 並列実行禁止 (直列実行) 4 文書体系に拡張: - requirements.md (要求定義、 WHAT/WHY) - specifications.md (要件定義、 HOW MUCH/HOW PRECISELY) - milestones.md (マイルストーン、 WHEN/WHAT DELIVERABLE) ← NEW - README.md (実装計画、 HOW STEP-BY-STEP) フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: add comprehensive library bump survey to #527 spec 「3.13 化のついでに他に bump したいライブラリは?」 への網羅調査を specifications.md に追加。 全 dependency の floor pin と uv.lock actual を全件突合し、 3 カテゴリ × 26 library を整理。 A. Floor drift 解消 (M1 で同時実施推奨、 17 library) - root pyproject と member で floor が乖離している主要 library を統一 - scipy / pytorch-lightning / transformers / wandb / tensorboard / fastapi / uvicorn / pytest / matplotlib / pypinyin / librosa / numba / torchmetrics / onnxscript / coverage / mypy / onnxruntime - 想定 PR: chore(deps): unify library floor pins across workspace members - 任意で CI gate (check_workspace_library_floor.py) も追加検討 B. Major bump で改善余地あり (別 PR 推奨、 2 library) - psutil >=5.9 → >=7.0 (security/major bump) - onnxsim-prebuilt: floor を明示 pin (>=0.4.39) C. 据置すべきもの (明示、 9 library) - huggingface-hub <1.0 (HF Hub 1.0 dataset API 警戒) - numpy <2.5 (dtype 仕様変更予告) - black / ruff exact pin (formatter は version 一致必須) - piper-phonemize / pyopenjtalk-plus / g2pk2 / mecab-python3 / unidic-lite 加えて Python 3.13 動作確認が必要なグレーゾーンに mecab-python3 / sudachipy を追加 (G-XX 系)。 M1 マイルストーンの Deliverables に library floor 統一 (17 library) + Python 3.13 smoke 追加 (2 library) を反映。 * docs: record library bump policy decisions as ADR ライブラリ bump 方針を Architecture Decision Record (ADR) 形式で 明示的に記録。 「なぜ M1 で 17 library 統一」「なぜ major bump は別 issue」 の判断根拠を将来参照できる形にする。 specifications.md §10.6 に 4 つの Decision Record を追加: - DR-001: Fully-aligned Docker 戦略の採用 (wheel-only forward-compat 戦略の棄却理由) - DR-002: Library Floor Drift Unification を M1 に組み込み (17 library を Issue #527 スコープ内とする判断) - DR-003: Major Library Bump は別 Issue に切り出し (psutil / onnxsim-prebuilt / huggingface-hub / numpy 4 件) - DR-004: New GPU Optimization は Phase 4 で分離 (Phase 3 と Phase 4 を別 PR にする判断) 各 DR は: - 状態 (Accepted) - コンテキスト (背景) - 決定内容 - 理由 (なぜそうしたか) - トレードオフ - 代替案 (棄却したもの) - 影響範囲 requirements.md の scope 表を更新: - 4.1.5 ライブラリ依存 (in-scope): 17 library の floor 統一表を追加 - 4.2 対象外: psutil / onnxsim / HF Hub / numpy の 4 件を別 issue として明記 * docs: extract 14 open questions for Issue #527 pre-implementation 実装着手前に stakeholder / リポジトリオーナー / 学習担当で決める必要が ある事項を open-questions.md として網羅。 4 ドキュメントの中の TBD / 個別判断 / 実装者判断 / 要確認マーカーを全件抽出して 14 個の OQ-XX に 構造化。 優先度別内訳: - 高 (M1/M3/M4 着手の blocker、 4 件): - OQ-01: host driver R570+ アップグレード計画 - OQ-02: nvidia-container-toolkit 1.14+ への bump - OQ-03: ckpt resume 失敗時のフォールバック方針 - OQ-04: バージョン番号 (v1.13.0 vs v1.12.x) - 中 (PR 構成判断、 7 件): - OQ-05: M1 内 floor drift 統一を別 PR にするか - OQ-06: M3 + M4 統合 vs 分離 - OQ-07: CUDA 12.8.x patch 選択 (12.8.0 / 12.8.1) - OQ-11: CHANGELOG breaking 表記 (草案あり) - OQ-12: TF32 default ON vs opt-in - OQ-13: bf16-mixed Template default 化判断 - OQ-08-09 のサブ判断 - 低 (実装中/後で決められる、 3 件): - OQ-08: cpp-dev Dockerfile スコープ判断 - OQ-09: cpp-inference distroless スコープ判断 - OQ-10: dependabot ignore policy 更新 - OQ-14: 旧 v1.12 image tag 保持判断 各 OQ には: - カテゴリ / 重要度 / 必要タイミング - コンテキスト (背景・関連 ADR) - 選択肢 (3-4 個) - 推奨案 - 決定すべき人 加えて「解決プロセス」 セクションで Phase 別 checkbox を提供し、 着手時に確認できるようにした。 ドキュメント体系を 5 文書に拡張: - requirements.md 要求定義 - specifications.md 要件定義 + ADR - milestones.md マイルストーン - open-questions.md 未決事項 ← NEW - README.md 実装計画 フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: record OQ-04 / OQ-03 / OQ-14 decisions (v1.13.0 + resume non-support) リポジトリオーナー判断を 3 件確定: OQ-04: v1.13.0 (minor bump) 採用 - DR-005 として正式記録 - Migration guide docs/migration/v1.12-to-v1.13.md を M5 で作成 OQ-03: 過去 ckpt resume は非サポート化 - DR-006 として正式記録 - OQ-03 の選択肢 B (失敗時 fallback) より大胆な方針 - 既存 ONNX 推論は forward 互換で継続可能、 新規学習のみ torch 2.11 - 過去 ckpt 継続学習が必要なユーザは v1.12 image を継続利用 OQ-14: 旧 v1.12 Docker image tag 保持 (DR-006 連動で確定) - 過去 ckpt 継続学習者の唯一の選択肢になるため必須事項に格上げ - 削除予定は設定しない 連鎖更新: - NFR-02 (学習再現性): resume 確認 → from scratch 1 epoch 確認に置換 - DR-01 (モデルチェックポイント): 既存 ckpt resume 要件削除、 v1.12 image retention を明記 - M4 Entry/Exit Criteria: 6lang base ckpt resume → from scratch smoke - B-C1 (Breaking change): "optimizer state_dict 保証なし" → "model weights も含めて resume 非サポート" に拡大 - R-01 リスク: 高 → 中 (DR-006 でリスク本体が消滅) 未決事項残: 高 2 件 (OQ-01/02 運用前提)、 中 5 件、 低 3 件 → 計 10 件 * docs: confirm OQ-12 (TF32 default ON) + OQ-13 (bf16 Template default) リポジトリオーナー判断を 2 件確定: OQ-12: TF32 default ON (DR-007) - src/python/piper_train/__main__.py に 2 行追加 - torch.backends.cuda.matmul.allow_tf32 = True - torch.backends.cudnn.allow_tf32 = True - Ada 6000 / RTX 5090 で Tensor Core 活用、 sm_75 以下では noop - TTS で perceptual 影響なし (audio_parity Tier 4 で検証) - deterministic 用途の opt-out flag は別 issue で必要に応じて追加 OQ-13: bf16-mixed Template default 化 (DR-008) - CLAUDE.md Template A/B の --precision を 32-true → bf16-mixed - 32-true は legacy V100 互換用と注記して残す - training-guide.md の precision 表で bf16-mixed を default 推奨に - wavlm-guide.md の V100 注記削除 - training-template-drift pre-commit hook の期待値更新 - 検証: Ada 6000 で 1 epoch smoke + audio_parity Tier 4 PASS 連鎖更新: - FR-08-01/02: TF32 enable のコード変更を 2 行 (matmul + cudnn) に拡張 - FR-09-01〜04: Template default 化、 pre-commit hook 整合、 受入基準を再構成 - M4 Exit Criteria: bf16-mixed default 化を必須項目に格上げ 未決事項残: 高 2 件 (OQ-01/02 運用前提)、 中 4 件、 低 3 件 → 計 9 件 * docs: split real-hardware smoke to post-merge (DR-009) リポジトリオーナーから「ブランチは host 環境が整っている前提で進めて良い、 実機はまだ用意できていないので待つ」 という明示承認に基づき、 M3/M4 の 実機 smoke を post-merge verification に切り出し。 OQ-01/02 (host driver R570+ + nvidia-container-toolkit 1.14+): - 「前提として進行 (実機環境は別途準備中)」 として決定済 DR-009 (実機検証を post-merge に切り出し) を追加: - M3 / M4 のコード / Docker 変更 PR は merge 可能 (CI で完結する範囲) - 実機 smoke (Ada 6000 / RTX 5090 / T4) は post-merge verification 化 - M5 (release) は実機 smoke 完了が merge 前必須に維持 - 必要なら v1.13.0rc1 pre-release で early access、 fix 反映後に GA 連鎖更新: - M3 Exit Criteria: * merge 前必須 (CI 完結): docker build, Trivy, image 起動 confirm * post-merge verification: Ada/RTX5090/T4 実機 smoke * リスクゲートに「post-merge smoke 失敗時の v1.13.0rc1 経由対応」 追加 - M4 Exit Criteria: * merge 前必須 (CI 完結): TF32 enable コード、 bf16 Template 書換、 docs 更新 * post-merge verification: from scratch smoke + TF32 比較 + bf16 smoke - M5 Entry Criteria: * 「実機環境準備完了」 + 「M3/M4 post-merge verification 完了」 を追加 * (任意) v1.13.0rc1 pre-release フェーズ - マイルストーン依存図: * 「運用前提」 ブロックを M3 着手前 → M5 着手前に移動 * post-merge verification ステップを M4 と M5 の間に挿入 これで M1 → M2 → M3 → M4 までは実機なしで実装可能。 M5 release だけ実機 smoke 完了を待つ。 * docs: finalize remaining 5 open questions (OQ-06/08/09/10/11) リポジトリオーナー一括承認により残り 5 件確定: - OQ-06: M3 + M4 分離 PR (DR-004 再確認) - OQ-08: cpp-dev Dockerfile は別 issue - OQ-09: cpp-inference distroless は別 issue - OQ-10: dependabot nvidia/cuda ignore policy 据置 - OQ-11: CHANGELOG breaking 草案採用 (DR-006/007/008 反映済) CHANGELOG 草案を DR-006 / DR-007 / DR-008 反映に更新: - resume 非サポート (DR-006) を Breaking changes に明記 - TF32 default ON (DR-007) に cudnn.allow_tf32 も追加 - bf16-mixed Template default (DR-008) を新規 breaking entry に - 旧 v1.12 image tag retention (OQ-14) を案内 - 新 GPU lineup (T4/Ada/RTX5090) への移行を Notable section に 「解決プロセス」 全 14 OQ-XX を完了状態 ([x]) に更新。 未決事項 0、 実装着手可能な状態。 * chore(build): replace distutils.core with setuptools in monotonic_align distutils は Python 3.12 で stdlib から削除済 (PEP 632)。 これまで setuptools shim 経由で偶然動いていた状態を明示化、 3.13 環境で fragile な shim 依存を解消する。 Issue #527 Phase 0 / M1 (詳細: docs/reference/python-313/). * ci: bump default Python from 3.11 to 3.13 across 20 workflows Issue #527 / M1 Phase 1: 単一値で 3.11 を指定していた 20 workflow を 3.13 に置換。 既存の Python マトリクス (3.11/3.12/3.13 を網羅する python-tests / g2p-python-ci / build-phonemize-wheels) は据置。 変更対象: - ci.yml (matrix ['3.11'] → ['3.13'] + line 304 比較式) - codeql.yml / deploy-huggingface.yml / generate-combined-report.yml - model-quality-gate.yml / release-verify.yml / sbom.yml / security-audit.yml / test-hf-space.yml / timing-parity.yml / version-consistency.yml / wyoming-smoke.yml - pre-commit.yml / python-lint.yml (matrix ['3.11'] → ['3.13']) - python-doctest.yml (2 箇所、 setup-python + setup-uv) - dev-create-release.yml / dev-build-all.yml / test-japanese-tts.yml (それぞれ 2 箇所) - runtime-parity-deep.yml (dump-python + compare の 2 箇所、 + コメント 「Match dump-python (3.11)」 を 3.13 統一説明に更新、 DR-009 / C4) - webui-test.yml (matrix ['3.11','3.12'] → ['3.13'] + 単一指定) 据置 (matrix で 3.11/3.12/3.13 網羅 or piper-phonemize cp313 未提供): - python-tests.yml (3 OS × 3.11/3.12/3.13) - g2p-python-ci.yml (matrix 維持) - build-phonemize-wheels.yml (C-03) 詳細: docs/reference/python-313/specifications.md FR-01-01 * feat(docker): bump python-inference CPU base to python:3.13-slim-trixie Issue #527 / M1 Phase 1: 推論用 CPU Docker image の base を python:3.11-slim-bookworm から python:3.13-slim-trixie に bump。 - Python interpreter: 3.11 → 3.13 (Issue #527 Phase 1) - Debian: bookworm (12) → trixie (13)、 EOL 2026 (bookworm) → ~2028 (trixie) - requires-python = ">=3.11" は据置、 PyPI install の 3.11/3.12 サポート も維持 (Docker image default のみの変更) GPU variant (Dockerfile / CUDA inference) は Phase 3 で対応予定。 distroless (Dockerfile.cpu.distroless) は Phase 2 で対応予定。 * docs: bump Python recommended version from 3.11+ to 3.13+ Issue #527 / M1 Phase 1: ドキュメントの Python 推奨 version 表記を 更新。 「Python 3.11+ が必要」 → 「Python 3.13+ 推奨 (3.11+ サポート)」。 サポート下限 (requires-python >=3.11) は据置、 PyPI 経由の install は 3.11/3.12 でも継続サポート (NFR-01)。 推奨 / canonical 環境のみが 3.13 に揃う。 更新対象 (12 ファイル): - CONTRIBUTING.md / README.md (root) - README_{EN,ZH,KO,ES,FR,DE,PT}.md (7 言語) - docs/guides/training/training-guide.md (env: python 3.11 → 3.13) - docker/README.md (Dockerfile.cpu の base image 表記更新) - QA-RELEASE-CHECKLIST.md (CI version の正確な表記) 詳細: docs/reference/python-313/specifications.md FR-01-03 * chore(deps): unify library floor pins across workspace members Issue #527 / M1 / DR-002: root pyproject.toml と src/python/pyproject.toml で 17 library の floor pin drift を統一。 lockfile actual (uv.lock) と整合する canonical value で pin、 silent drift を防止。 統一した library (root と member で乖離していたもの): - scipy >=1.12 (member) → >=1.17.1 (root と統一) - pytorch-lightning >=2.0 → >=2.4.0 (configure_model API 安定化点) - transformers >=4.30/4.38 → >=4.50.0 (3.13 対応版) - onnxruntime >=1.17/1.20.0 → >=1.26.0 (C++ canonical 統一) - onnxruntime-gpu >=1.17/1.20.0 → >=1.26.0 - librosa >=0.10 → >=0.11.0 - wandb >=0.16 → >=0.26.1 - tensorboard >=2.16 → >=2.20.0 - numba >=0.59 → >=0.61.0 (numpy 2.x ABI warning 解消) - matplotlib >=3.8 → >=3.10.9 - torchmetrics >=1.0 → >=1.9.0 - onnxscript >=0.6.2 → >=0.7.0 - pypinyin >=0.50 → >=0.55.0 (requirements.txt と統一) - fastapi >=0.110 → >=0.136.1 (member inference / inference-gpu extras) - coverage[toml] >=7.6 → >=7.14.0 - mypy >=1.7 → >=1.20.2 - pytest >=7.4 → >=9.0.3,<10 (test extras) - torchaudio >=2.1.0 → >=2.11.0 (root の torch 整合) 据置 (意図的): - src/python_run/pyproject.toml (PyPI publish package、 慎重な lower bound + 上限 cap policy を維持、 fastapi >=0.110,<1 / uvicorn[standard]>=0.27,<1) - huggingface-hub <1.0 上限 / numpy <2.5 上限 (別 issue で評価) uv.lock は本 commit では touch しない (CI 側で uv lock --check が drift を検出した場合に別 PR で同期、 通常は resolver が同じ wheel を選ぶため 影響なし)。 * feat(docker): unify distroless images to debian13 + Python 3.13 Issue #527 / M2 Phase 2: distroless × 2 image を Python 3.13 + Debian 13 で統一。 builder と final の Debian release を揃えることで glibc ABI 整合 を保つ (PR #523 と同型対応)。 更新内容: - docker/python-inference/Dockerfile.cpu.distroless: * builder: python:3.11-slim-bookworm → python:3.13-slim-trixie * final: gcr.io/distroless/python3-debian12 → debian13 * 内部パス /usr/local/lib/python3.11 → /usr/local/lib/python3.13 (4 箇所) * PYTHONPATH も同様に書換 * コメント中の説明文を Issue #527 経緯付きで更新 - docker/webui/Dockerfile.distroless: * 同パターン (builder + final + 内部パス 4 箇所書換) - docker/cpp-inference/Dockerfile.distroless: * コメント中の python-inference distroless 参照を新版に更新 (Python 利用なしのため image 本体は据置、 OQ-09 で別 issue 推奨) 受入基準 (M2 Exit Criteria): - docker build success (CI で確認、 docker-build.yml) - distroless/python3-debian13 で python3 --version が 3.13.x - import onnxruntime / soundfile / pyopenjtalk-plus 成功 (G-01, G-02) - Trivy CVE diff で new HIGH/CRITICAL なし - Wyoming smoke (wyoming-smoke.yml) 継続 green 詳細: docs/reference/python-313/specifications.md FR-02-02/03 * feat(docker): unify CUDA Docker to 12.8.1 + Ubuntu 24.04 + Python 3.13 (DR-001) Issue #527 / M3 Phase 3: GPU Docker image を fully-aligned 戦略で統一。 RTX 5090 (Blackwell sm_120) 起動の必須条件 + forward-compat 依存解消。 docker/python-inference/Dockerfile (CUDA 推論): - base: nvidia/cuda:12.6.3-cudnn-runtime-ubuntu22.04 → 12.8.1-...-ubuntu24.04 - Python install: apt python3.11 → deadsnakes PPA python3.13 - software-properties-common → add-apt-repository ppa:deadsnakes/ppa - python3.13 / python3.13-venv install - update-alternatives で /usr/bin/python → python3.13 (符号化) - pip / uv install に --break-system-packages 追加 (Ubuntu 24.04 PEP 668) docker/python-train/Dockerfile (学習 multi-stage): - builder + runtime 両 stage で同様の base + Python 切替 - torch install: --extra-index-url cu121 → cu128 * torch==2.2.1+cu121 → torch==2.11.0+cu128 (DR-001 必須) * torchaudio も同 version へ * torchvision は piper-train が未使用のため削除 (FR-02-05) - 旧版コメント中の "forward-compat" 説明を fully-aligned 戦略の説明に書換 .github/dependabot.yml: - CUDA minor bump ignore policy 据置 (OQ-10 で確定) - コメントを Issue #527 後の状態 (12.6.3 → 12.8.1 への手動 bump 経緯) で更新 merge 前必須 (CI で完結): - docker build success (docker-build.yml で確認) - image 起動で python --version が 3.13.x - import torch で 2.11.0+cu128 確認 - import onnxruntime-gpu success - Trivy scan: new HIGH/CRITICAL なし post-merge verification (DR-009、 実機準備完了後): - Ada 6000 / RTX 5090 / T4 実機での起動確認 + GPU device capability 詳細: docs/reference/python-313/specifications.md FR-02-04/05 + DR-001 * feat(training): enable TF32 + adopt bf16-mixed as Template default (DR-007/008) Issue #527 / M4 Phase 4: 新 GPU (Ada 6000 / RTX 5090) 学習最適化を実装。 DR-007 (TF32 default ON) + DR-008 (bf16-mixed Template default 化) + V100 言及の整理 + DR-006 (resume 非サポート) 周知。 src/python/piper_train/__main__.py (DR-007): - main() 内 torch.backends.cudnn.benchmark = True の隣に 2 行追加: * torch.backends.cuda.matmul.allow_tf32 = True * torch.backends.cudnn.allow_tf32 = True - Ampere+ (sm_80+) で TF32 Tensor Core を活用、 matmul/conv ~1.3-1.5x - sm_75 (T4) 以下では noop (warning なし) CLAUDE.md (DR-008 + V100 整理): - Template A/B の --precision 32-true → --precision bf16-mixed - Template A/B から --no-wavlm を削除 (Ada/Blackwell では WavLM 有効が canonical) - WavLM Discriminator 注記: V100 → T4 (VRAM 16GB) で `--no-wavlm` 推奨 - トラブルシューティング表: 「学習速度が遅い (V100)」 を Ada/Blackwell + T4 の 2 行に再構成、 ゾンビ GPU プロセス確認は独立行に - "Precision の選び方" セクション新規追加 (bf16-mixed canonical、 16-mixed legacy、 32-true 数値再現性最優先、 DR-006 resume 非サポート明記) docs/guides/training/training-guide.md: - WavLM Discriminator 注記: V100 → T4 / Ada / Blackwell - precision 警告 ×2: V100 想定 → DR-008 後の bf16-mixed canonical 説明 - 6 言語モデル VRAM 別 batch_size: V100 16GB → Ada 48GB / RTX5090 32GB / T4 16GB / 旧 V100 16GB の table 拡張 - Multilingual pretraining template: --precision 32-true + --batch-size 20 → --precision bf16-mixed + --batch-size 32、 --no-wavlm 削除 - Single-speaker FT template: 同様 (batch_size 4 → 8) - Key parameters table を新 GPU 想定に再構成 - "--no-wavlm recommended on V100" → T4 + Ada/Blackwell 別注記 docs/guides/training/wavlm-guide.md: - precision 警告: V100 想定 → DR-008 後の bf16-mixed canonical 説明 受入基準 (M4 Exit Criteria、 merge 前必須、 CI で完結): - __main__.py に TF32 2 行追加 (Trainer 構築前、 main() 内) - CLAUDE.md Template A/B の --precision が bf16-mixed - V100 言及が新 GPU 前提に置換済 - training-template-drift pre-commit hook PASS - python-tests.yml matrix 3.13 ジョブ green post-merge verification (DR-009、 実機準備完了後): - Ada 6000 で TF32 enabled 確認 + from scratch 1 epoch smoke - RTX 5090 で sm_120 起動 + 同 smoke - TF32 ON/OFF deterministic 100 step 比較 - bf16-mixed で audio_parity Tier 4 (SNR ≥ 30dB) PASS 詳細: docs/reference/python-313/specifications.md FR-08/09 + DR-007/008 * chore(release): prep v1.13.0 release (CHANGELOG + migration guide) Issue #527 / M5 Phase: v1.13.0 release 準備。 M1-M4 の成果を release として公開するための CHANGELOG + Migration guide + VERSION bump。 VERSION: - 1.12.0 → 1.13.0 (DR-005 minor bump、 Docker 利用者向け breaking 明示) - src/python/pyproject.toml piper-train version も 1.13.0 に追従 CHANGELOG.md: - [1.13.0] - 2026-05-25 セクション新規追加 - ### Breaking: 7 entry、 すべて docs/migration/v1.12-to-v1.13.md の anchor link 付き (check_migration_xref.py が要求する xref を満たす) * Docker base image upgrade (12.6/22.04 → 12.8/24.04) * Python 3.13 default * PyTorch upgrade (2.2.1+cu121 → 2.11.0+cu128) * Checkpoint resume non-support (DR-006) * distroless image upgrade (debian12 → debian13) * TF32 default ON (DR-007) * bf16-mixed Template default (DR-008) - ### Added / Changed / Fixed セクションも記載 docs/migration/v1.12-to-v1.13.md (新規): - 7 つの breaking change を H2 アンカー付きで個別解説: * docker-base-image-upgrade (host driver R570+ 要件 + fallback) * python-313-default (PyPI 3.11/3.12 サポート維持の明示) * pytorch-upgrade (cu128 wheel、 RTX 5090 必須条件) * checkpoint-resume-non-support (v1.12 image 継続利用案内) * distroless-image-upgrade (内部パス書換指示) * tf32-default-on (deterministic 用途の opt-out 方法) * bf16-mixed-template-default (V100/T4/Ada/Blackwell 別の対処) - docs/reference/python-313/ への xref を冒頭で明示 docs/migration/README.md: - 「利用可能な migration guide」 セクション新規追加で v1.11→v1.12 と v1.12→v1.13 を列挙 uv.lock: - 前 commit の floor 統一 (chore(deps): unify library floor pins) が requires-dist specifier に反映、 wheel 選択は不変 merge 前必須: - migration-guide-lint workflow PASS (CHANGELOG Breaking xref 全件) - python-tests.yml matrix green (3.11/3.12/3.13 × 3 OS) - version-consistency.yml で VERSION = 1.13.0 整合確認 post-merge: - M5 Entry Criteria (実機 smoke 完了) を満たした上で release tag 打鍵 - 必要に応じて v1.13.0rc1 pre-release → fix → GA (DR-009) * fix: address CI failures from PR #537 initial run CI feedback で発覚した 4 種の修正: 1. Docker python-inference build error (Ubuntu 24.04 + Python 3.13): - `pip install --upgrade pip` で「Cannot uninstall pip 24.0, RECORD file not found」 が発生 (debian apt-installed pip の既知問題) - `--ignore-installed` を追加して既存 pip metadata 無視で upgrade - 影響: build-python-inference / test-python-inference / scan (python-inference) / e2e-docker-server / build-python-train / test-python-train が pass する想定 2. markdownlint format drift (75 errors): - docs/migration/v1.12-to-v1.13.md と docs/reference/python-313/*.md で MD031 (blanks-around-fences) + MD032 (blanks-around-lists) + MD040 (fenced-code-language) を npx markdownlint-cli2-fix で自動修復 - MD040 (7 箇所、 auto-fix 対象外) は ASCII art / sample 用に `text` / `markdown` 言語タグを手動付与 3. audit snapshot drift: - tests/fixtures/doc_examples_audit/audit.json を再生成 (新規 docs による code-block 集計 451 blocks の更新を反映) 4. uv.lock の piper-train version 反映: - 1.12.0 → 1.13.0 (M5 で bump した src/python/pyproject.toml と整合) 残存する非 fix な fail (CI flake、 rerun で解消見込): - pre-commit run --all-files (shellcheck_py wheel build の network flake) - cpp-tests / C++ Debug (googletest download HTTP 502) * fix(docker): handle Ubuntu 24.04 UID 1000 conflict with ubuntu user Issue #527 / PR #537 2nd CI run feedback で発覚した Docker build failure の修正。 Ubuntu 24.04 (Noble) は既存 ubuntu user (UID 1000) を提供する ため、 既存仕様の `useradd -m -u 1000 piper` が UID 衝突で fail する (`useradd: UID 1000 is not unique`)。 修正: - docker/python-train/Dockerfile (line 152 想定) - docker/python-inference/Dockerfile (line 93 想定) 両方とも非 root user 作成 step の直前に `userdel -r ubuntu` を追加: ```dockerfile RUN userdel -r ubuntu 2>/dev/null || true && \ useradd -m -u 1000 piper && \ chown -R piper:piper ... ``` 理由: - piper UID 1000 を維持することで既存 dataset volume の permission 互換性を保つ (Issue #527 で UID を変えると 3rd party の bind mount が壊れる) - `|| true` で Ubuntu 22.04 以前 (ubuntu user 不在) の rollback でも 動作するように冪等化 影響を受けていた CI jobs (今回の修正で pass する想定): - build-python-train / build-python-inference - test-python-train / test-python-inference - scan (python-inference) - e2e-docker-server - ci-required (上記の meta gate) * ci(workflows): bump residual python-version hardcodes from 3.12 to 3.13 10 エージェント並列レビューで検出した CI workflow の 3.12 hardcode 残骸を 除去。 setup-python / setup-uv の `python-version` が単発指定で 3.12 に 固定されており、 Issue #527 の 3.13 default 化と不整合だった。 Affected: bundle-size-gate / codespell / fuzz-smoke / memory-regression / multi-runtime-rtf / mutation-testing / kotlin-g2p-ci / rtf-regression / ci.yml (piper-plus-python check) / rust-tests.yml (cargo check / wasm / clippy / wasm-bindgen の 4 箇所) Refs #527 * docs: address 8-agent doc audit findings for v1.13.0 release 8 エージェント並列レビューで検出した documentation の整合性問題を一括修正。 修正内容: - docs/migration/README.md (line 39-40): 書式例 URL を実存する v1.12-to-v1.13.md の anchor (#docker-base-image-upgrade / #tf32-default-on) に変更 - docs/reference/python-313/open-questions.md (line 230): docs/migration への 相対 path を `../../migration/v1.12-to-v1.13.md` に修正 (docs/ prefix 残骸) - docs/README.md: Migration セクションに v1.12 → v1.13 link 追加 - docs/reference/python-313/{milestones,specifications}.md: 最終更新を 2026-05-25 に統一 (open-questions.md の OQ 全決定日と整合) - docs/features/webui.md: Python 3.11+ → Python 3.13+ recommended (3.11+ supported) に統一 (README.md / CONTRIBUTING.md と整合) - CONTRIBUTING_MODELS.md: Template B コマンド例を bf16-mixed + WavLM canonical に更新、 V100 legacy fallback を別注記、 パラメータガイド表を Ada/RTX 5090 primary に書換 (DR-007/008 反映) - docs/spec/wave3-deferred-proposals.toml (t18_devcontainer): proposal 内の Python 3.11 を 3.13 に更新 (Issue #527 統一) Refs #527 * docs(ci): address 10-agent strict review HIGH findings for Issue #527 10 エージェント並列レビュー (再実施) で検出した 5 系統の HIGH 指摘を一括修正。 修正内容: - src/python/piper_train/VERSION: 1.12.0 → 1.13.0 (pyproject.toml と整合、 Agent 10 の version drift 指摘) - docs/spec/wave3-deferred-proposals.toml:1383: CUDA 12.1 → 12.8 (DR-002 整合、 Agent 8 指摘) - .github/workflows/*.yml (15 file / 16 occurrences): runs-on: ubuntu-22.04 → ubuntu-24.04 (DR-003 統一、 Agent 2 指摘) - .github/workflows/build-phonemize-wheels.yml:188: test_other_platforms matrix を ['3.11'] → ['3.11', '3.12', '3.13'] に拡張 (Agent 9 指摘、 test_windows と build_wheels は cibuildwheel 経路依存のため 3.11/3.12 維持) - docs/migration/v1.12-to-v1.13.md: DR-005 (Affected packages 表) + DR-009 (Post-merge verification checklist) の 2 新規 H2 セクション追加 (Agent 5 指摘) scope outside と判定したもの (誤判定 or 別 PR で対応): - Cargo / C# / WASM の version bump: 各ランタイム independent versioning のため M5 で個別判断 (Agent 10 の誤判定) - actions/setup-python v5.6.0 → v6.2.0 (12 file): action-pin-gate baseline 済 - ruff target-version py311 維持: floor >=3.11 維持で技術的問題なし - cpp-dev Dockerfile Python 3.12: training scope 外 Refs #527 * docs: address 2nd 10-agent review HIGH findings for Issue #527 2 回目の 10 エージェント深掘りレビューで検出した真の HIGH 2 件を修正 (他 FAIL 判定は誤判定 or Issue #527 スコープ外と実証ベースで確定)。 修正内容: - docs/guides/training.md (line 16, 30): training quick-start の --precision 16-mixed → bf16-mixed (DR-008 Template default 反映)。 T4 (16-mixed) / V100 (32-true) fallback 注記を追加 - docs/spec/release-versions.toml (line 66-67): [python] expected_prefix を 1.12. → 1.13. に bump (VERSION 1.13.0 と整合。 他言語 prefix は rust 0.4 / C# 0.3 / WASM 0.6 / iOS 1.13 / Android 1.0 で設定済み、 python のみ bump 漏れだった) 誤判定と確定 (実証ベース、修正不要): - classifier 3.12/3.13 欠落: python_run:43-45 と piper_phonemize_bundled:27-29 に 3 version 全て存在 - ruff 6 箇所同期 NG: 全 0.15.12 一致、 ci.yml は ruff 非実行 - build-phonemize 3.13 install fail: env marker python_version < '3.13' で 3.13 除外済み - ruff/mypy target py311: floor >=3.11 維持が canonical (NFR-01) Issue #527 スコープ外 (別 PR 推奨): - setup-uv sliding major tag 8 件 (Python 3.13 移行非起因の既存 drift) - ubuntu-latest 40 workflow (latest=24.04 解決のため実害なし) Refs #527 * ci(workflows): unify actions/setup-python to v6.2.0 (15 files) setup-python の version 混在を解消。 v5.6.0 (19 occ) と v6.0.0 (1 occ) を 全て v6.2.0 に統一し、 リポジトリ全 74 occurrences を単一 version pin に揃える。 対象 (15 file / 20 occurrences): - v5.6.0 → v6.2.0: action-pin-gate, action-sha-drift, cli-help-docs-sync, cli-help-extract (2), dictionary-consistency, inference-input-contract, kotlin-g2p-ci, migration-changelog-parity, ort-version-sync, pua-consistency (3), rekor-verify, ruff-version-sync, wyoming-smoke, zh-en-loanword-sync (3) - v6.0.0 → v6.2.0: python-doctest 設計判断: - full version pin (vX.Y.Z) の混在は action-pin-gate の対象外 (gate は sliding-major-tag @vn のみ検出)。 baseline file (scripts/action_pins_baseline.txt) は grandfathered sliding-tag 専用で setup-python entry を持たないため更新不要 - @v6.2.0 への統一は vX.Y.Z pin 方針に準拠 Refs #527 * ci(workflows): pin astral-sh/setup-uv@v6 sliding tag to v6.8.0 (4 files) setup-uv の sliding major tag @v6 (8 occ / 4 file) を full SemVer pin @v6.8.0 に統一。 action-pin-gate (check_action_pins.py) の sliding-major violation を解消する。 対象 (4 file / 8 occ): - g2p-cross-platform-ci (1), g2p-python-ci (5), pua-consistency (1), release-model-config (1) 統一後: setup-uv は 14×v6.8.0 + 1×v8.1.0、 sliding @v6 は 0 件。 gate ローカル実行で exit 0 (386 uses: 3 SHA / 356 SemVer / 0 sliding) を確認。 設計判断: - sliding @v6 は「v6 系最新」意図のため既存 full pin @v6.8.0 に統一 (major を v8 へ上げると breaking risk、 conservative 選択) - v8.1.0 (pre-commit.yml の 1 件) は既に full pin のため変更せず - 残る 10 'other' ref (rust-toolchain@stable / pypi-publish@release/v1) は gate が許容する慣用 pin (WARN のみ、 violation でない) のため対象外 Refs #527 * chore(release): bump release version to v2.0.0 (was planned v1.13.0) Issue #527 を Zero-Shot TTS (PR #222) と統合した major リリースとして publish するため計画版 v1.13.0 を v2.0.0 へ変更し、VERSION / piper-train pyproject / CHANGELOG / migration guide / release-versions.toml + python-313 設計文書 (DR-005 を major bump へ改訂) を整合。Swift/iOS は独立版で 1.13.0 据置。 * chore(release): update promote_changelog.py CLI examples to 2.0.0 計画版 v1.13.0 を飛ばし v2.0.0 が次期リリースとなるため、docstring と --help の例示バージョンを 2.0.0 に統一。 * chore(release): update release-skill CLI examples to 2.0.0 prepare-release / release-prep skill の使用例バージョンを 2.0.0 に統一 (計画版 v1.13.0 を飛ばし v2.0.0 が次期リリースのため)。 * ci(phonemize): drop py3.13 from existing-PyPI test matrix piper-phonemize は python<3.13 (root pyproject の条件依存と整合) で PyPI に 3.13 配布が無く、 Issue #527 で追加された 3.13 leg が install 失敗していた。 Test Windows wheels job (3.11/3.12) と整合させ 3.13 を除外。 * fix(ssml): clamp prosody rate to finite positive (fuzz_ssml panic) parse_rate の <= 0.0 ガードは NaN (比較が常に false) と f32 overflow (rate=1e40 -> inf, rate=0% -> 100/0 = inf) を取りこぼし、非有限 rate の segment を生成して cargo-fuzz (fuzz_ssml) invariant 3 で panic していた。 最終 f32 値が finite かつ positive か検証し、該当時は 1.0 に fallback。回帰 test 追加。 * chore(deps): complete DR-002 floor-pin unification (python_run / uvicorn / dev fastapi) Issue #527 / DR-002 の 17-library floor 統一が root と src/python のみに 適用され、 spec (specifications.md:702,726) が in-scope と明示する src/python_run/pyproject.toml と uvicorn 目標 floor が取りこぼされていた ため補完する。 - src/python_run: fastapi>=0.110->0.136.1 / uvicorn[standard]>=0.27->0.46.0 / pytest>=7.0->9.0.3,<10 (PyPI 配布の <1 cap は保守ポリシーとして維持) - root + src/python: uvicorn>=0.27->0.46.0 (spec 目標値、 fastapi と同期) - root dev-dependencies: fastapi>=0.135.1->0.136.1 (inference extras と一致) uv.lock は specifier floor の記録のみ更新、 解決バージョンは不変 (fastapi 0.136.1 / uvicorn 0.46.0 / pytest 9.0.3 で既に解決済み、 no-op)。 `uv lock --check` PASS。 * docs(release): sync v2.0.0 across README banners, docker/README, open-questions v2.0.0 major リリースの周知を front-page と設計ドキュメントに反映する。 - README × 8: breaking banner を v1.12.0 -> v2.0.0 に更新 (CUDA 12.8 + host driver R570+ 必須 / torch 2.11+cu128 で torch 2.2 製 ckpt resume 非対応 / TF32+bf16-mixed default、 docs/migration/v1.12-to-v2.0.md へ誘導)。 各言語の既存ローカライズ表記スタイルを踏襲、 readme-breaking-sync gate は v2.0.0 7/7 PASS。 - docker/README.md: Python 推論 / 学習行の base image 表記を実 Dockerfile (12.8.1-cudnn-{runtime,devel}-ubuntu24.04) に整合 (12.6.3/ubuntu22.04 の 古い表記を修正)。 - open-questions.md: OQ-05 / OQ-07 の status 表と本文に決定マーカーを補完 し、 末尾の「全 14 件決定済」総括と整合。 * fix(ci): align pre-commit cache namespace to py3.13 setup-python was bumped to 3.13 but the .venv / pre-commit-env cache keys (and restore-keys) still used the py3.11 namespace. A .venv materialised on the old 3.11 runs could be restored into the 3.13 job; because requires-python is ">=3.11", uv would not recreate it, so the `uv run --no-sync` sync-gate hooks could silently run against the old interpreter. Rename all five cache/restore keys to py3.13. Addresses Copilot review on PR #537. * docs(release): resolve v2.0 doc inconsistencies from PR #537 review Six self-contradictions / factual errors flagged in Copilot review: - requirements.md NFR-02 / K-05: claimed existing ckpt resume / FT works, contradicting DR-006 (torch 2.2 ckpts intentionally unsupported for v2.0 resume) and the same file's own B-C1. Reworded to match the canonical specifications.md NFR-02 (DR-006 applied): new training + torch-2.11 base FT only; old ckpt resume out of scope. - v1.12-to-v2.0.md smoke checklist: T4 row used --precision bf16-mixed, contradicting the same guide's T4 section (sm_75 has no native BF16 → 16-mixed). Build-verification rows said webui/wyoming use the CUDA base 'same as above'; both Dockerfiles are CPU-only python:3.13.13-slim-trixie. Corrected to actual FROM images and split python-train (devel) row. - README_EN.md: 'Requires Python 3.13+ (recommended; 3.11+ supported)' was self-contradictory; requires-python is still >=3.11. Reworded to the 'recommended' framing already used by the other 7 translations. - CHANGELOG.md + build-phonemize-wheels release notes: claimed 3.13 wheel coverage, but the matrix is 3.11/3.12 only (piper-phonemize gated <3.13). * ci(phonemize): drop py3.12 from existing-PyPI test matrix The existing published piper-phonemize (1.0.0 / 1.1.0) only ships cp311 wheels; pip install on 3.12 fails with 'No matching distribution found' (from versions: none), so the 'Test existing PyPI package' job's 3.12 leg has been red since before this branch's doc changes. Same rationale as 85d6a5b dropping 3.13 (upstream wheel unavailability). Narrow the matrix to ['3.11']. Independent of the doc/floor changes in this PR. * chore: regenerate uv.lock + doc-examples audit snapshot after dev rebase dev (post-v1.13.0) と PR #537 の rebase で uv.lock / audit.json をいずれも HEAD (--ours) で解決していたため、 v2.0.0 への migration guide リネーム (v1.12-to-v1.13.md → v1.12-to-v2.0.md) や floor pin の更新が反映されていなかった。 両 fixture を再生成して整合化。
) (#569) * feat(infra): unify to Python 3.13 + CUDA 12.8 + Ubuntu 24.04 (Issue #527) (#537) * docs: add Python 3.11 → 3.13 migration scoping for #527 Issue #527 (デフォルト Python 3.11 → 3.13) の影響範囲調査をまとめ、 4 Phase 分割の移行アプローチを提案する。 - pyproject.toml の requires-python 下限は据置 (>=3.11 維持) - CI workflow: 既に 3.13 が 41 箇所で過半、 残 3.11 25 箇所を統一 - Dockerfile: wyoming/webui は既に 3.13、 残 5 image の切替難度を整理 - 最大ブロッカーは python-train Dockerfile の torch==2.2.1 (cp313 wheel なし) * docs: expand Python 3.13 migration with concerns C1-C8 追加調査で 8 個の個別ブロッカーを特定 (C1-C8): - C1: monotonic_align/setup.py が distutils (3.12 で削除済) を import setuptools shim 経由で偶然動いている状態 → Phase 0 で先行修正 - C2: distroless final image は debian12 (= python 3.11) のため builder + final を Trixie 揃えで debian13 (= python 3.13) へ - C3: CUDA Docker (Ubuntu 22.04 Jammy) は python3.13 を apt 提供しない deadsnakes PPA 経由が最小変更案 - C4: runtime-parity-deep.yml の "Match dump-python (3.11)" pin は 実装 (stdlib wave) を見ると不要、 両方 3.13 へ - C5-C8: piper-phonemize wheel / PyPI metadata / tarfile filter 等は据置可 uv.lock 直読で cp313 wheel 提供状況も整理: - torch 2.11.0 / numba 0.65.1 / onnxsim-prebuilt 0.4.39 / wandb 0.26.1 すべて cp313 wheel 利用可能 - 真のブロッカーは docker/python-train Dockerfile の torch==2.2.1+cu121 のみ Phase 0 (distutils → setuptools 書換) を新設し、 検証チェックリスト追加。 * docs: evaluate library bumps alongside Python 3.13 migration Q: 3.13 化と同時に torch 等を bump できないか? A: 3.13 化単体では library bump はほぼ起きない (floor pin が 3.11 据置のため)。 uv.lock 現状確認: - torch 2.11.0+cu128 / onnxruntime 1.26.0 / numpy 2.4.4 / scipy 1.17.1 すべて既に最新近く、 floor を上げても resolver は同じ wheel を選ぶ - 3.11 を切らないと使えない library は現状存在しない 必須同時 bump (Phase 3 セット): - docker/python-train Dockerfile の torch 2.2.1+cu121 → 2.11.0+cu128 (torch 2.2 は cp313 wheel 提供なし、 これは強制セット) 別 PR で評価推奨 (本 Issue スコープ外): - pytorch-lightning >=2.0 → >=2.4 - wandb >=0.16 → >=0.20 - librosa >=0.10 → >=0.11 - numba >=0.59 → >=0.61 revert 単位を肥大化させないため上記は chore(deps) 系で個別 PR 化する。 * docs: add CUDA version mapping for #527 migration plan CUDA は base image / torch wheel / uv index の 3 層で個別 pin されており、 3.13 化との関係を整理した。 現状: - base image: nvidia/cuda 12.6.3 + cuDNN 9 (PR #532-#533 で bump 済) - torch wheel (uv workspace): cu128 (CUDA 12.8 対応) - torch wheel (docker/python-train): cu121 (CUDA 12.1 対応) — 古い forward-compat で動く理屈: - 12.6 driver は 12.1 / 12.8 wheel bundle を dlopen 可能 - torch wheel は site-packages/nvidia/{cublas,cudnn}/lib を優先するため、 base image の cuDNN 9 ではなく wheel bundle 側 (cu121 → cuDNN 8.9 / cu128 → cuDNN 9.x) が使われる Phase 3 で同時 bump: - torch wheel suffix cu121 → cu128 (uv.lock canonical と整合) - --extra-index-url を cu121 → cu128 - base image (12.6.3) は据置 (forward-compat で動作) 別 issue 切り出し: - base image 12.6.3 → 12.8.x bump (PR #532-#533 で最近やったため過度な追従回避) - dependabot の nvidia/cuda minor bump ignore 解除 (PR #427 経緯で据置) * docs: analyze CUDA 12.8 optimization benefits for #527 「3.13 のタイミングで CUDA 12.8 にして最適化恩恵は受けられるか?」 を分析。 結論: wheel を cu121 → cu128 に bump するだけで CUDA 12.8 恩恵の 80% を享受可能。 base image bump は実測 0-2% で別 issue。 恩恵の主因: - wheel bundle cuDNN 8.9 → 9.5+ (conv kernel 5-10% 高速) - wheel bundle cuBLAS 12.1 → 12.8 (GEMM dispatch 改善 3-7%) - wheel bundle NCCL 2.20 → 2.23+ (multi-GPU all-reduce 5-10%) - Triton 2.x → 3.x (torch.compile autotune 高速化) V100 学習想定での期待値: - 単 GPU: 5-12% 学習速度向上 - multi-GPU (Template A --devices 4): 8-15% 向上 - --compile warm 後: 追加 5-10% 恩恵がないもの (使わない 12.8 新機能): - FP8 (E4M3/E5M2) — sm_90+ 専用、 V100/A100 では未対応 - Flash Attention 3 — sm_90+ 専用 - Blackwell sm_120 — 該当ハードなし - CUDA Graphs Enhanced Conditional — Lightning ループと噛み合わない - NVSHMEM / NVLink Sharp — H100+ DGX 専用 V100 リスク: - 将来 CUDA 13.x で sm_70 deprecation の可能性 (現状 12.x は問題なし) - --precision 16-mixed の遅さは Volta ハードウェア制約のため 12.8 でも改善しない * docs: revise #527 plan for new GPU lineup (T4/Ada6000/RTX5090) 学習サーバー GPU が V100 → T4/Ada 6000/RTX 5090 へ移行することが確定 (2026-05-21)。 CUDA 12.8 化の優先度評価が「恩恵あり」 から「Blackwell サポートのため事実上必須」 に昇格したため全面改訂。 新 GPU 別の対応: - T4 (sm_75): 推論専用 (VRAM 16GB で 6lang base 学習は厳しい) - Ada 6000 (sm_89, 48GB): メイン学習機。 FP8/FA3/TF32/BF16 解禁 - RTX 5090 (sm_120, 32GB): 次世代学習機。 CUDA 12.8 + cu128 wheel 必須 学習速度期待値 (V100 比): - Ada 6000 + BF16 + TF32 + FA2: 3-5x - Ada 6000 + FP8 + FA3 (要 transformer_engine): 5-8x - RTX 5090 + BF16 + FA3: 5-7x - RTX 5090 + FP8 + FA3 (フル活用): 7-10x Phase 3 のスコープ拡大: - torch 2.2.1+cu121 → 2.11.0+cu128 (RTX 5090 起動の必須条件に格上げ) - torch.backends.cuda.matmul.allow_tf32 = True を __main__.py に追加 - CLAUDE.md / training-guide / wavlm-guide の V100 言及を新 GPU 前提に置換 - Phase 3 を "Docker bump" から "performance optimization PR" に格上げ 新 GPU 実機検証 (merge 前必須): - Ada 6000 で Template B 1 epoch smoke - RTX 5090 で sm_120 起動確認 + 学習速度測定 - T4 で推論 only smoke - TF32 enable 前後の validation loss 比較 base image bump (12.6 → 12.8) は引き続き別 PR で評価 (wheel cu128 で恩恵の 95%+ 取れるため)。 * docs: move Python 3.13 migration into dedicated folder docs/reference/python-313-migration.md → docs/reference/python-313/README.md で zh-en-loanword/ と同じサブフォルダ構造に揃える。 今後 Phase 個別ノートを 追加する際の置き場として使う。 - docs/reference/README.md の索引を新パスに更新 - python-313/README.md の冒頭にサブフォルダ navigation 表を追加 * docs: switch to fully-aligned Docker strategy (CUDA 12.8 + Python 3.13) ユーザー要望に基づき、 Docker 全 image を「CUDA 12.8 + Python 3.13」 で 完全統一する fully-aligned 戦略に転換。 従来の「base image 12.6 据置 + wheel cu128 で forward-compat」 戦略は廃止。 主要変更: - Fully-aligned target を冒頭に明記 (Python 3.13.x / CUDA 12.8.x / cuDNN 9.x / Ubuntu 24.04 / torch cu128 で全 image 揃え) - Phase 構成を 0-4 に拡大: - Phase 0: distutils → setuptools (前提) - Phase 1: 低リスク CI / docs / CPU Docker - Phase 2: distroless × 2 を debian13 で統一 - Phase 3: CUDA Docker base を 12.8 + Ubuntu 24.04 + deadsnakes 3.13 - Phase 4: 新 GPU 学習最適化 (TF32 / bf16-mixed) - 「base image bump は別 PR」 → 「Phase 3 必須項目」 へ格上げ - C3 (Ubuntu の python3.13 提供) に Dockerfile 実装例を追加 - 全 Dockerfile の現状 → 統一後 target を表で明示 - CUDA image 選択肢比較 (A. Ubuntu 24.04 + deadsnakes / B. Jammy / C. multi-stage python:3.13 流用) と推奨理由 Fully-aligned 戦略のメリット: - forward-compat 依存を解消 - Trivy CVE 管理が単一 CUDA major で完結 - nsys / nvprof / observability tool が version mismatch なく動作 - Ubuntu EOL 2027 → 2029 で OS 寿命延長 - RTX 5090 (sm_120) の "wheel-only forward-compat" 不確定性が解消 * docs: add Phase dependency / diff samples / rollback / PR templates 実装に必要な詳細情報を追補: - Phase 依存関係図 (Phase 0 → 1 → 2 → 3 → 4 の順序と並列可否) - Phase 別 diff サンプル (Phase 0 / 1 / 2 / 3 / 4 の代表的な before/after) - ロールバック手順 (各 Phase の戻し方とデータロス可能性) - PR テンプレート (Phase 0 / Phase 3 の Title / Summary / Type / Risk Level / Affected Components / Test Plan サンプル) これで「ドキュメントを見ながら Phase ごとに PR を出せる」 状態に整備完了。 * docs: add Issue #527 requirements specification README.md (実装計画 / HOW) から独立した要求定義書 (WHAT/WHY) を作成し、 docs/reference/python-313/requirements.md として配置。 要求定義書の章構成: 1. 目的 2. 背景 (現状の課題 / 環境変化 / 機会) 3. 要求事項 - 3.1 機能要求 (FR-01 〜 FR-10) — 受入基準付き - 3.2 非機能要求 (NFR-01 〜 NFR-09) — 後方互換 / セキュリティ / OS 寿命 等 - 3.3 制約事項 (C-01 〜 C-06) — requires-python 据置 / matrix 維持 等 4. スコープ (対象 / 対象外、 別 issue 化候補リスト) 5. 成功基準 (MUST / SHOULD / MAY) 6. 前提条件 (A-01 〜 A-06) — host driver / 新 GPU 利用可能性 等 7. ステークホルダー (6 ロール × 関心事項 × 関与 Phase) 8. リスク管理 (R-01 〜 R-08) — 影響度 / 発生確率 / 緩和策 9. 用語定義 10. 関連ドキュメント フォルダ内ナビゲーション (README + requirements) を更新し、 上位 docs/reference/README.md の索引も両方リンク。 * docs: enumerate breaking changes from 3.13 + CUDA 12.8 + torch 2.11 + TF32 要求定義書に「9. 互換性影響評価 (Breaking Changes 棚卸し)」 を追加し、 最適化と引き換えに失われる互換性を 6 カテゴリ × 27 項目で体系化: A. ハードウェア互換性 (B-A1〜A5) - V100/Pascal/Maxwell の新機能利用不可 - host driver R570+ 必須 - nvidia-container-toolkit 1.14+ 必須 B. ソフトウェア互換性 (B-B1〜B6) - Ubuntu 22.04 wheel 経路の断捨離 - glibc 2.35 → 2.39 - deadsnakes PPA への dependency C. データ・モデル互換性 (B-C1〜C4) - PyTorch 2.2 optimizer state_dict の forward-compat 非保証 - ONNX opset default 変更可能性 - TF32 / bf16-mixed の reproducibility 影響 D. PyTorch API 互換性 (B-D1〜D6) - torch.cuda.amp → torch.amp - torch.set_default_tensor_type deprecated 等 E. 数値再現性 (B-E1〜E4) - TF32 で matmul mantissa 23 → 10 bit - cuDNN 8.9 → 9.5 で algorithm 選択変更 - deterministic algorithms との非互換 F. ドキュメント・サポート互換性 (B-F1〜F3) - V100 トラブルシューティング無効化 - --precision 32-true が legacy 扱い 加えて K-01〜K-10 で「維持される互換性」 を明示、 G-01〜G-06 で 「グレーゾーン (要検証)」 を Phase 別に列挙。 結論: 断念するのは V100/Pascal/Maxwell + CUDA 11 driver + TF32 bit-exact 再現性のみ。 API/データ/ランタイム/G2P 互換は全維持。 NFR-01 から本セクションへの参照リンクを追加。 * docs: add Issue #527 system requirements specification (要件定義書) 要求定義 (requirements.md) を技術的な要件定義 (specifications.md) に 落とし込み。 各 FR/NFR を具体的な実装仕様 + 測定可能閾値 + 受入基準 として再定義。 要件定義書の章構成: 1. システム概要 (対象/対象外) 2. システム構成要件 (SCR-01〜05) - Python 3.13.x / CUDA 12.8.x / Ubuntu 24.04 / cuDNN 9.x / torch 2.11.0+cu128 / uv + deadsnakes PPA 3. 機能要件詳細 (FR-01〜10 を FR-XX-YY 形式に分解) - 26 個の workflow 別更新表 - 7 個の Dockerfile 別変更仕様 (before/after + 受入基準) 4. 非機能要件詳細 (NFR-01〜09 に測定可能閾値) 5. データ要件 (DR-01〜04) - ckpt 互換 / OPSET=15/17 据置 / phoneme set 173 / WandB metric 6. 外部 IF 要件 (EIR-01〜04: PyPI/Docker/HF/GHA) 7. テスト要件 (TR-01〜05) - 単体/ビルド/実機/互換/パフォーマンス 8. 移行要件 (MR-01〜03) 9. 運用要件 (OR-01〜03) 10. トレーサビリティマトリクス (要求 ID ⇔ 要件 ID) 11. 既知の前提・調査結果 (DF-01〜04) 追加調査結果 (DF-01〜04): - piper-train code の deprecated PyTorch API 利用は実質ゼロ (torch.cuda.amp 直接利用なし、 jit.script は 1 箇所のみ、 onnx.export は opset 明示で安全) - 3.11 を使う workflow は 26 個 (single 23 + matrix 3) - ONNX OPSET は main=15 / speaker_encoder=17 据置 - python:3.13-slim-trixie / distroless/python3-debian13 / nvidia/cuda:12.8.1-ubuntu24.04 / deadsnakes ppa の存在確認済 3 文書体系を完成: - requirements.md (要求定義: 339 行) WHAT/WHY - specifications.md (要件定義: 701 行) HOW MUCH/HOW PRECISELY - README.md (実装計画: 969 行) HOW STEP-BY-STEP フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: add Issue #527 milestone definition (M1-M5) Phase 0-4 を上位の stakeholder 視点マイルストーン (M1-M5) として束ね、 進捗管理ドキュメントを追加。 GitHub の milestone 機能には登録せず、 本ドキュメント内のみで管理 (PR 数を絞る方針)。 マイルストーン構成: - M1: 基盤整備 + 軽量切替 (Phase 0 + 1、 0.5 日) - M2: 非 GPU Docker 統一 (Phase 2、 0.5 日) - M3: GPU Docker 統一 — CUDA 12.8 + Ubuntu 24.04 + Python 3.13 (Phase 3、 1 日 + 実機検証) - M4: 新 GPU 学習最適化 — TF32 + bf16-mixed + 実機検証 (Phase 4、 1-2 日) - M5: リリース + clean-up — v1.13.0 + migration guide (Phase 外、 0.5 日) 合計工数: 3.5-4.5 日 (人日) 各マイルストーンに以下を定義: - 目的 / 含む Phase / Deliverables (件数つき) - Entry Criteria / Exit Criteria (checkbox) - 依存関係 / リスクゲート (重要度 high の項目に対応案) - ステークホルダー / 想定所要時間 加えて: - マイルストーン依存図 (ASCII art) - 累積進捗トラッキング表 (実装時に更新) - 中間チェックポイント (CP-01〜05) - マイルストーン管理ルール (M-RULE-01〜05) - PR と Milestone の対応 - Exit Criteria の checkbox 化 - リスクゲート発動時の処理 - 進捗トラッキング更新ルール - 並列実行禁止 (直列実行) 4 文書体系に拡張: - requirements.md (要求定義、 WHAT/WHY) - specifications.md (要件定義、 HOW MUCH/HOW PRECISELY) - milestones.md (マイルストーン、 WHEN/WHAT DELIVERABLE) ← NEW - README.md (実装計画、 HOW STEP-BY-STEP) フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: add comprehensive library bump survey to #527 spec 「3.13 化のついでに他に bump したいライブラリは?」 への網羅調査を specifications.md に追加。 全 dependency の floor pin と uv.lock actual を全件突合し、 3 カテゴリ × 26 library を整理。 A. Floor drift 解消 (M1 で同時実施推奨、 17 library) - root pyproject と member で floor が乖離している主要 library を統一 - scipy / pytorch-lightning / transformers / wandb / tensorboard / fastapi / uvicorn / pytest / matplotlib / pypinyin / librosa / numba / torchmetrics / onnxscript / coverage / mypy / onnxruntime - 想定 PR: chore(deps): unify library floor pins across workspace members - 任意で CI gate (check_workspace_library_floor.py) も追加検討 B. Major bump で改善余地あり (別 PR 推奨、 2 library) - psutil >=5.9 → >=7.0 (security/major bump) - onnxsim-prebuilt: floor を明示 pin (>=0.4.39) C. 据置すべきもの (明示、 9 library) - huggingface-hub <1.0 (HF Hub 1.0 dataset API 警戒) - numpy <2.5 (dtype 仕様変更予告) - black / ruff exact pin (formatter は version 一致必須) - piper-phonemize / pyopenjtalk-plus / g2pk2 / mecab-python3 / unidic-lite 加えて Python 3.13 動作確認が必要なグレーゾーンに mecab-python3 / sudachipy を追加 (G-XX 系)。 M1 マイルストーンの Deliverables に library floor 統一 (17 library) + Python 3.13 smoke 追加 (2 library) を反映。 * docs: record library bump policy decisions as ADR ライブラリ bump 方針を Architecture Decision Record (ADR) 形式で 明示的に記録。 「なぜ M1 で 17 library 統一」「なぜ major bump は別 issue」 の判断根拠を将来参照できる形にする。 specifications.md §10.6 に 4 つの Decision Record を追加: - DR-001: Fully-aligned Docker 戦略の採用 (wheel-only forward-compat 戦略の棄却理由) - DR-002: Library Floor Drift Unification を M1 に組み込み (17 library を Issue #527 スコープ内とする判断) - DR-003: Major Library Bump は別 Issue に切り出し (psutil / onnxsim-prebuilt / huggingface-hub / numpy 4 件) - DR-004: New GPU Optimization は Phase 4 で分離 (Phase 3 と Phase 4 を別 PR にする判断) 各 DR は: - 状態 (Accepted) - コンテキスト (背景) - 決定内容 - 理由 (なぜそうしたか) - トレードオフ - 代替案 (棄却したもの) - 影響範囲 requirements.md の scope 表を更新: - 4.1.5 ライブラリ依存 (in-scope): 17 library の floor 統一表を追加 - 4.2 対象外: psutil / onnxsim / HF Hub / numpy の 4 件を別 issue として明記 * docs: extract 14 open questions for Issue #527 pre-implementation 実装着手前に stakeholder / リポジトリオーナー / 学習担当で決める必要が ある事項を open-questions.md として網羅。 4 ドキュメントの中の TBD / 個別判断 / 実装者判断 / 要確認マーカーを全件抽出して 14 個の OQ-XX に 構造化。 優先度別内訳: - 高 (M1/M3/M4 着手の blocker、 4 件): - OQ-01: host driver R570+ アップグレード計画 - OQ-02: nvidia-container-toolkit 1.14+ への bump - OQ-03: ckpt resume 失敗時のフォールバック方針 - OQ-04: バージョン番号 (v1.13.0 vs v1.12.x) - 中 (PR 構成判断、 7 件): - OQ-05: M1 内 floor drift 統一を別 PR にするか - OQ-06: M3 + M4 統合 vs 分離 - OQ-07: CUDA 12.8.x patch 選択 (12.8.0 / 12.8.1) - OQ-11: CHANGELOG breaking 表記 (草案あり) - OQ-12: TF32 default ON vs opt-in - OQ-13: bf16-mixed Template default 化判断 - OQ-08-09 のサブ判断 - 低 (実装中/後で決められる、 3 件): - OQ-08: cpp-dev Dockerfile スコープ判断 - OQ-09: cpp-inference distroless スコープ判断 - OQ-10: dependabot ignore policy 更新 - OQ-14: 旧 v1.12 image tag 保持判断 各 OQ には: - カテゴリ / 重要度 / 必要タイミング - コンテキスト (背景・関連 ADR) - 選択肢 (3-4 個) - 推奨案 - 決定すべき人 加えて「解決プロセス」 セクションで Phase 別 checkbox を提供し、 着手時に確認できるようにした。 ドキュメント体系を 5 文書に拡張: - requirements.md 要求定義 - specifications.md 要件定義 + ADR - milestones.md マイルストーン - open-questions.md 未決事項 ← NEW - README.md 実装計画 フォルダナビゲーション + 上位 docs/reference/README.md 索引も更新。 * docs: record OQ-04 / OQ-03 / OQ-14 decisions (v1.13.0 + resume non-support) リポジトリオーナー判断を 3 件確定: OQ-04: v1.13.0 (minor bump) 採用 - DR-005 として正式記録 - Migration guide docs/migration/v1.12-to-v1.13.md を M5 で作成 OQ-03: 過去 ckpt resume は非サポート化 - DR-006 として正式記録 - OQ-03 の選択肢 B (失敗時 fallback) より大胆な方針 - 既存 ONNX 推論は forward 互換で継続可能、 新規学習のみ torch 2.11 - 過去 ckpt 継続学習が必要なユーザは v1.12 image を継続利用 OQ-14: 旧 v1.12 Docker image tag 保持 (DR-006 連動で確定) - 過去 ckpt 継続学習者の唯一の選択肢になるため必須事項に格上げ - 削除予定は設定しない 連鎖更新: - NFR-02 (学習再現性): resume 確認 → from scratch 1 epoch 確認に置換 - DR-01 (モデルチェックポイント): 既存 ckpt resume 要件削除、 v1.12 image retention を明記 - M4 Entry/Exit Criteria: 6lang base ckpt resume → from scratch smoke - B-C1 (Breaking change): "optimizer state_dict 保証なし" → "model weights も含めて resume 非サポート" に拡大 - R-01 リスク: 高 → 中 (DR-006 でリスク本体が消滅) 未決事項残: 高 2 件 (OQ-01/02 運用前提)、 中 5 件、 低 3 件 → 計 10 件 * docs: confirm OQ-12 (TF32 default ON) + OQ-13 (bf16 Template default) リポジトリオーナー判断を 2 件確定: OQ-12: TF32 default ON (DR-007) - src/python/piper_train/__main__.py に 2 行追加 - torch.backends.cuda.matmul.allow_tf32 = True - torch.backends.cudnn.allow_tf32 = True - Ada 6000 / RTX 5090 で Tensor Core 活用、 sm_75 以下では noop - TTS で perceptual 影響なし (audio_parity Tier 4 で検証) - deterministic 用途の opt-out flag は別 issue で必要に応じて追加 OQ-13: bf16-mixed Template default 化 (DR-008) - CLAUDE.md Template A/B の --precision を 32-true → bf16-mixed - 32-true は legacy V100 互換用と注記して残す - training-guide.md の precision 表で bf16-mixed を default 推奨に - wavlm-guide.md の V100 注記削除 - training-template-drift pre-commit hook の期待値更新 - 検証: Ada 6000 で 1 epoch smoke + audio_parity Tier 4 PASS 連鎖更新: - FR-08-01/02: TF32 enable のコード変更を 2 行 (matmul + cudnn) に拡張 - FR-09-01〜04: Template default 化、 pre-commit hook 整合、 受入基準を再構成 - M4 Exit Criteria: bf16-mixed default 化を必須項目に格上げ 未決事項残: 高 2 件 (OQ-01/02 運用前提)、 中 4 件、 低 3 件 → 計 9 件 * docs: split real-hardware smoke to post-merge (DR-009) リポジトリオーナーから「ブランチは host 環境が整っている前提で進めて良い、 実機はまだ用意できていないので待つ」 という明示承認に基づき、 M3/M4 の 実機 smoke を post-merge verification に切り出し。 OQ-01/02 (host driver R570+ + nvidia-container-toolkit 1.14+): - 「前提として進行 (実機環境は別途準備中)」 として決定済 DR-009 (実機検証を post-merge に切り出し) を追加: - M3 / M4 のコード / Docker 変更 PR は merge 可能 (CI で完結する範囲) - 実機 smoke (Ada 6000 / RTX 5090 / T4) は post-merge verification 化 - M5 (release) は実機 smoke 完了が merge 前必須に維持 - 必要なら v1.13.0rc1 pre-release で early access、 fix 反映後に GA 連鎖更新: - M3 Exit Criteria: * merge 前必須 (CI 完結): docker build, Trivy, image 起動 confirm * post-merge verification: Ada/RTX5090/T4 実機 smoke * リスクゲートに「post-merge smoke 失敗時の v1.13.0rc1 経由対応」 追加 - M4 Exit Criteria: * merge 前必須 (CI 完結): TF32 enable コード、 bf16 Template 書換、 docs 更新 * post-merge verification: from scratch smoke + TF32 比較 + bf16 smoke - M5 Entry Criteria: * 「実機環境準備完了」 + 「M3/M4 post-merge verification 完了」 を追加 * (任意) v1.13.0rc1 pre-release フェーズ - マイルストーン依存図: * 「運用前提」 ブロックを M3 着手前 → M5 着手前に移動 * post-merge verification ステップを M4 と M5 の間に挿入 これで M1 → M2 → M3 → M4 までは実機なしで実装可能。 M5 release だけ実機 smoke 完了を待つ。 * docs: finalize remaining 5 open questions (OQ-06/08/09/10/11) リポジトリオーナー一括承認により残り 5 件確定: - OQ-06: M3 + M4 分離 PR (DR-004 再確認) - OQ-08: cpp-dev Dockerfile は別 issue - OQ-09: cpp-inference distroless は別 issue - OQ-10: dependabot nvidia/cuda ignore policy 据置 - OQ-11: CHANGELOG breaking 草案採用 (DR-006/007/008 反映済) CHANGELOG 草案を DR-006 / DR-007 / DR-008 反映に更新: - resume 非サポート (DR-006) を Breaking changes に明記 - TF32 default ON (DR-007) に cudnn.allow_tf32 も追加 - bf16-mixed Template default (DR-008) を新規 breaking entry に - 旧 v1.12 image tag retention (OQ-14) を案内 - 新 GPU lineup (T4/Ada/RTX5090) への移行を Notable section に 「解決プロセス」 全 14 OQ-XX を完了状態 ([x]) に更新。 未決事項 0、 実装着手可能な状態。 * chore(build): replace distutils.core with setuptools in monotonic_align distutils は Python 3.12 で stdlib から削除済 (PEP 632)。 これまで setuptools shim 経由で偶然動いていた状態を明示化、 3.13 環境で fragile な shim 依存を解消する。 Issue #527 Phase 0 / M1 (詳細: docs/reference/python-313/). * ci: bump default Python from 3.11 to 3.13 across 20 workflows Issue #527 / M1 Phase 1: 単一値で 3.11 を指定していた 20 workflow を 3.13 に置換。 既存の Python マトリクス (3.11/3.12/3.13 を網羅する python-tests / g2p-python-ci / build-phonemize-wheels) は据置。 変更対象: - ci.yml (matrix ['3.11'] → ['3.13'] + line 304 比較式) - codeql.yml / deploy-huggingface.yml / generate-combined-report.yml - model-quality-gate.yml / release-verify.yml / sbom.yml / security-audit.yml / test-hf-space.yml / timing-parity.yml / version-consistency.yml / wyoming-smoke.yml - pre-commit.yml / python-lint.yml (matrix ['3.11'] → ['3.13']) - python-doctest.yml (2 箇所、 setup-python + setup-uv) - dev-create-release.yml / dev-build-all.yml / test-japanese-tts.yml (それぞれ 2 箇所) - runtime-parity-deep.yml (dump-python + compare の 2 箇所、 + コメント 「Match dump-python (3.11)」 を 3.13 統一説明に更新、 DR-009 / C4) - webui-test.yml (matrix ['3.11','3.12'] → ['3.13'] + 単一指定) 据置 (matrix で 3.11/3.12/3.13 網羅 or piper-phonemize cp313 未提供): - python-tests.yml (3 OS × 3.11/3.12/3.13) - g2p-python-ci.yml (matrix 維持) - build-phonemize-wheels.yml (C-03) 詳細: docs/reference/python-313/specifications.md FR-01-01 * feat(docker): bump python-inference CPU base to python:3.13-slim-trixie Issue #527 / M1 Phase 1: 推論用 CPU Docker image の base を python:3.11-slim-bookworm から python:3.13-slim-trixie に bump。 - Python interpreter: 3.11 → 3.13 (Issue #527 Phase 1) - Debian: bookworm (12) → trixie (13)、 EOL 2026 (bookworm) → ~2028 (trixie) - requires-python = ">=3.11" は据置、 PyPI install の 3.11/3.12 サポート も維持 (Docker image default のみの変更) GPU variant (Dockerfile / CUDA inference) は Phase 3 で対応予定。 distroless (Dockerfile.cpu.distroless) は Phase 2 で対応予定。 * docs: bump Python recommended version from 3.11+ to 3.13+ Issue #527 / M1 Phase 1: ドキュメントの Python 推奨 version 表記を 更新。 「Python 3.11+ が必要」 → 「Python 3.13+ 推奨 (3.11+ サポート)」。 サポート下限 (requires-python >=3.11) は据置、 PyPI 経由の install は 3.11/3.12 でも継続サポート (NFR-01)。 推奨 / canonical 環境のみが 3.13 に揃う。 更新対象 (12 ファイル): - CONTRIBUTING.md / README.md (root) - README_{EN,ZH,KO,ES,FR,DE,PT}.md (7 言語) - docs/guides/training/training-guide.md (env: python 3.11 → 3.13) - docker/README.md (Dockerfile.cpu の base image 表記更新) - QA-RELEASE-CHECKLIST.md (CI version の正確な表記) 詳細: docs/reference/python-313/specifications.md FR-01-03 * chore(deps): unify library floor pins across workspace members Issue #527 / M1 / DR-002: root pyproject.toml と src/python/pyproject.toml で 17 library の floor pin drift を統一。 lockfile actual (uv.lock) と整合する canonical value で pin、 silent drift を防止。 統一した library (root と member で乖離していたもの): - scipy >=1.12 (member) → >=1.17.1 (root と統一) - pytorch-lightning >=2.0 → >=2.4.0 (configure_model API 安定化点) - transformers >=4.30/4.38 → >=4.50.0 (3.13 対応版) - onnxruntime >=1.17/1.20.0 → >=1.26.0 (C++ canonical 統一) - onnxruntime-gpu >=1.17/1.20.0 → >=1.26.0 - librosa >=0.10 → >=0.11.0 - wandb >=0.16 → >=0.26.1 - tensorboard >=2.16 → >=2.20.0 - numba >=0.59 → >=0.61.0 (numpy 2.x ABI warning 解消) - matplotlib >=3.8 → >=3.10.9 - torchmetrics >=1.0 → >=1.9.0 - onnxscript >=0.6.2 → >=0.7.0 - pypinyin >=0.50 → >=0.55.0 (requirements.txt と統一) - fastapi >=0.110 → >=0.136.1 (member inference / inference-gpu extras) - coverage[toml] >=7.6 → >=7.14.0 - mypy >=1.7 → >=1.20.2 - pytest >=7.4 → >=9.0.3,<10 (test extras) - torchaudio >=2.1.0 → >=2.11.0 (root の torch 整合) 据置 (意図的): - src/python_run/pyproject.toml (PyPI publish package、 慎重な lower bound + 上限 cap policy を維持、 fastapi >=0.110,<1 / uvicorn[standard]>=0.27,<1) - huggingface-hub <1.0 上限 / numpy <2.5 上限 (別 issue で評価) uv.lock は本 commit では touch しない (CI 側で uv lock --check が drift を検出した場合に別 PR で同期、 通常は resolver が同じ wheel を選ぶため 影響なし)。 * feat(docker): unify distroless images to debian13 + Python 3.13 Issue #527 / M2 Phase 2: distroless × 2 image を Python 3.13 + Debian 13 で統一。 builder と final の Debian release を揃えることで glibc ABI 整合 を保つ (PR #523 と同型対応)。 更新内容: - docker/python-inference/Dockerfile.cpu.distroless: * builder: python:3.11-slim-bookworm → python:3.13-slim-trixie * final: gcr.io/distroless/python3-debian12 → debian13 * 内部パス /usr/local/lib/python3.11 → /usr/local/lib/python3.13 (4 箇所) * PYTHONPATH も同様に書換 * コメント中の説明文を Issue #527 経緯付きで更新 - docker/webui/Dockerfile.distroless: * 同パターン (builder + final + 内部パス 4 箇所書換) - docker/cpp-inference/Dockerfile.distroless: * コメント中の python-inference distroless 参照を新版に更新 (Python 利用なしのため image 本体は据置、 OQ-09 で別 issue 推奨) 受入基準 (M2 Exit Criteria): - docker build success (CI で確認、 docker-build.yml) - distroless/python3-debian13 で python3 --version が 3.13.x - import onnxruntime / soundfile / pyopenjtalk-plus 成功 (G-01, G-02) - Trivy CVE diff で new HIGH/CRITICAL なし - Wyoming smoke (wyoming-smoke.yml) 継続 green 詳細: docs/reference/python-313/specifications.md FR-02-02/03 * feat(docker): unify CUDA Docker to 12.8.1 + Ubuntu 24.04 + Python 3.13 (DR-001) Issue #527 / M3 Phase 3: GPU Docker image を fully-aligned 戦略で統一。 RTX 5090 (Blackwell sm_120) 起動の必須条件 + forward-compat 依存解消。 docker/python-inference/Dockerfile (CUDA 推論): - base: nvidia/cuda:12.6.3-cudnn-runtime-ubuntu22.04 → 12.8.1-...-ubuntu24.04 - Python install: apt python3.11 → deadsnakes PPA python3.13 - software-properties-common → add-apt-repository ppa:deadsnakes/ppa - python3.13 / python3.13-venv install - update-alternatives で /usr/bin/python → python3.13 (符号化) - pip / uv install に --break-system-packages 追加 (Ubuntu 24.04 PEP 668) docker/python-train/Dockerfile (学習 multi-stage): - builder + runtime 両 stage で同様の base + Python 切替 - torch install: --extra-index-url cu121 → cu128 * torch==2.2.1+cu121 → torch==2.11.0+cu128 (DR-001 必須) * torchaudio も同 version へ * torchvision は piper-train が未使用のため削除 (FR-02-05) - 旧版コメント中の "forward-compat" 説明を fully-aligned 戦略の説明に書換 .github/dependabot.yml: - CUDA minor bump ignore policy 据置 (OQ-10 で確定) - コメントを Issue #527 後の状態 (12.6.3 → 12.8.1 への手動 bump 経緯) で更新 merge 前必須 (CI で完結): - docker build success (docker-build.yml で確認) - image 起動で python --version が 3.13.x - import torch で 2.11.0+cu128 確認 - import onnxruntime-gpu success - Trivy scan: new HIGH/CRITICAL なし post-merge verification (DR-009、 実機準備完了後): - Ada 6000 / RTX 5090 / T4 実機での起動確認 + GPU device capability 詳細: docs/reference/python-313/specifications.md FR-02-04/05 + DR-001 * feat(training): enable TF32 + adopt bf16-mixed as Template default (DR-007/008) Issue #527 / M4 Phase 4: 新 GPU (Ada 6000 / RTX 5090) 学習最適化を実装。 DR-007 (TF32 default ON) + DR-008 (bf16-mixed Template default 化) + V100 言及の整理 + DR-006 (resume 非サポート) 周知。 src/python/piper_train/__main__.py (DR-007): - main() 内 torch.backends.cudnn.benchmark = True の隣に 2 行追加: * torch.backends.cuda.matmul.allow_tf32 = True * torch.backends.cudnn.allow_tf32 = True - Ampere+ (sm_80+) で TF32 Tensor Core を活用、 matmul/conv ~1.3-1.5x - sm_75 (T4) 以下では noop (warning なし) CLAUDE.md (DR-008 + V100 整理): - Template A/B の --precision 32-true → --precision bf16-mixed - Template A/B から --no-wavlm を削除 (Ada/Blackwell では WavLM 有効が canonical) - WavLM Discriminator 注記: V100 → T4 (VRAM 16GB) で `--no-wavlm` 推奨 - トラブルシューティング表: 「学習速度が遅い (V100)」 を Ada/Blackwell + T4 の 2 行に再構成、 ゾンビ GPU プロセス確認は独立行に - "Precision の選び方" セクション新規追加 (bf16-mixed canonical、 16-mixed legacy、 32-true 数値再現性最優先、 DR-006 resume 非サポート明記) docs/guides/training/training-guide.md: - WavLM Discriminator 注記: V100 → T4 / Ada / Blackwell - precision 警告 ×2: V100 想定 → DR-008 後の bf16-mixed canonical 説明 - 6 言語モデル VRAM 別 batch_size: V100 16GB → Ada 48GB / RTX5090 32GB / T4 16GB / 旧 V100 16GB の table 拡張 - Multilingual pretraining template: --precision 32-true + --batch-size 20 → --precision bf16-mixed + --batch-size 32、 --no-wavlm 削除 - Single-speaker FT template: 同様 (batch_size 4 → 8) - Key parameters table を新 GPU 想定に再構成 - "--no-wavlm recommended on V100" → T4 + Ada/Blackwell 別注記 docs/guides/training/wavlm-guide.md: - precision 警告: V100 想定 → DR-008 後の bf16-mixed canonical 説明 受入基準 (M4 Exit Criteria、 merge 前必須、 CI で完結): - __main__.py に TF32 2 行追加 (Trainer 構築前、 main() 内) - CLAUDE.md Template A/B の --precision が bf16-mixed - V100 言及が新 GPU 前提に置換済 - training-template-drift pre-commit hook PASS - python-tests.yml matrix 3.13 ジョブ green post-merge verification (DR-009、 実機準備完了後): - Ada 6000 で TF32 enabled 確認 + from scratch 1 epoch smoke - RTX 5090 で sm_120 起動 + 同 smoke - TF32 ON/OFF deterministic 100 step 比較 - bf16-mixed で audio_parity Tier 4 (SNR ≥ 30dB) PASS 詳細: docs/reference/python-313/specifications.md FR-08/09 + DR-007/008 * chore(release): prep v1.13.0 release (CHANGELOG + migration guide) Issue #527 / M5 Phase: v1.13.0 release 準備。 M1-M4 の成果を release として公開するための CHANGELOG + Migration guide + VERSION bump。 VERSION: - 1.12.0 → 1.13.0 (DR-005 minor bump、 Docker 利用者向け breaking 明示) - src/python/pyproject.toml piper-train version も 1.13.0 に追従 CHANGELOG.md: - [1.13.0] - 2026-05-25 セクション新規追加 - ### Breaking: 7 entry、 すべて docs/migration/v1.12-to-v1.13.md の anchor link 付き (check_migration_xref.py が要求する xref を満たす) * Docker base image upgrade (12.6/22.04 → 12.8/24.04) * Python 3.13 default * PyTorch upgrade (2.2.1+cu121 → 2.11.0+cu128) * Checkpoint resume non-support (DR-006) * distroless image upgrade (debian12 → debian13) * TF32 default ON (DR-007) * bf16-mixed Template default (DR-008) - ### Added / Changed / Fixed セクションも記載 docs/migration/v1.12-to-v1.13.md (新規): - 7 つの breaking change を H2 アンカー付きで個別解説: * docker-base-image-upgrade (host driver R570+ 要件 + fallback) * python-313-default (PyPI 3.11/3.12 サポート維持の明示) * pytorch-upgrade (cu128 wheel、 RTX 5090 必須条件) * checkpoint-resume-non-support (v1.12 image 継続利用案内) * distroless-image-upgrade (内部パス書換指示) * tf32-default-on (deterministic 用途の opt-out 方法) * bf16-mixed-template-default (V100/T4/Ada/Blackwell 別の対処) - docs/reference/python-313/ への xref を冒頭で明示 docs/migration/README.md: - 「利用可能な migration guide」 セクション新規追加で v1.11→v1.12 と v1.12→v1.13 を列挙 uv.lock: - 前 commit の floor 統一 (chore(deps): unify library floor pins) が requires-dist specifier に反映、 wheel 選択は不変 merge 前必須: - migration-guide-lint workflow PASS (CHANGELOG Breaking xref 全件) - python-tests.yml matrix green (3.11/3.12/3.13 × 3 OS) - version-consistency.yml で VERSION = 1.13.0 整合確認 post-merge: - M5 Entry Criteria (実機 smoke 完了) を満たした上で release tag 打鍵 - 必要に応じて v1.13.0rc1 pre-release → fix → GA (DR-009) * fix: address CI failures from PR #537 initial run CI feedback で発覚した 4 種の修正: 1. Docker python-inference build error (Ubuntu 24.04 + Python 3.13): - `pip install --upgrade pip` で「Cannot uninstall pip 24.0, RECORD file not found」 が発生 (debian apt-installed pip の既知問題) - `--ignore-installed` を追加して既存 pip metadata 無視で upgrade - 影響: build-python-inference / test-python-inference / scan (python-inference) / e2e-docker-server / build-python-train / test-python-train が pass する想定 2. markdownlint format drift (75 errors): - docs/migration/v1.12-to-v1.13.md と docs/reference/python-313/*.md で MD031 (blanks-around-fences) + MD032 (blanks-around-lists) + MD040 (fenced-code-language) を npx markdownlint-cli2-fix で自動修復 - MD040 (7 箇所、 auto-fix 対象外) は ASCII art / sample 用に `text` / `markdown` 言語タグを手動付与 3. audit snapshot drift: - tests/fixtures/doc_examples_audit/audit.json を再生成 (新規 docs による code-block 集計 451 blocks の更新を反映) 4. uv.lock の piper-train version 反映: - 1.12.0 → 1.13.0 (M5 で bump した src/python/pyproject.toml と整合) 残存する非 fix な fail (CI flake、 rerun で解消見込): - pre-commit run --all-files (shellcheck_py wheel build の network flake) - cpp-tests / C++ Debug (googletest download HTTP 502) * fix(docker): handle Ubuntu 24.04 UID 1000 conflict with ubuntu user Issue #527 / PR #537 2nd CI run feedback で発覚した Docker build failure の修正。 Ubuntu 24.04 (Noble) は既存 ubuntu user (UID 1000) を提供する ため、 既存仕様の `useradd -m -u 1000 piper` が UID 衝突で fail する (`useradd: UID 1000 is not unique`)。 修正: - docker/python-train/Dockerfile (line 152 想定) - docker/python-inference/Dockerfile (line 93 想定) 両方とも非 root user 作成 step の直前に `userdel -r ubuntu` を追加: ```dockerfile RUN userdel -r ubuntu 2>/dev/null || true && \ useradd -m -u 1000 piper && \ chown -R piper:piper ... ``` 理由: - piper UID 1000 を維持することで既存 dataset volume の permission 互換性を保つ (Issue #527 で UID を変えると 3rd party の bind mount が壊れる) - `|| true` で Ubuntu 22.04 以前 (ubuntu user 不在) の rollback でも 動作するように冪等化 影響を受けていた CI jobs (今回の修正で pass する想定): - build-python-train / build-python-inference - test-python-train / test-python-inference - scan (python-inference) - e2e-docker-server - ci-required (上記の meta gate) * ci(workflows): bump residual python-version hardcodes from 3.12 to 3.13 10 エージェント並列レビューで検出した CI workflow の 3.12 hardcode 残骸を 除去。 setup-python / setup-uv の `python-version` が単発指定で 3.12 に 固定されており、 Issue #527 の 3.13 default 化と不整合だった。 Affected: bundle-size-gate / codespell / fuzz-smoke / memory-regression / multi-runtime-rtf / mutation-testing / kotlin-g2p-ci / rtf-regression / ci.yml (piper-plus-python check) / rust-tests.yml (cargo check / wasm / clippy / wasm-bindgen の 4 箇所) Refs #527 * docs: address 8-agent doc audit findings for v1.13.0 release 8 エージェント並列レビューで検出した documentation の整合性問題を一括修正。 修正内容: - docs/migration/README.md (line 39-40): 書式例 URL を実存する v1.12-to-v1.13.md の anchor (#docker-base-image-upgrade / #tf32-default-on) に変更 - docs/reference/python-313/open-questions.md (line 230): docs/migration への 相対 path を `../../migration/v1.12-to-v1.13.md` に修正 (docs/ prefix 残骸) - docs/README.md: Migration セクションに v1.12 → v1.13 link 追加 - docs/reference/python-313/{milestones,specifications}.md: 最終更新を 2026-05-25 に統一 (open-questions.md の OQ 全決定日と整合) - docs/features/webui.md: Python 3.11+ → Python 3.13+ recommended (3.11+ supported) に統一 (README.md / CONTRIBUTING.md と整合) - CONTRIBUTING_MODELS.md: Template B コマンド例を bf16-mixed + WavLM canonical に更新、 V100 legacy fallback を別注記、 パラメータガイド表を Ada/RTX 5090 primary に書換 (DR-007/008 反映) - docs/spec/wave3-deferred-proposals.toml (t18_devcontainer): proposal 内の Python 3.11 を 3.13 に更新 (Issue #527 統一) Refs #527 * docs(ci): address 10-agent strict review HIGH findings for Issue #527 10 エージェント並列レビュー (再実施) で検出した 5 系統の HIGH 指摘を一括修正。 修正内容: - src/python/piper_train/VERSION: 1.12.0 → 1.13.0 (pyproject.toml と整合、 Agent 10 の version drift 指摘) - docs/spec/wave3-deferred-proposals.toml:1383: CUDA 12.1 → 12.8 (DR-002 整合、 Agent 8 指摘) - .github/workflows/*.yml (15 file / 16 occurrences): runs-on: ubuntu-22.04 → ubuntu-24.04 (DR-003 統一、 Agent 2 指摘) - .github/workflows/build-phonemize-wheels.yml:188: test_other_platforms matrix を ['3.11'] → ['3.11', '3.12', '3.13'] に拡張 (Agent 9 指摘、 test_windows と build_wheels は cibuildwheel 経路依存のため 3.11/3.12 維持) - docs/migration/v1.12-to-v1.13.md: DR-005 (Affected packages 表) + DR-009 (Post-merge verification checklist) の 2 新規 H2 セクション追加 (Agent 5 指摘) scope outside と判定したもの (誤判定 or 別 PR で対応): - Cargo / C# / WASM の version bump: 各ランタイム independent versioning のため M5 で個別判断 (Agent 10 の誤判定) - actions/setup-python v5.6.0 → v6.2.0 (12 file): action-pin-gate baseline 済 - ruff target-version py311 維持: floor >=3.11 維持で技術的問題なし - cpp-dev Dockerfile Python 3.12: training scope 外 Refs #527 * docs: address 2nd 10-agent review HIGH findings for Issue #527 2 回目の 10 エージェント深掘りレビューで検出した真の HIGH 2 件を修正 (他 FAIL 判定は誤判定 or Issue #527 スコープ外と実証ベースで確定)。 修正内容: - docs/guides/training.md (line 16, 30): training quick-start の --precision 16-mixed → bf16-mixed (DR-008 Template default 反映)。 T4 (16-mixed) / V100 (32-true) fallback 注記を追加 - docs/spec/release-versions.toml (line 66-67): [python] expected_prefix を 1.12. → 1.13. に bump (VERSION 1.13.0 と整合。 他言語 prefix は rust 0.4 / C# 0.3 / WASM 0.6 / iOS 1.13 / Android 1.0 で設定済み、 python のみ bump 漏れだった) 誤判定と確定 (実証ベース、修正不要): - classifier 3.12/3.13 欠落: python_run:43-45 と piper_phonemize_bundled:27-29 に 3 version 全て存在 - ruff 6 箇所同期 NG: 全 0.15.12 一致、 ci.yml は ruff 非実行 - build-phonemize 3.13 install fail: env marker python_version < '3.13' で 3.13 除外済み - ruff/mypy target py311: floor >=3.11 維持が canonical (NFR-01) Issue #527 スコープ外 (別 PR 推奨): - setup-uv sliding major tag 8 件 (Python 3.13 移行非起因の既存 drift) - ubuntu-latest 40 workflow (latest=24.04 解決のため実害なし) Refs #527 * ci(workflows): unify actions/setup-python to v6.2.0 (15 files) setup-python の version 混在を解消。 v5.6.0 (19 occ) と v6.0.0 (1 occ) を 全て v6.2.0 に統一し、 リポジトリ全 74 occurrences を単一 version pin に揃える。 対象 (15 file / 20 occurrences): - v5.6.0 → v6.2.0: action-pin-gate, action-sha-drift, cli-help-docs-sync, cli-help-extract (2), dictionary-consistency, inference-input-contract, kotlin-g2p-ci, migration-changelog-parity, ort-version-sync, pua-consistency (3), rekor-verify, ruff-version-sync, wyoming-smoke, zh-en-loanword-sync (3) - v6.0.0 → v6.2.0: python-doctest 設計判断: - full version pin (vX.Y.Z) の混在は action-pin-gate の対象外 (gate は sliding-major-tag @vn のみ検出)。 baseline file (scripts/action_pins_baseline.txt) は grandfathered sliding-tag 専用で setup-python entry を持たないため更新不要 - @v6.2.0 への統一は vX.Y.Z pin 方針に準拠 Refs #527 * ci(workflows): pin astral-sh/setup-uv@v6 sliding tag to v6.8.0 (4 files) setup-uv の sliding major tag @v6 (8 occ / 4 file) を full SemVer pin @v6.8.0 に統一。 action-pin-gate (check_action_pins.py) の sliding-major violation を解消する。 対象 (4 file / 8 occ): - g2p-cross-platform-ci (1), g2p-python-ci (5), pua-consistency (1), release-model-config (1) 統一後: setup-uv は 14×v6.8.0 + 1×v8.1.0、 sliding @v6 は 0 件。 gate ローカル実行で exit 0 (386 uses: 3 SHA / 356 SemVer / 0 sliding) を確認。 設計判断: - sliding @v6 は「v6 系最新」意図のため既存 full pin @v6.8.0 に統一 (major を v8 へ上げると breaking risk、 conservative 選択) - v8.1.0 (pre-commit.yml の 1 件) は既に full pin のため変更せず - 残る 10 'other' ref (rust-toolchain@stable / pypi-publish@release/v1) は gate が許容する慣用 pin (WARN のみ、 violation でない) のため対象外 Refs #527 * chore(release): bump release version to v2.0.0 (was planned v1.13.0) Issue #527 を Zero-Shot TTS (PR #222) と統合した major リリースとして publish するため計画版 v1.13.0 を v2.0.0 へ変更し、VERSION / piper-train pyproject / CHANGELOG / migration guide / release-versions.toml + python-313 設計文書 (DR-005 を major bump へ改訂) を整合。Swift/iOS は独立版で 1.13.0 据置。 * chore(release): update promote_changelog.py CLI examples to 2.0.0 計画版 v1.13.0 を飛ばし v2.0.0 が次期リリースとなるため、docstring と --help の例示バージョンを 2.0.0 に統一。 * chore(release): update release-skill CLI examples to 2.0.0 prepare-release / release-prep skill の使用例バージョンを 2.0.0 に統一 (計画版 v1.13.0 を飛ばし v2.0.0 が次期リリースのため)。 * ci(phonemize): drop py3.13 from existing-PyPI test matrix piper-phonemize は python<3.13 (root pyproject の条件依存と整合) で PyPI に 3.13 配布が無く、 Issue #527 で追加された 3.13 leg が install 失敗していた。 Test Windows wheels job (3.11/3.12) と整合させ 3.13 を除外。 * fix(ssml): clamp prosody rate to finite positive (fuzz_ssml panic) parse_rate の <= 0.0 ガードは NaN (比較が常に false) と f32 overflow (rate=1e40 -> inf, rate=0% -> 100/0 = inf) を取りこぼし、非有限 rate の segment を生成して cargo-fuzz (fuzz_ssml) invariant 3 で panic していた。 最終 f32 値が finite かつ positive か検証し、該当時は 1.0 に fallback。回帰 test 追加。 * chore(deps): complete DR-002 floor-pin unification (python_run / uvicorn / dev fastapi) Issue #527 / DR-002 の 17-library floor 統一が root と src/python のみに 適用され、 spec (specifications.md:702,726) が in-scope と明示する src/python_run/pyproject.toml と uvicorn 目標 floor が取りこぼされていた ため補完する。 - src/python_run: fastapi>=0.110->0.136.1 / uvicorn[standard]>=0.27->0.46.0 / pytest>=7.0->9.0.3,<10 (PyPI 配布の <1 cap は保守ポリシーとして維持) - root + src/python: uvicorn>=0.27->0.46.0 (spec 目標値、 fastapi と同期) - root dev-dependencies: fastapi>=0.135.1->0.136.1 (inference extras と一致) uv.lock は specifier floor の記録のみ更新、 解決バージョンは不変 (fastapi 0.136.1 / uvicorn 0.46.0 / pytest 9.0.3 で既に解決済み、 no-op)。 `uv lock --check` PASS。 * docs(release): sync v2.0.0 across README banners, docker/README, open-questions v2.0.0 major リリースの周知を front-page と設計ドキュメントに反映する。 - README × 8: breaking banner を v1.12.0 -> v2.0.0 に更新 (CUDA 12.8 + host driver R570+ 必須 / torch 2.11+cu128 で torch 2.2 製 ckpt resume 非対応 / TF32+bf16-mixed default、 docs/migration/v1.12-to-v2.0.md へ誘導)。 各言語の既存ローカライズ表記スタイルを踏襲、 readme-breaking-sync gate は v2.0.0 7/7 PASS。 - docker/README.md: Python 推論 / 学習行の base image 表記を実 Dockerfile (12.8.1-cudnn-{runtime,devel}-ubuntu24.04) に整合 (12.6.3/ubuntu22.04 の 古い表記を修正)。 - open-questions.md: OQ-05 / OQ-07 の status 表と本文に決定マーカーを補完 し、 末尾の「全 14 件決定済」総括と整合。 * fix(ci): align pre-commit cache namespace to py3.13 setup-python was bumped to 3.13 but the .venv / pre-commit-env cache keys (and restore-keys) still used the py3.11 namespace. A .venv materialised on the old 3.11 runs could be restored into the 3.13 job; because requires-python is ">=3.11", uv would not recreate it, so the `uv run --no-sync` sync-gate hooks could silently run against the old interpreter. Rename all five cache/restore keys to py3.13. Addresses Copilot review on PR #537. * docs(release): resolve v2.0 doc inconsistencies from PR #537 review Six self-contradictions / factual errors flagged in Copilot review: - requirements.md NFR-02 / K-05: claimed existing ckpt resume / FT works, contradicting DR-006 (torch 2.2 ckpts intentionally unsupported for v2.0 resume) and the same file's own B-C1. Reworded to match the canonical specifications.md NFR-02 (DR-006 applied): new training + torch-2.11 base FT only; old ckpt resume out of scope. - v1.12-to-v2.0.md smoke checklist: T4 row used --precision bf16-mixed, contradicting the same guide's T4 section (sm_75 has no native BF16 → 16-mixed). Build-verification rows said webui/wyoming use the CUDA base 'same as above'; both Dockerfiles are CPU-only python:3.13.13-slim-trixie. Corrected to actual FROM images and split python-train (devel) row. - README_EN.md: 'Requires Python 3.13+ (recommended; 3.11+ supported)' was self-contradictory; requires-python is still >=3.11. Reworded to the 'recommended' framing already used by the other 7 translations. - CHANGELOG.md + build-phonemize-wheels release notes: claimed 3.13 wheel coverage, but the matrix is 3.11/3.12 only (piper-phonemize gated <3.13). * ci(phonemize): drop py3.12 from existing-PyPI test matrix The existing published piper-phonemize (1.0.0 / 1.1.0) only ships cp311 wheels; pip install on 3.12 fails with 'No matching distribution found' (from versions: none), so the 'Test existing PyPI package' job's 3.12 leg has been red since before this branch's doc changes. Same rationale as 85d6a5b dropping 3.13 (upstream wheel unavailability). Narrow the matrix to ['3.11']. Independent of the doc/floor changes in this PR. * chore: regenerate uv.lock + doc-examples audit snapshot after dev rebase dev (post-v1.13.0) と PR #537 の rebase で uv.lock / audit.json をいずれも HEAD (--ours) で解決していたため、 v2.0.0 への migration guide リネーム (v1.12-to-v1.13.md → v1.12-to-v2.0.md) や floor pin の更新が反映されていなかった。 両 fixture を再生成して整合化。 * fix(deps): cap onnxruntime-gpu <1.26 + regen doc-examples audit (Issue #527 follow-up) PR #537 (Python 3.13 + CUDA 12.8 unify) を dev full CI matrix で exercise した際に判明した hidden debt 解消: 1. onnxruntime-gpu 1.26+ は libcudart.so.13 (CUDA 13 runtime) を要求するが DR-001 base image は CUDA 12.8.1 → ABI 不整合で python-inference image の build-time smoke test (`import onnxruntime`) が ImportError で失敗。 v2 base CI は Docker build を exercise していなかったため未検出。 修正: pyproject.toml の [inference-gpu] / requirements_gpu.txt floor を >=1.20.1,<1.26 で cap (CUDA 12 era ORT)。 CPU onnxruntime は cudart 非依存のため >=1.26.0 維持。 CUDA 13 base bump は follow-up Issue へ。 2. PR #537 が追加した docs block (migration v1.12-to-v2.0.md ほか) が dev の doc-examples audit snapshot (gate #521 で導入) に未反映 → drift 検出。 tests/fixtures/doc_examples_audit/audit.json を再生成 (collected 484 blocks: bash=208 / python=31 / rust=12 / csharp=6 / go=5 / wasm=11)。 uv.lock も onnxruntime-gpu 1.26.0 → 1.25.1 に追随。 * ci: force workflow dispatch for f8c9db3 webhook delivery delay observed (5 retries / 2.5 min, no runs dispatched). Empty commit triggers fresh push event. * fix(doc-examples): cross-platform stable sort in walk_docs `sorted(repo_root.glob(pattern))` は Path の native 比較で Windows と Linux で 順序が異なる可能性がある (区切り文字 / backslash vs forward-slash の bytes 比較が違う)。 Windows ローカルで regen した audit.json は Linux CI の audit と order drift し、 同じ 484 blocks でも snapshot mismatch で fail。 key=lambda p: p.as_posix() で OS 非依存の文字列順に固定し、 audit.json を 両 platform で再現可能にする。 同手法は ZH-EN loanword mirror sync 等で 既に確立 (forward-slash 比較が canonical)。 audit.json も再生成して反映。 * fix(deps): bump protobufjs to 7.6.4 in openjtalk-web (GHSA-f38q-mgvj-vph7 / GHSA-wcpc-wj8m-hjx6) dev base の最終 security-audit (2026-06-15) 以降に 2 件の protobufjs 脆弱性が 公開され、 任意の subsequent PR で npm audit gate が fail するようになった: - GHSA-f38q-mgvj-vph7 (moderate, schema property shadowing, <=7.6.2 vulnerable) - GHSA-wcpc-wj8m-hjx6 (high, DoS via Any expansion, <=7.6.0 vulnerable) PR #569 由来ではないが、 本 PR の CI を green にするために bump を含める。 package.json の range (^7.2.4) は変更不要、 package-lock.json のみ 7.5.8 → 7.6.4。 npm audit fix 自動適用、 net -9 行 (lockfile-size gate impact 最小)。
Summary
docker/python-inference/の distroless 化を derisk する trial PR。 既存Dockerfile.cpuとdocker-compose.yml/deploy-huggingface.yml(HF Space deploy 経路) は 不変更で残し、 並行Dockerfile.cpu.distrolessを新設して build / size / smoke test を CI で実証する scope。 promotion (canonical 置換) は別 PR。Dockerfile.cpu.distroless新設 + 新規 CI workflow + smoke testDockerfile.cpu/docker-compose.yml/deploy-huggingface.ymlは不変更)cgr.dev/chainguard/python:latest(Wolfi-based、 shell / package manager なし)Affected Components
Type
Risk Level
Contract Impact
変更内容
docker/python-inference/Dockerfile.cpu.distroless)python:3.13-slim-trixieで C 拡張 build + dep install + NLTK data download、 final =cgr.dev/chainguard/python:latestで site-packages + uvicorn + shared libs を COPY)。 ENTRYPOINT はpython /app/inference.pyで既存と同等python-inference-distroless-trial.yml)Dockerfile.cpuを baseline として build、 distroless trial を build、 image size を比較、 import smoke test 2 種 (ONNX Runtime / piper_train / FastAPI / uvicorn / soundfile = libsndfile dlopen 確認) 実行、 PR コメントに sticky report 投稿 (python-inference-distroless-trialheader)/usr/lib/*-linux-gnu/lib{sndfile,gomp,FLAC,vorbis,vorbisenc,ogg,opus,mpg123}.so*を final の/usr/lib/に COPY (Wolfi の ld.so default search path)/usr/local/lib/python3.13/site-packagesを final にコピー、PYTHONPATH=/usr/local/lib/python3.13/site-packagesで chainguard/python 内蔵 Python に site-packages を見せるHEALTHCHECK CMD ["python", "-c", "import urllib.request; ..."]で stdlib のみで HTTP probeCMD curl ...は distroless で必ず fail設計判断
並行 file 戦略 (Dockerfile.cpu は不変更で残す)
3 つの選択肢があった:
Dockerfile.cpuを直接置換 — diff 最小だが roll back に full revert 必要、 HF Space deploy が trial PR 内で staging 失敗すると prod 影響Dockerfile.cpu.distroless並行追加 (採用) — 既存 deployment 経路ゼロ影響、 trial 中に問題があれば PR revert のみ、 promotion は別 PR で staging 検証後Dockerfile.cpu内 multi-stage で base 切替を build arg 化 — 1 file で両対応できるが build script の分岐が複雑化、 CI matrix の組み合わせ爆発採用案 2 は memory
feedback_conservative_changes(小さく保守的優先) に一致。 promotion PR は本 trial で「build 成立 + size 削減効果」 確認後の判断。chainguard/python:latest (Wolfi-based) を採用
3 候補を比較:
cgr.dev/chainguard/python:latest(採用): Wolfi 系で minimal、 Python 同梱、 CVE 低い、 公式 SLSA L2 attestation 付きgcr.io/distroless/python3-debian12: Google maintainer だが Python 3.11 固定 (3.13 にできない)、 base が Debian で size やや大cgr.dev/chainguard/wolfi-base+apk add python-3.13: shell + apk で柔軟だが size 大、 distroless の旨味が薄いchainguard/python:latest は ticket original 推奨と一致 (FR-1.2)。
Python version は 3.13 で統一
既存
Dockerfile.cpuは 3.11、 chainguard/python:latest は 3.13 を tracking。 site-packages の Python ABI 互換性のため builder も 3.13 (python:3.13-slim-trixie) で統一。 piper_train / onnxruntime / FastAPI などは 3.13 で動作確認済み (本 repo の Python CI matrix が既に 3.13 含む)。linux/amd64 single-arch CI build
arm64 cross-build は emulator 経由で CI 時間が +10-20 分、 trial の効果検証には不要なため次 PR で buildx に移行。 production 影響は なし (本 trial は HF Space deploy path に出ない)。
CVE 比較 (Trivy) は trial scope に含めない
理由: trial の目的は「build 成立 + size 削減効果の実証」 で、 CVE 数値の保証は canonical 置換 PR 側で実施するのが筋。 trial で CVE 数値を出すと「promotion 不要なほど良い」 と誤解される可能性があるため、 promotion PR の verification step として分離。
HF Space staging deploy は user 手動 step
Claude Code は HF token + space repository への push 権限を持たないため CI 自動化不可。 promotion PR の Test Plan に
huggingface-cli upload+ cold start latency 測定の手順を user 手動 step として記載する設計 (本 trial PR ではこの step を含めない、 promotion PR でのみ)。Test Plan の HF Space step は未着手と明示
該当 ticket (
docs/tickets/tickets/T-012-distroless-python-inference.md) の header Status を「着手中 (trial PR scope)」 に更新、 HF Space 検証は promotion PR の前提として記録。 user に対しても「trial merge は HF deploy への影響なし」 を明示。Test Plan
自動 (CI で run 想定)
actionlint .github/workflows/python-inference-distroless-trial.yml→ exit 0uv run python scripts/check_artifact_retention.py→retention-days: 30(regression-baseline) が許容値域内、 全 step passpython-inference-distroless-trialjob が SUCCESS、 sticky comment に build size 比較 + smoke 結果が投稿されるReviewer 用 manual verification
python-inference-distroless-trialheader) を view、 canonical (Dockerfile.cpu) と distroless trial の image size 比較 + delta % が表示されるdocker/python-inference/Dockerfile.cpuが 不変更 であることを diff で確認 (既存 deployment path への影響ゼロ)docker/python-inference/docker-compose.ymlが 不変更、.github/workflows/deploy-huggingface.ymlも 不変更 であることを diff で確認Not in scope (promotion PR で実施)
/v1/audio/speechE2E (ONNX model fixture が CI に必要):cpu-distroless並行配信、 user 判断)docker-compose.ymlの service 切替 /Dockerfile.cpu置換Checklist
Related Issues
なし