Issue with Optimizing Stable Diffusion XL Model for iOS 18

Hi everyone,

I’m currently in the process of converting and optimizing the Stable Diffusion XL model for iOS 18. I followed the steps from the WWDC 2024 session on model optimization, specifically the one titled "Bring your machine learning and AI models to Apple Silicon."

I utilized the Stable Diffusion XL model and the tools available in the ml-stable-diffusion GitHub repository and ran the following script to convert the model into an .mlpackage:

python3 -m python_coreml_stable_diffusion.torch2coreml \
    --convert-unet \
    --convert-vae-decoder \
    --convert-text-encoder \
    --xl-version \
    --model-version stabilityai/stable-diffusion-xl-base-1.0 \
    --bundle-resources-for-swift-cli \
    --refiner-version stabilityai/stable-diffusion-xl-refiner-1.0 \
    --attention-implementation SPLIT_EINSUM \
    -o ../PotraitModel/ \
    --custom-vae-version madebyollin/sdxl-vae-fp16-fix \
    --latent-h 128 \
    --latent-w 96 \
    --chunk-unet

The model conversion worked without any issues. However, when I proceeded to optimize the model in a Jupyter notebook, following the same process shown in the WWDC session, I encountered an error during the post-training quantization step. Here’s the code I used for that:

op_config = cto_coreml.0pPalettizerConfig(
    nbits=4,
    mode="kmeans",
    granularity="per_grouped_channel",
    group_size=16,
)

config = cto_coreml.OptimizationConfig(op_config)
compressed_model = cto_coreml.palettize_weights(mlmodel, config)

Unfortunately, I received the following error:

AssertionError: The IOS16 only supports per-tensor LUT, but got more than one lut on 0th axis. LUT shape: (80, 1, 1, 1, 16, 1)

It appears that the minimum deployment target of the MLModel is set to iOS 16, which might be causing compatibility issues. How can I update the minimum deployment target to iOS 18? If anyone has encountered this issue or knows a workaround, I would greatly appreciate your guidance!

Thanks in advance for any help!

This is because the conversion is set by default from iOS 16/macOS13 here. You need to either set it to ct.target.macOS15 or ct.target.iOS18.

Issue with Optimizing Stable Diffusion XL Model for iOS 18
 
 
Q