# MLX is not shipped for this model The MLX build was measured and rejected. The exporter in `export-scripts` is kept so the decision can be re-tested against a future ExecuTorch/MLX release, but no `.pte` or `config.json` is published here. ## Why: it is slower, and its output is not finite Measured on device (iPhone 16, ExecuTorch 1.4.1, 3 warmup runs + 15 timed runs, median, inputs allocated from each model's own schema and filled with 0.5). All four styles share one architecture and differ only in weights, so all four were run rather than measuring one and generalising: | style | Core ML fp16 | MLX fp16 | MLX penalty | MLX output | | --- | --- | --- | --- | --- | | candy | **193.4 ms** | 564.5 ms | 2.92x slower | non-finite | | mosaic | **194.7 ms** | 546.4 ms | 2.81x slower | non-finite | | rain princess | **193.3 ms** | 566.7 ms | 2.93x slower | non-finite | | udnie | **196.9 ms** | 574.7 ms | 2.92x slower | non-finite | The latency alone would be reason enough, but the output settles it. Every MLX build emitted NaN or Inf, while the Core ML build fed the identical input on the same device in the same run returned finite output in all four cases. This artifact does not merely run slowly, it produces garbage. Size is not an argument either. MLX fp16 is 3.48 MB against Core ML fp16 at 3.79 MB, a 0.3 MB difference on a model of this size. ## Root cause: op coverage The ExecuTorch MLX backend has no handler for three ops this architecture uses everywhere, so the graph shatters into **50 subgraphs**: | unsupported op | count | where it comes from | | --- | --- | --- | | `aten.flip` | 64 | the reflection pads | | `aten._native_batch_norm_legit.no_stats` | 15 | InstanceNorm | | `aten.upsample_bilinear2d` | 2 | the two upsampling stages | Note the specific batch-norm overload. The MLX backend does register `_native_batch_norm_legit_no_training`, but not the `no_stats` variant that InstanceNorm lowers to, and a style transfer network is InstanceNorm in every block. This is the same class of failure as the SDXS text-to-image model, which fragments into 28 subgraphs for want of `native_group_norm`, filed upstream as https://github.com/pytorch/executorch/issues/22017. ## Why style transfer is not a special case MLX runs on the Metal GPU; Core ML lowers to the ANE, which is purpose-built for this kind of network. MLX was measured behind Core ML on every convolutional vision model tested. Its real advantage is transformer workloads, where weight-only quantization shrinks the artifact substantially: CLIP vision is 97% `nn.Linear` and goes 351 MB to 98 MB. A style transfer network is pure convolution and lands on the wrong side of that line.