| # iter3-bench (Swift) |
|
|
| Self-contained Swift CLI that loads each iteration_3 `.mlmodelc` with |
| the placement recommended by `_STAGE_COMPUTE` in |
| `coreml/inference.py`, runs four warm predictions per stage on |
| synthesised inputs (shape resolved from each model's own description), |
| and reports load + warm latency. |
| |
| ## Build & run |
| |
| ```bash |
| # 1. Compile mlpackages (one-time) |
| DST=../compiled |
| SRC=../packages |
| mkdir -p "$DST" |
| for pkg in "$SRC"/*.mlpackage; do |
| xcrun coremlcompiler compile "$pkg" "$DST" |
| done |
| |
| # 2. Build & run the Swift bench |
| swift build -c release |
| .build/release/iter3-bench --compiled ../compiled |
| ``` |
| |
| ## Sample output (M-series Mac) |
| |
| ``` |
| [text_encoder | CPU_ONLY ] load=33ms warm: min=1.1 avg=1.2 max=1.5 ms |
| [bert | ALL ] load=607ms warm: min=6.6 avg=8.8 max=12.7 ms |
| [ref_encoder | CPU_AND_GPU] load=236ms warm: min=11.1 avg=12.1 max=14.0 ms |
| [fused_diffusion_sampler | ALL ] load=1394ms warm: min=14.2 avg=16.9 max=23.9 ms |
| [duration_predictor | CPU_ONLY ] load=123ms warm: min=2.4 avg=2.5 max=2.7 ms |
| [fused_f0n_har_source | CPU_ONLY ] load=189ms warm: min=10.7 avg=10.9 max=11.2 ms |
| [decoder_pre | CPU_AND_NE ] load=1461ms warm: min=3.8 avg=3.9 max=4.0 ms |
| [decoder_upsample | CPU_ONLY ] load=1022ms warm: min=278.0 avg=304.2 max=375.8 ms |
| ``` |
| |
| Pipeline-stage sum ≈ 360 ms (synthetic inputs). |
| |
| ## Scope |
| |
| `iter3-bench` is a **scaffolding** sanity check — it proves all 8 |
| mlmodelc stages load and predict in Swift with the documented |
| placement, and gives a baseline for per-stage cost without leaving |
| Swift. It does **not** produce audio (synthetic random inputs). |
| |
| ## `iter3-tts` (side-loaded audio) |
| |
| A second target wires the same 8 stages into a real-audio path by |
| side-loading the Python eager glue (phonemizer, ref-mel extraction, |
| alignment matmul + asr-shift, s/ref split) as on-disk fixtures. |
| |
| ```bash |
| # 1. Dump every stage's input + output as .npy fixtures |
| cd .. # styletts2 root |
| uv run python iteration_3/swift/dump_intermediates.py \ |
| --text "StyleTTS 2 is a text to speech model." \ |
| --reference reference_audio/696_92939_000016_000006.wav |
| |
| # 2. Run the Swift consumer |
| cd iteration_3/swift |
| swift build -c release |
| .build/release/iter3-tts \ |
| --compiled ../compiled \ |
| --fixtures fixtures \ |
| --output fixtures_swift.wav |
| ``` |
| |
| Sample output (warm): |
|
|
| ``` |
| [text_encoder | CPU_ONLY ] load=37ms predict=3.0ms |
| [bert | ALL ] load=160ms predict=137.5ms |
| [ref_encoder | CPU_AND_GPU] load=39ms predict=66.8ms |
| [fused_diffusion_sampler | ALL ] load=71ms predict=149.8ms |
| [duration_predictor | CPU_ONLY ] load=16ms predict=3.9ms |
| [fused_f0n_har_source | CPU_ONLY ] load=20ms predict=14.7ms |
| [decoder_pre | CPU_AND_NE ] load=41ms predict=6.1ms |
| [decoder_upsample | CPU_ONLY ] load=70ms predict=289.4ms |
| Pipeline total: 1148ms |
| Wrote fixtures_swift.wav (3.67s @ 24000 Hz) |
| ``` |
|
|
| Parity vs `fixtures_python.wav`: cosine similarity 1.000000, |
| max|Δ| ≈ 3×10⁻⁵ (within int16 PCM quantization). |
|
|
| To extend to a fully-Swift end-to-end pipeline, port the eager glue |
| to Swift: |
|
|
| * phoneme tokenisation (espeak + TextCleaner) |
| * reference-audio mel extraction (for `ref_encoder.mel`) |
| * alignment matmul `d_en @ pred_aln_trg` and asr-shift to build the |
| predictor input `en` for `fused_f0n_har_source` |
| * `s`/`ref` split off `fused_diffusion_sampler.var_6189` |
|
|