vc405: manifest adds optional full SDXL VAE (vae_decoder_cpu.mnn) for the sharp/fastVae=off decode path
209bad2 verified | { | |
| "schema": "tokforge-sdxl-qnn-npu/manifest@1", | |
| "model": "sdxl-turbo", | |
| "variant": "fp16-encoders + TAESDXL", | |
| "license": "Stability AI Community License (SDXL-Turbo)", | |
| "license_note": "Commercial use permitted for orgs/individuals with < $1M USD annual revenue; above that requires a Stability AI Enterprise license. Attribution + license text must be retained with the model. NOT OpenRAIL (that was SD1.5).", | |
| "generated": "2026-06-05T00:00:00Z", | |
| "repo": "darkmaniac7/TokForge-SDXL-QNN-NPU (PRIVATE)", | |
| "notes": [ | |
| "App reads the device Hexagon arch (dsp_arch) and picks the matching set. SDXL ships ONE own-built set today: V75-native (ours).", | |
| "Forward-compat: a lower-arch bin runs on a higher-arch DSP. The V75-native SDXL set is forward-compat to V79/V81 silicon (verified on the V81 SM8850 handset, .82 + .80). NATIVE V81/V79 SDXL bins are NOT separately built yet.", | |
| "source=ours: our own clean-room SDXL-Turbo -> W8A16 -> QAIRT 2.40 conversion, drop-in for our libsdxl_qnn_driver (graph name 'model', host combined-emb input). There is no AI-Hub SDXL set in this repo.", | |
| "verified=true means run on real silicon and confirmed coherent+crisp. verified=false = produced + offline-validated but NEEDS a handset before NPU-enabling.", | |
| "VAE: \"Faster image decoding\" ON (default) = TAESDXL CPU tiny-VAE (taesdxl_decoder.mnn, 2.4 MB, fast ~6s, soft) via --vae_mnn / SDXL_VAE_BACKEND=cpu. OFF = full SDXL CPU VAE (vae_decoder_cpu.mnn, 99 MB, cos 1.0 vs torch, sharp ~40s on CPU), also via --vae_mnn (the driver loads either MNN VAE). The DSP VAE is blocked at 1024px on V75 (unsigned-PD HTP cap) and the OpenCL/Vulkan VAE SIGSEGVs Adreno in Session::resize, so BOTH VAEs are CPU MNN. The full VAE is OPTIONAL (optional_files) and downloaded WITH the bundle so it is present when the user turns Faster-decoding off; absence falls back to TAESDXL.", | |
| "On-device fresh download is ~4.3 GB (4,308,394,979 bytes): unet.bin 2.6 GB + text_encoder_2_fp16 1.4 GB + text_encoder_1_fp16 235 MB + sdxl_emb_mlp 29 MB + taesdxl 2.4 MB + tokenizers/config." | |
| ], | |
| "arch_to_socs": { | |
| "73": { | |
| "name": "Hexagon V73", | |
| "socs": [ | |
| "SM8550 (Snapdragon 8 Gen 2)", | |
| "SM8635 (8s Gen 3)", | |
| "SM7475 (7+ Gen 3)" | |
| ] | |
| }, | |
| "75": { | |
| "name": "Hexagon V75", | |
| "socs": [ | |
| "SM8650 (Snapdragon 8 Gen 3)", | |
| "SM7675 (7 Gen 4)" | |
| ] | |
| }, | |
| "79": { | |
| "name": "Hexagon V79", | |
| "socs": [ | |
| "SM8750 (Snapdragon 8 Elite)", | |
| "SM8750-AB (8 Elite for Galaxy)" | |
| ] | |
| }, | |
| "81": { | |
| "name": "Hexagon V81", | |
| "socs": [ | |
| "SM8850 (Snapdragon 8 Elite Gen 5)" | |
| ] | |
| } | |
| }, | |
| "io_contracts": { | |
| "ours-sdxl-emb": { | |
| "graph_name": "model", | |
| "unet_inputs": { | |
| "sample": "[1,4,128,128] UFIXED16 (NCHW, raw scheduler latent)", | |
| "emb": "[1,1280] UFIXED16 host combined-emb = time_embedding(time_proj(t)) + add_embedding(cat(pooled, add_time_proj(time_ids))); computed host-side via sdxl_emb_mlp.bin to fold-proof BOTH sinusoidal paths qairt-converter 2.40 would constant-fold", | |
| "text_embedding": "[1,77,2048] UFIXED16 = concat CLIP-L last_hidden[1,77,768] ++ bigG last_hidden[1,77,1280]" | |
| }, | |
| "unet_output": "output [1,4,128,128] UFIXED16", | |
| "text_encoder_1": "CLIP-L: in input_ids INT32 [1,77] -> out last_hidden [1,77,768] (penultimate, hidden -2)", | |
| "text_encoder_2": "OpenCLIP-bigG (+projection): in input_ids INT32 [1,77] -> out last_hidden [1,77,1280] + pooled [1,1280] (pooled feeds the host emb compute)", | |
| "vae": "TAESDXL CPU tiny-VAE (taesdxl_decoder.mnn), in latent [1,4,128,128] -> out [1,3,1024,1024]; CPU MNN path only (SDXL_VAE_BACKEND=cpu)", | |
| "scheduler": "EulerAncestralDiscrete, trailing spacing, epsilon prediction, 4 steps native, guidance_scale 0 (NO CFG -> ONE UNet pass per step)", | |
| "vae_scaling_factor": 0.13025, | |
| "resolution": 1024, | |
| "driver": "libsdxl_qnn_driver.so (#51 ImageGenerationSdxlNpuCliHelper); flags --text_encoder_1/--text_encoder_2/--unet/--vae_mnn/--emb_mlp/--vocab_1/--merges_1/--vocab_2/--merges_2/--backend/--system_library; env SDXL_VAE_BACKEND=cpu" | |
| } | |
| }, | |
| "sets": { | |
| "ours/v75": { | |
| "source": "ours", | |
| "dsp_arch": 75, | |
| "representative_soc": "SM8650 (Snapdragon 8 Gen 3)", | |
| "soc_model": 57, | |
| "qairt_runtime_required": "2.40", | |
| "skel": "libQnnHtpV75Skel.so", | |
| "io_contract": "ours-sdxl-emb", | |
| "verified": true, | |
| "verify_note": "Device-verified coherent+crisp on Lenovo SM8650/V75 (.69), EulerAncestral, 4-6 steps. Forward-compat verified: these exact V75-native bins also ran coherent+crisp on the RedMagic SM8850/V81 handset (.82) and a second V81 (.80). Native-V81/V79 SDXL bins NOT separately built; V75-native is the shipping set for V73->V81.", | |
| "files": { | |
| "unet.bin": { | |
| "path": "v75/unet.bin", | |
| "size": 2637398016, | |
| "md5": "d7be73631e7c2a57875517c9af09dbe8" | |
| }, | |
| "text_encoder_1_fp16.bin": { | |
| "path": "v75/text_encoder_1_fp16.bin", | |
| "size": 234770432, | |
| "md5": "4e9612177b6ec68a4c1ea992174cdff7" | |
| }, | |
| "text_encoder_2_fp16.bin": { | |
| "path": "v75/text_encoder_2_fp16.bin", | |
| "size": 1401405440, | |
| "md5": "3aa8a2ad01be2ba854f1a847ec16a9b8" | |
| }, | |
| "sdxl_emb_mlp.bin": { | |
| "path": "v75/sdxl_emb_mlp.bin", | |
| "size": 29184000, | |
| "md5": "0cf25084f04c78560d3e58cde177f28c" | |
| }, | |
| "taesdxl_decoder.mnn": { | |
| "path": "v75/taesdxl_decoder.mnn", | |
| "size": 2464388, | |
| "md5": "bfbfb43faa70fc3885bfef24a60b8882" | |
| }, | |
| "tokenizer/vocab.json": { | |
| "path": "v75/tokenizer/vocab.json", | |
| "size": 1059962, | |
| "md5": "a3933521163a0e76cee6094f1d72a9cc" | |
| }, | |
| "tokenizer/merges.txt": { | |
| "path": "v75/tokenizer/merges.txt", | |
| "size": 524619, | |
| "md5": "d2bc10797e70c920c14c69729ecdab34" | |
| }, | |
| "tokenizer/special_tokens_map.json": { | |
| "path": "v75/tokenizer/special_tokens_map.json", | |
| "size": 586, | |
| "md5": "f1c97d73dc836331f2138893217d32d8" | |
| }, | |
| "tokenizer/tokenizer_config.json": { | |
| "path": "v75/tokenizer/tokenizer_config.json", | |
| "size": 704, | |
| "md5": "b0e83247e6c27802b6f2ccce2615e402" | |
| }, | |
| "tokenizer_2/vocab.json": { | |
| "path": "v75/tokenizer_2/vocab.json", | |
| "size": 1059962, | |
| "md5": "a3933521163a0e76cee6094f1d72a9cc" | |
| }, | |
| "tokenizer_2/merges.txt": { | |
| "path": "v75/tokenizer_2/merges.txt", | |
| "size": 524619, | |
| "md5": "d2bc10797e70c920c14c69729ecdab34" | |
| }, | |
| "tokenizer_2/special_tokens_map.json": { | |
| "path": "v75/tokenizer_2/special_tokens_map.json", | |
| "size": 460, | |
| "md5": "1f2ba80c3ba1db3a1729f82f0c2667ce" | |
| }, | |
| "tokenizer_2/tokenizer_config.json": { | |
| "path": "v75/tokenizer_2/tokenizer_config.json", | |
| "size": 855, | |
| "md5": "7a07b6cea8034258f7a153860e81bc41" | |
| }, | |
| "config.json": { | |
| "path": "v75/config.json", | |
| "size": 936, | |
| "md5": "833a8f609063eee89c093754af978210" | |
| }, | |
| "vae_decoder_cpu.mnn": { | |
| "path": "v75/vae_decoder_cpu.mnn", | |
| "size": 99103692, | |
| "md5": "5c23735f51d7f9348c351d6224cac16e" | |
| } | |
| } | |
| } | |
| }, | |
| "driver_required_files": [ | |
| "unet.bin", | |
| "text_encoder_1_fp16.bin", | |
| "text_encoder_2_fp16.bin", | |
| "sdxl_emb_mlp.bin", | |
| "taesdxl_decoder.mnn", | |
| "tokenizer/vocab.json", | |
| "tokenizer/merges.txt", | |
| "tokenizer_2/vocab.json", | |
| "tokenizer_2/merges.txt" | |
| ], | |
| "install_marker_files": [ | |
| "unet.bin", | |
| "text_encoder_1_fp16.bin", | |
| "text_encoder_2_fp16.bin", | |
| "taesdxl_decoder.mnn" | |
| ], | |
| "bundle_dir_name": "SDXL-QNN-NPU", | |
| "model_id": "image-sdxl-qnn-npu", | |
| "total_bytes": 4407498671, | |
| "total_human": "4.41 GB (4.10 GiB) incl. optional full VAE", | |
| "optional_files": [ | |
| "vae_decoder_cpu.mnn" | |
| ] | |
| } |