llama.kt
llama.cpp pour Android, en bibliothèque Kotlin. CPU, Vulkan et OpenCL dans une seule bibliothèque native. CPU et Vulkan sont validés sur un Mali-G68. OpenCL est intégré mais pas encore testé sur du matériel Adreno. Apache 2.0.
Ce qu'il fait
- Charge n'importe quel GGUFLit l'en-tête en quelques millisecondes (quantification, taille, contexte) avant le chargement complet.
- StreamingLes tokens arrivent en Flow Kotlin, sûrs en UTF-8, arrêt sur EOS ou à une limite fixe.
- Templates de chat du modèleLe template vient du GGUF lui-même : tout modèle instruct fonctionne tel quel.
- Sessions de cache KVLes relances réutilisent l'historique en cache. Les sessions se sauvegardent et se restaurent entre deux démarrages.
- Raisonnement séparéLes réponses arrivent découpées en réponse et raisonnement par le parseur de llama.cpp pour ce template. Au mieux, prévoir un repli.
git submodule add https://github.com/tensai-app/llama.kt libs/llama.ktgit -C libs/llama.kt submodule update --init --recursive# vendors the llama.cpp sources, required before the first buildbash libs/llama.kt/scripts/bootstrap.sh// settings.gradle.ktsinclude(":llama-kt")project(":llama-kt").projectDir = file("libs/llama.kt/llama-kt") // app/build.gradle.ktsdependencies { implementation(project(":llama-kt"))}import com.tensai.llamakt.* val engine = LlamaEngine()engine.load(path = "/path/to/model.gguf", nGpuLayers = 0, nCtx = 4096) val messages = listOf(ChatMessage("user", "Who are you?"))engine.chat(messages).collect { token -> print(token) } // streams, stops on EOS engine.free()L'AAR n'est pas encore publié. Le submodule git est la voie supportée pour l'instant. Maven Central pourrait suivre.
Mesures
OPPO CPH2251 · Dimensity 900 (2× A78 à 2,4 GHz + 6× A55 à 2,0 GHz, Mali-G68 MC4, LPDDR4X) · Android 13 · nCtx 4096 · temp 0 · prompt d'environ 20 tokens · CPU = 2 threads sur les gros cœurs · llama.cpp b9769 · tok/s
| Modèle | Quant | Backend | pp | tg |
|---|---|---|---|---|
| Qwen2.5-0.5B-Instruct | Q4_K_M | CPU(backend le plus rapide) | 29,5 | 15,0 |
| Vulkan | 7,0 | 9,0 | ||
| Gemma-3-1B-it | Q4_K_M | CPU(backend le plus rapide) | 10,9 | 6,0 |
| Vulkan | 3,7 | 5,4 | ||
| Qwen3-1.7B | Q4_K_M | CPU(backend le plus rapide) | 8,6 | 5,9 |
| Vulkan | 2,1 | 4,2 | ||
| Llama-3.2-3B-Instruct | Q4_K_M | CPU(backend le plus rapide) | 6,0 | 3,9 |
| Vulkan | 1,2 | 2,9 | ||
| Phi-4-mini (3.8B) | Q4_K_M | CPU | 3,9 | 1,7 |
| Vulkan(backend le plus rapide) | 0,8 | 2,3 | ||
| Gemma-3n-E2B-it | Q4_K_M | CPU | 1,9 | 1,1 |
| Vulkan(backend le plus rapide) | 1,8 | 1,9 | ||
| Qwen2.5-7B-Instruct | Q4_K_M | CPU | 1,4 | 0,2 |
Une sélection des modèles mesurés, en tok/s. pp = traitement du prompt, tg = génération. Le point marque le backend le plus rapide pour chaque modèle. Le tableau complet, avec plus de modèles et de backends (Gemma 4 compris), est dans le README.
1,7 à 2,4 s contre ~48 s
Délai avant le premier token sur 4 tours dépendants, historique de 0 à 529 tokens, avec réutilisation du préfixe KV contre un re-prefill complet.
10,7 s à 82 ms
Délai avant le premier token après un kill du processus, prompt de 171 tokens, avec restauration d'une session sauvegardée.
Upstream
llama.cpp et llama.rn sont épinglés. Les correctifs remontent en amont quand c'est possible ; les autres vivent en patchs appliqués au bootstrap.
- Correctif Vulkan UMACEIL_DIV sans débordement dans ggml_vk_matmul pour les pilotes mobiles qui annoncent UINT32_MAX groupes de travail. Corrige l'arrêt des matmuls par lots au chargement.fusionné#25245
- 0002-abort-callback-mid-graph-cancelCallback d'abandon vérifié à chaque nœud du graphe : annuler un long prefill n'attend plus le lot entier.local
- 0003-vulkan-device-dispatcher-initCharge les pointeurs de fonctions Vulkan de niveau device après createDevice, et désactive buffer_device_address sur Mali quand il n'est pas exposé.local
- 0004-stale-embd-kv-invariantNe fait jamais confiance à des cellules KV non décodées : contrôle de position, garde de fenêtre SWA, troncature à l'abandon.local
- 0005-load-stage-callbackLes étapes de chargement (poids, contexte, warm-up) remontent par le callback de progression.local
- 0006-kv-reuse-past-divergenceGarde le cache KV jusqu'au point où un nouveau prompt diverge de celui en cache, au lieu de le jeter.local
- 0007-vulkan-submit-mflops-envRend la quantité de travail par soumission Vulkan réglable par variable d'environnement.local
- 0008-vulkan-queue-priorityFixe une priorité explicite sur la file de calcul Vulkan.local
- 0009-vulkan-matmul-splitDécoupe en option les gros matmuls Vulkan selon M en dispatches plus petits pour les pilotes mobiles.local