TokForge-SDXL-QNN-NPU / manifest.json
darkmaniac7's picture
vc405: manifest adds optional full SDXL VAE (vae_decoder_cpu.mnn) for the sharp/fastVae=off decode path
209bad2 verified
Raw
History Blame
8.11 kB
{
"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"
]
}