macunaima/Qwen3-0.6B-SM8650-LiteRT-LM-AOT-Dynamic-INT8-Full
Qwen3-0.6B — SM8650 LiteRT-LM (AOT, dynamic INT8, full model)
Qwen/Qwen3-0.6B exportado e compilado AOT (ahead-of-time) para o SoC Qualcomm SM8650 (Snapdragon 8 Gen 3), empacotado como bundle .litertlm para o runtime LiteRT-LM.
Este é o build mais simples possível: modelo completo, uma única chamada de CLI, sem nenhuma flag de particionamento de grafo (--split_cache, --externalize_embedder, prefill/cache customizados não foram usados).
Quantização: `dynamic_wi8_afp32` — pesos INT8 dinâmicos, ativações FP32. Nenhuma flag-qfoi passada na CLI, mas essa é a receita default doexport-hfnesta versão dolitert-torch: obuild.log(no repo) linha 52 mostraquantization_recipe : 'dynamic_wi8_afp32', e a quantização rodou de fato — grafo principal 2.22 GiB → 581.41 MiB e embedder 593.50 MiB → 151.86 MiB (3.9x cada). Este não é um build float, apesar de "simples": quem quiser o baseline em precisão cheia precisa desligar a receita default explicitamente (não testado aqui).
Arquivo
O .sha256.json no repo carrega a mesma procedência em forma legível por máquina.
Como foi gerado
uv venv --python 3.12 .venv && source .venv/bin/activate
uv pip install litert-torch ai-edge-litert ai-edge-litert-sdk-qualcomm
litert-torch export-hf Qwen/Qwen3-0.6B ./out \
--aot_backend=qualcomm \
--aot_soc_model=SM8650 \
--bundle_litert_lm=TrueUma chamada faz tudo: baixa o checkpoint do Hub, converte para LiteRT, chama o compilador AOT da Qualcomm (QNN/HTP) e empacota o .litertlm (prefill/decode + embedder + auxiliary + tokenizer + metadata).
Toolchain: litert-torch 0.9.4, ai-edge-litert 2.2.0, ai-edge-litert-sdk-qualcomm 2.2.0, ai-edge-quantizer 0.9.0, torch 2.13.0, transformers 5.17.0, Python 3.12 (Linux x86_64 — o compilador AOT da Qualcomm não tem build para macOS/arm64).
Note que a ausência de -q na linha de comando não significa float: o default aplicado foi dynamic_wi8_afp32.
Tempo total: 3m02s em 16 cores de CPU, dos quais 1m49s no estágio AOT Compilation → apply_plugin. Script completo (build.sh) e log integral (build.log) estão no repo.
Uso
adb push qwen3-0.6B-sm8650-aot-dynamic-int8.litertlm /data/local/tmp/
adb shell /data/local/tmp/litert_lm_main \
--model_path=/data/local/tmp/qwen3-0.6B-sm8650-aot-dynamic-int8.litertlm \
--backend=npu \
--input_prompt="Explique o que é um transformador de distribuição."Binários litert_lm_main e instruções de build do runtime: veja o repositório LiteRT-LM.
Verificações e limitações
- Estágio AOT confirmado no log:
Compiling Qualcomm_SM8650: apply_plugin 100%. - Quantização confirmada no log: receita
dynamic_wi8_afp32, com 3.9x de redução tanto no grafo principal quanto no embedder. - Container inspecionado: magic
LITERTLM, 3 subgrafos TFL3 (model / embedder / auxiliary), com bytecode HTP paraSM8650embutido. - Não validado em device. Compilar para o SoC não garante compatibilidade com toda firmware/versão de runtime desse SoC — valide com
litert_lm_mainvia adb no aparelho alvo antes de usar. - Sem benchmark e sem avaliação de qualidade. Nenhuma medida de tokens/s, latência de prefill, uso de memória ou perplexidade foi feita.
- O caminho de compilação AOT usado aqui é o legado (compila cada submodelo antes do empacotamento); o log emite deprecation warning apontando para
--use_litert_lm_compiler=True.
Variantes relacionadas
O repo -Dynamic-INT8 acima é um build anterior; não verifiquei quais flags de export foram usadas nele, então não afirmo aqui como os dois se comparam além do que está documentado neste card (grafo completo, sem flags de particionamento).
Licença
Pesos derivados de Qwen/Qwen3-0.6B — Apache 2.0, a mesma do modelo base.
