{ "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" ] }