AutoDroid Studio β Stable Diffusion bundles for Snapdragon NPUs
Stable Diffusion compiled ahead of time for the Qualcomm Hexagon NPU, in the format AutoDroid Studio loads directly. Generation runs entirely on the phone.
These are not general-purpose checkpoints. Each is a set of QAIRT context binaries compiled for one Hexagon version at one fixed resolution, plus two small CPU graphs and a tokenizer. They are useful only to an app that speaks this format.
Bundles
| File | Model | Style | Resolution | Hexagon | Size |
|---|---|---|---|---|---|
sd15-512_v68.zip |
Stable Diffusion 1.5 | baseline | 512Γ512 | v68 and newer | 1.15 GB |
absolute-reality-1.81_v68.zip |
AbsoluteReality 1.81 | photoreal | 512Γ512 | v68 and newer | 1.15 GB |
dreamshaper-8_v68.zip |
DreamShaper 8 | general purpose | 512Γ512 | v68 and newer | 1.15 GB |
openjourney_v68.zip |
Openjourney | stylised | 512Γ512 | v68 and newer | 1.15 GB |
Openjourney needs its trigger token mdjrny-v4 style at the start of the prompt; without it you get
plain SD 1.5.
Precision: w8a16: 8-bit weights (per-channel) and 16-bit activations. That is what makes the output look like the checkpoint. Classifier-free guidance multiplies the difference between the conditional and unconditional predictions by 7.5, and that difference is only a few percent of the prediction, so any larger error drowns the prompt. Measured against the float UNet, this build is within 0.85% of it. An 8-bit-activation build of the same checkpoint was 8.3% out and produced noisy, over-saturated images. The price is time: about 50 s for 20 steps at 512Γ512 on an 8 Gen 1, against 17 s for w8a8.
Every bundle here was loaded and used to generate on real hardware, an 8 Gen 1 (Hexagon v69), before being published, and its UNet was checked against the float model on that phone. The v68 binaries are what a Snapdragon 888 loads; this w8a16 build has not itself been run on an 888 yet (the earlier w8a8 build was).
v68 and newer means Snapdragon 888 (SM8350) onward. A context binary runs forwards but never backwards, so a v68 build works on 8 Gen 1/2/3 and Elite as well; it simply does not use their newer instructions.
What is inside
bundle.json the manifest: resolution, layout, licence, which graph is which
unet.bin QAIRT context binary, NHWC, w8a16 β Hexagon NPU
vae_decoder.bin QAIRT context binary β Hexagon NPU
vae_encoder.bin QAIRT context binary (enables img2img) β Hexagon NPU
text_encoder.tflite CLIP, fp16 β CPU
time_embed.tflite timestep embedding, fp16 β CPU
tokenizer/ vocab.json + merges.txt (standard CLIP BPE)
Two graphs stay on the CPU deliberately. Quantised to 8 bits, CLIP collapses into a constant function β every prompt produces the same image, with nothing raised anywhere. The timestep embedding multiplies its input by frequencies spanning four orders of magnitude before the sin/cos, which no per-tensor scale covers. Both are cheap: they run once or twice per image, against twenty to forty NPU steps.
Licence
The code that runs these is one question; the weights are another.
Every bundle here is a derivative of a Stable Diffusion 1.5 checkpoint, and each of those is licensed CreativeML Open RAIL-M β base SD 1.5, AbsoluteReality 1.81, DreamShaper 8 and Openjourney alike. Each carries its upstream checkpoint's licence, not this repository's; follow the links in the table above for the originals.
That licence permits commercial use, and it comes with conditions that travel with the weights:
- You must pass the licence on. Anyone who receives these files, or a derivative of them, must receive the same use restrictions.
- The Attachment A use restrictions apply, and they are not optional. In summary, the model may not be used to break the law, to exploit or harm minors, to generate or disseminate verifiably false information with intent to harm, to generate personal identifiable information with intent to harm, to defame or harass, for fully automated legal/medical/credit decisions about individuals, to discriminate against individuals or groups protected by law, or to exploit the vulnerabilities of a specific group. Read Attachment A in full β the summary is not the licence.
- The licence disclaims warranty. These are quantised approximations of the original weights and are lower fidelity than the source checkpoint.
The QAIRT compiler that produced the context binaries is Qualcomm's; the tooling that drives it, the sampler, the tokenizer and the runtime are AutoDroid Studio's own and carry that project's licence. Nothing here derives from a non-commercially-licensed runtime.
Building your own
The toolchain is in the app's repository under tools/sd/, and docs/sd_bundles.md documents it,
including which checkpoints are suitable and which are not. In short:
B=~/my-bundle
python tools/sd/fetch_qairt_host.py 2.32.0.250228 # the compiler, ~230 MB
tools/sd/build_sd_bundle.sh --release --export \
--model <hf repo id> --licence "<its licence>" --out $B --resolution 512 --keep-onnx
python tools/sd/make_calibration.py --model <hf repo id> --out $B
tools/sd/build_sd_bundle.sh --release --compile --out $B --soc sm8350 --keep-onnx \
--qairt ~/qairt/2.32.0.250228
tools/sd/make_text_encoder_tflite.sh --out $B --graph time_embed
tools/sd/make_text_encoder_tflite.sh --out $B --graph text_encoder
python tools/sd/package_bundle.py --out $B --name my-bundle --arch v68
Only compile checkpoints whose terms permit it, and record the actual licence with --licence: it
is written into bundle.json and shown to the user in the app.