alexwengg's picture
Upload 221 files
654eeea verified
|
Raw
History Blame Contribute Delete
3.61 kB
# 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`