[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80040":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":14,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":27,"discoverSource":28},80040,"Irodori-TTS-Lite","kizuna-intelligence\u002FIrodori-TTS-Lite","kizuna-intelligence","Int4-quantized inference runtime for Faster-Irodori-TTS2 voice-design DiT. ~1GB VRAM end-to-end.",null,"Python",73,4,64,2,0,5,9,45.5,"Other",false,"main",true,[],"2026-06-12 04:01:26","# Irodori-TTS-Lite\n\nTTS DiT を 4-bit 量子化したまま推論する、軽量ランタイムです。\n\nオリジナルの FP32 チェックポイント（1.88 GB）を **279 MB のディスク容量** と、DiT 単体で **552 MB のピーク GPU メモリ** で動かせます。音質はほぼ劣化しません。\n\nさらにオプションの `--codec-int4` を付ければ **DACVAE コーデックも 4-bit** で動かせて、エンドツーエンド（DiT + コーデック + トークナイザ）でピーク **約 1 GB**（実測 988.7 MB）になります。\n\n---\n\n## 計測値（実機, RTX PRO 4000 Blackwell, 6 RF step, 単発推論）\n\n### ディスクサイズ\n\n| Mode | Safetensors |\n| --- | ---: |\n| FP32 | 1888 MB |\n| BF16 | 944 MB |\n| **INT4 (本リポジトリ)** | **279 MB** |\n\n### GPU メモリ — DiT モデルのみ（DACVAE コーデック・トークナイザ除く）\n\n| Mode | `max_memory_allocated` | `max_memory_reserved` |\n| --- | ---: | ---: |\n| FP32 | 1916.8 MB | 1992.0 MB |\n| FP16 | 978.7 MB | 1004.0 MB |\n| **INT4** | **552.3 MB** | **568.0 MB** |\n\n### GPU メモリ — エンドツーエンド推論（`infer.main()` 経由、DACVAE \u002F トークナイザ \u002F activation すべて含む）\n\n| Mode | `--codec-device cpu` | `--codec-device cuda` | `--codec-int4` (cuda) |\n| --- | ---: | ---: | ---: |\n| FP32 | （未計測） | 2867.7 MB | — |\n| BF16 | （未計測） | 1990.6 MB | — |\n| **INT4** | **988.7 MB** | 1512.6 MB | **988.7 MB** |\n\n> **DACVAE コーデックも 4-bit にする `--codec-int4` モードを追加しました。**\n> 重みを uint8-nibble pack のまま保持して forward の中で 1 レイヤずつ on-the-fly dequant するので、\n> Conv 重み 377 → 59 MB（▲ 84%）、エンドツーエンドのピークが **1513 → 989 MB**（▲ 525 MB）になります。\n> DiT と DACVAE が同時に走るわけではないので、両者を 4-bit にしても合計は単なる加算にはならず、\n> **VRAM 1 GB 弱**でフルパイプラインが回ります。\n>\n> DACVAE コーデックを GPU に置いて codec も int4 にすれば decode_latent は ~330 ms、\n> コーデック fp16 のままなら ~170 ms、CPU に逃がすと ~3.3 s。\n> レイテンシ要件が緩い環境では `--codec-device cpu` で更に 500 MB 節約できます。\n>\n> 再現は [`tools\u002Fmeasure_peak_memory.py`](tools\u002Fmeasure_peak_memory.py) で。\n\n### レイテンシ（参考）\n\n| Mode | sample_rf | decode_latent | total |\n| --- | ---: | ---: | ---: |\n| FP32 (codec=cuda) | 270 ms | 116 ms | 392 ms |\n| BF16 (codec=cuda) | 367 ms | 124 ms | 499 ms |\n| INT4 (codec=cuda, fp16) | 296 ms | 172 ms | 473 ms |\n| INT4 (codec=cuda, int4) | 292 ms | 333 ms | 629 ms |\n| INT4 (codec=cpu)        | 334 ms | 3316 ms | 3.66 s |\n\n---\n\n## Irodori-TTS-500M-v3 を INT4 化する\n\n[Aratako\u002FIrodori-TTS-500M-v3](https:\u002F\u002Fhuggingface.co\u002FAratako\u002FIrodori-TTS-500M-v3) も同じパイプラインで int4 化できます。量子化済みの重みは [`kizuna-intelligence\u002FIrodori-TTS-500M-v3-int4`](https:\u002F\u002Fhuggingface.co\u002Fkizuna-intelligence\u002FIrodori-TTS-500M-v3-int4) で公開しています。\n\n### サイズと音質（RTX PRO 4000 Blackwell, 6 RF step, ref = `mera3.wav`, CER は全段 **0.00%**）\n\n| 段階 | サイズ | OpenVoice-v2 sim |\n| --- | ---: | ---: |\n| DiT block のみ（GPTQ 実キャリブレーション） | 561 MB | 0.8718 |\n| + エンコーダ attention Linear（GPTQ 実 Hessian） | 511 MB | 0.8743 |\n| **+ text_embedding（RTN 4-bit + PackedEmbedding）** | **444 MB** | 0.8668（held-out 0.9075）|\n\n> FP32 baseline ≈ sim 0.886 \u002F CER 8.3%。音質は実質劣化なし。\n\n### レイテンシ \u002F VRAM（INT4 packed, 3 秒合成）\n\n| 指標 | 実測 |\n| --- | ---: |\n| median latency（3s 合成, 6 RF step） | **~336 ms** |\n| ピーク VRAM（DiT + DACVAE コーデック GPU 同居, after 3 synth） | ~1.14 GB |\n\n> VRAM は DACVAE コーデックを GPU に同居させた状態の実測です。`text_embedding`（97 MB fp16）は入力 ID の行だけを forward 内で on-the-fly dequant するので、テーブル全体を VRAM に展開しません。\n\n### v3 で押さえるべきポイント\n- **実アクティベーションでの GPTQ キャリブレーションが品質の最大レバー**。ランダム Gaussian calib だと CER ~33%、実 calib で 0% まで落ちます。\n- エンコーダ MLP（1996 次元）\u002F AdaLN \u002F duration_predictor \u002F cond_module は **fp16 のまま**。1996 次元が AutoGPTQ packing を壊し、blind RTN はエンコーダを破壊します。\n- `--actorder` は使いません（`.perm` テンソルを Lite のローダが拒否するため）。\n\n### duration predictor を持たないモデルへの graft\n\nv2\u002Fmoespeech のように duration predictor を持たない（`use_duration_predictor=False`）モデルには、`configure(duration_donor=\"\u003Cv3 ckpt path>\")` で v3 の学習済み predictor を移植できます（v2\u002Fv3 でエンコーダ次元が一致するため）。固定 `seconds` を強制すると発話が崩れて CER ~25% になりますが、移植した predictor に長さを決めさせると **CER 0%** になります。\n\n```python\nimport irodori_tts_lite\nirodori_tts_lite.configure(\n    use_fused=True, force_fp16=True,\n    pack_rtn_extras=True,                       # int4 packed extras を on-the-fly dequant\n    duration_donor=\"path\u002Fto\u002Fv3\u002Fmodel.safetensors\",\n)\nirodori_tts_lite.patch()\n```\n\n---\n\n## 特徴\n\n- **自己完結**: OneCompression を実行時依存に持ちません（量子化済みウェイト + ランタイムだけで動きます）。\n- **Triton 高速カーネル**: DiT block の Linear は `FusedInt4Linear`（GPTQ-v1 packed × cuBLAS 級カーネル）で実行。\n- **賢い eager-dequant**: AdaLN（ホットパス、起動オーバヘッドが支配的）と エンコーダ系（コールドパス、1 推論あたり 1 回呼び）はロード時に fp16 化して `nn.Linear` に差し替え。\n- **既存パイプラインに 1 行で割り込み**: `irodori_tts_lite.patch()` を呼ぶだけで、`irodori_tts.inference_runtime.InferenceRuntime.from_key` が 4-bit セーフテンソルを直接読めるようになります。\n\n---\n\n## クイックスタート\n\n### 1. インストール\n\n```bash\npip install git+https:\u002F\u002Fgithub.com\u002Fkizuna-intelligence\u002FIrodori-TTS-Lite.git\npip install pyopenjtalk            # run_tts.py でテキスト → 秒数の自動推定に使用\n\n# 上流 TTS パイプラインは別途インストールしてください（patch() で実行時にフックします）。\n```\n\n重みは初回実行時に [`kizuna-intelligence\u002FIrodori-TTS-Lite-int4`](https:\u002F\u002Fhuggingface.co\u002Fkizuna-intelligence\u002FIrodori-TTS-Lite-int4) から自動ダウンロードされます（HF キャッシュに保存）。\n\n### 2. 動かす\n\n```bash\n# --checkpoint を省略すると HF から自動ダウンロード\npython example\u002Frun_tts.py \\\n    --text \"こんにちは、メラだよ。テスト中なの！\" \\\n    --output-wav \u002Ftmp\u002Fsample.wav \\\n    --no-ref\n```\n\nローカルの safetensors を使いたい場合は `--checkpoint \u003Cpath>`、別 HF リポを指定したい場合は `--checkpoint hf:\u002F\u002F\u003Corg>\u002F\u003Crepo>\u002F\u003Cfile>` で渡せます。`--no-ref` は話者性を重みに焼き込んだチェックポイント用フラグ。\n\n### 3. メモリ消費を実測する\n\n```bash\n# フルパイプラインのピーク (DACVAE 含む)\npython tools\u002Fmeasure_peak_memory.py --mode int4 --no-ref --json\n\n# DACVAE を CPU に逃がして VRAM を最小化\npython tools\u002Fmeasure_peak_memory.py --mode int4 --no-ref --codec-device cpu --json\n\n# DACVAE もそのまま GPU で int4 化（VRAM 約 1 GB でフル推論）\npython tools\u002Fmeasure_peak_memory.py --mode int4 --no-ref --codec-int4 --json\n```\n\n未量子化との比較は `--mode bf16` \u002F `--mode fp32` に切り替え + 対応する未量子化 checkpoint を `--checkpoint` で渡してください。\n\n---\n\n## ライブラリとして組み込む\n\n`patch()` で既存の `irodori_tts.inference_runtime` にフックを差し込みます。あとは普段通り `infer.main()` を呼べば 4-bit ファイルがそのまま読み込まれます。\n\n```python\nimport irodori_tts_lite\n\nirodori_tts_lite.configure(use_fused=True, force_fp16=True)\nirodori_tts_lite.patch()\n\nimport infer\ninfer.main()\n```\n\n`configure()` で調整できる主なオプション:\n\n| 引数 | デフォルト | 説明 |\n| --- | --- | --- |\n| `use_fused` | `True` | DiT block の Linear を Triton カーネルで実行する |\n| `force_fp16` | `False` | モデル全体を fp16 に強制（カーネルのネイティブ dtype） |\n| `disable_eager` | `False` | AdaLN の eager-dequant を無効化（デバッグ用） |\n| `pack_rtn_extras` | `False` | RTN 4-bit の extras（エンコーダ \u002F text_embedding 等）を fp16 展開せず packed のまま on-the-fly dequant（VRAM 節約） |\n| `duration_donor` | `None` | duration predictor を持たないモデルに、指定した checkpoint の学習済み predictor を移植する |\n| `codec_int4` | `False` | DACVAE コーデックの NormConv1d \u002F NormConvTranspose1d を int4 packed に置き換える（VRAM ピーク ~525 MB 削減、decode は ~170→330 ms） |\n| `codec_int4_groupsize` | `32` | コーデック int4 量子化のグループサイズ |\n\n> ⚠️ 現状、`FusedInt4Linear` の fp32 入力フォールバックパスに既知の shape-check 制限があります。推論時は `force_fp16=True`（または `example\u002Frun_tts.py` のデフォルト）を推奨します。\n\n---\n\n## 仕組み\n\n量子化ウェイトは安全テンソルのメタデータ内に二系統で記録されています:\n\n| スコープ | 形式 | ロード時の置換先 |\n| --- | --- | --- |\n| DiT block の Linear（q\u002Fk\u002Fv\u002Fo、SwiGLU MLP の w1\u002Fw2\u002Fw3） | GPTQ uniform 4-bit, groupsize=32 | `FusedInt4Linear`（Triton カーネル） |\n| AdaLN projection | GPTQ 4-bit | eager-dequant → fp16 `nn.Linear` |\n| エンコーダ \u002F cond_module \u002F text_embedding \u002F RMSNorm 拡張 | RTN 4-bit, uint8-nibble pack | eager-dequant → fp16 module（型はターゲットに合わせる） |\n\nAdaLN を eager-dequant している理由は、12 個の小さな projection × 12 block × N RF step → 数千回の極小 Triton kernel launch になり、起動オーバヘッドが int4 速度メリットを食い潰してしまうため。エンコーダ系は逆に「呼び出し回数が少なく、サイズも小さい」ためカーネルを使う旨味がほぼ無いので fp16 にしてしまった方が単純です。\n\n詳細な設計判断は [`docs\u002Farchitecture.md`](docs\u002Farchitecture.md) を参照してください。\n\n---\n\n## ディレクトリ構成\n\n```\n.\n├── README.md                 # 本ファイル\n├── LICENSE                   # MIT\n├── pyproject.toml            # パッケージ定義\n├── irodori_tts_lite\u002F         # ランタイム本体（自己完結、外部依存は torch\u002Ftriton\u002Fsafetensors のみ）\n│   ├── __init__.py\n│   ├── checkpoint_loader.py  # inference_runtime へのモンキーパッチ\n│   ├── fused_int4_linear.py  # Triton カーネル（OneCompression からベンダリング）\n│   ├── quant_utils.py        # GPTQ-v1 unpack + RTN-extras dequant\n│   ├── packed_conv.py        # DACVAE 用 int4 packed Conv1d \u002F ConvTranspose1d\n│   └── weights.py            # HF からの自動ダウンロード\n├── example\u002F\n│   └── run_tts.py            # 単発合成サンプル\n├── tools\u002F\n│   ├── measure_peak_memory.py    # フルパイプラインのピーク VRAM 計測\n│   └── quantize_dacvae_poc.py    # DACVAE int4 PoC（ベースラインと SNR 比較）\n└── docs\u002F\n    └── architecture.md       # 内部設計\n```\n\n---\n\n## ハードウェア要件\n\n- CUDA 対応 GPU（compute capability 8.0 以上を推奨。Triton カーネルが Ampere 系チューニング）\n- VRAM:\n  - DiT 単体なら 1 GB あれば十分（実測ピーク 552 MB + CUDA コンテキスト分）\n  - DACVAE コーデックを GPU に置く場合は 2 GB 推奨（実測ピーク 1513 MB）\n\nCPU 推論は未対応です（DACVAE のみ CPU offload 可）。\n\n---\n\n## 開発\n\n```bash\npip install -e .[infer]\n```\n\nベンチや追加の動作確認用スクリプトは `tools\u002F` 配下に追加していく方針です。\n\n---\n\n## 上流\n\n- TTS パイプライン本体: [Aratako\u002FIrodori-TTS](https:\u002F\u002Fgithub.com\u002FAratako\u002FIrodori-TTS)\n- DACVAE コーデック: [Aratako\u002FSemantic-DACVAE-Japanese-32dim](https:\u002F\u002Fhuggingface.co\u002FAratako\u002FSemantic-DACVAE-Japanese-32dim)\n\nどちらも Aratako 氏の成果物を 4-bit 量子化して使わせていただいています。\n\n---\n\n## ライセンス\n\n[MIT License](LICENSE)\n\n`irodori_tts_lite\u002Ffused_int4_linear.py` は OneCompression プロジェクト（Fujitsu Ltd. 著作）からのベンダリングです。元のライセンス表記を保持しています。\n\n---\n\nCopyright © 2025-2026 Kizuna Intelligence contributors.\n（`irodori_tts_lite\u002Ffused_int4_linear.py` のみ Copyright © 2025-2026 Fujitsu Ltd.）\n","Irodori-TTS-Lite 是一个用于Faster-Irodori-TTS2语音设计的4位量化推理运行时，支持在约1GB显存下完成端到端处理。项目通过将原始FP32检查点压缩至279MB磁盘空间，并在DiT模型上仅需552MB峰值GPU内存即可运行，同时保持几乎无损的音质。此外，用户还可以选择使用`--codec-int4`选项以4位精度运行DACVAE编解码器，进一步降低整体内存占用至约1GB。该工具非常适合于资源受限但对音频生成质量有一定要求的应用场景，如移动设备或边缘计算环境中的文本转语音服务。","2026-06-11 03:59:00","CREATED_QUERY"]