Exécuter des LLM à l'aide de LiteRT-LM

LiteRT-LM est une bibliothèque multiplate-forme conçue pour exécuter efficacement des pipelines de modèles de langage sur une large gamme d'appareils, des téléphones mobiles aux systèmes embarqués. Il fournit aux développeurs les outils nécessaires pour créer et déployer des workflows de modèles de langage sophistiqués, désormais avec une intégration NPU fluide.

Exécuter des LLM sur CPU et GPU

Consultez le dépôt GitHub LiteRT-LM pour obtenir des instructions détaillées sur le développement multiplate-forme et l'accélération matérielle CPU/GPU.

Exécuter des LLM sur le NPU

Les NPU (Neural Processing Units) sont des blocs matériels spécialisés optimisés pour les charges de travail de deep learning. Elles sont de plus en plus disponibles dans les systèmes sur puce (SoC) modernes, en particulier sur les appareils mobiles. Leur nature très performante les rend particulièrement adaptés à l'exécution de l'inférence LLM.

Fournisseurs de NPU

LiteRT-LM permet d'exécuter des LLM à l'aide de l'accélération NPU avec les fournisseurs suivants. Choisissez les instructions en fonction du fournisseur que vous souhaitez essayer :

Démarrage rapide

Pour commencer, suivez les instructions de la section Conditions préalables pour configurer l'environnement et le dépôt.

De plus, pour pouvoir interagir avec votre appareil Android, assurez-vous d'avoir correctement installé Android Debug Bridge et d'avoir un appareil connecté accessible à l'aide de adb.

Pour obtenir des instructions plus détaillées, consultez la section Quick Start (Démarrage rapide) du dépôt LiteRT-LM et découvrez-en plus sur la démonstration de la ligne de commande litert_lm_main.

Qualcomm AI Engine Direct

Pour exécuter les LLM sur le NPU Qualcomm, procédez comme suit :

Étape 1 : Téléchargez le modèle .litertlm. Le runtime LiteRT-LM est conçu pour fonctionner avec les modèles au format .litertlm. Vous trouverez et pourrez télécharger les modèles compatibles dans le tableau ci-dessous.

Modèle SoC (System on Chip) Quantification Taille du contexte Taille du modèle (Mo) Télécharger le lien
Gemma3-1B SM8750 4 bits par canal 1 280 658 télécharger
Gemma3-1B SM8650 4 bits par canal 1 280 658 télécharger
Gemma3-1B SM8550 4 bits par canal 1 280 657 télécharger

Vous devrez télécharger le modèle qui correspond à votre SoC. Vous trouverez ci-dessous un exemple de commande qui peut vous aider à obtenir le lien Hugging Face permettant de télécharger le modèle adapté au SoC de votre téléphone (notez que vous devrez vous connecter et confirmer le formulaire pour obtenir l'autorisation de télécharger le fichier). Assurez-vous qu'un appareil connecté est accessible à l'aide de adb.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

Vérifiez que $SOC_MODEL figure dans le tableau de compatibilité. Le lien généré ne fonctionnera pas pour les modèles non compatibles. Nous ajoutons régulièrement la prise en charge de NPU. Revenez donc plus tard pour voir si votre appareil est compatible.

Étape 2 : Téléchargez et extrayez les bibliothèques QAIRT Pour exécuter le modèle à l'aide de la NPU Qualcomm, des bibliothèques d'exécution associées sont requises sur l'appareil. Vous pouvez télécharger le SDK QAIRT à partir de ce lien et extraire le fichier. Définissez la variable QAIRT_ROOT (que vous utiliserez lors des étapes ultérieures) pour qu'elle pointe vers le dossier décompressé contenant le numéro de version. Par exemple :

unzip <your_file.zip> -d ~/

QAIRT_ROOT=~/qairt/2.42.0.251225

Étape 3 : Créez le runtime / les bibliothèques LiteRT-LM

Développer sous Linux

Pour pouvoir compiler le binaire pour Android, vous devez installer NDK r28b ou une version ultérieure à partir de https://developer.android.com/ndk/downloads#stable-downloads. Voici les étapes à suivre :

  • Téléchargez le fichier zip depuis https://developer.android.com/ndk/downloads#stable-downloads.
  • Extrayez le fichier zip à l'emplacement de votre choix (par exemple, /path/to/AndroidNDK/).
  • Faites en sorte que ANDROID_NDK_HOME pointe vers le répertoire NDK. Le résultat devrait ressembler à ceci :
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

Conseil : Assurez-vous que votre ANDROID_NDK_HOME pointe vers le répertoire contenant README.md.

Une fois la configuration effectuée, essayez de créer le binaire litert_lm_main :

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

De plus, nous devons créer la bibliothèque d'API d'envoi pour que l'environnement d'exécution LiteRT-LM puisse interagir avec l'unité de traitement neuronal (NPU) :

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

Développer sous macOS

Les outils de ligne de commande Xcode incluent clang. Exécutez xcode-select --install si ce n'est pas déjà fait.

Pour pouvoir compiler le binaire pour Android, vous devez installer NDK r28b ou une version ultérieure à partir de https://developer.android.com/ndk/downloads#stable-downloads. Voici les étapes à suivre :

  • Téléchargez le fichier .dmg depuis https://developer.android.com/ndk/downloads#stable-downloads.
  • Ouvrez le fichier .dmg et déplacez le fichier AndroidNDK* vers l'emplacement de votre choix (par exemple, /path/to/AndroidNDK/).
  • Faites en sorte que ANDROID_NDK_HOME pointe vers le répertoire NDK. Le résultat devrait ressembler à ceci :
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

Conseil : Assurez-vous que votre ANDROID_NDK_HOME pointe vers le répertoire contenant README.md.

Une fois la configuration effectuée, essayez de créer le binaire litert_lm_main :

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

De plus, nous devons créer la bibliothèque d'API d'envoi pour que l'environnement d'exécution LiteRT-LM puisse interagir avec l'unité de traitement neuronal (NPU) :

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

Étape 4 : Exécuter le modèle sur l'appareil Une fois le binaire créé, nous pouvons essayer d'exécuter le modèle sur l'appareil. Assurez-vous d'avoir accès en écriture à DEVICE_FOLDER :

Pour exécuter le fichier binaire sur votre appareil Android, nous devons transférer quelques composants/binaires. Commencez par définir votre DEVICE_FOLDER et assurez-vous d'y avoir accès en écriture (vous pouvez généralement placer des éléments sous /data/local/tmp/) :

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

Déployez le fichier .litertlm. Conseil : Vous n'avez besoin d'envoyer ces composants qu'une seule fois.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

Transférez les bibliothèques QAIRT. Vous les trouverez dans le dossier décompressé à l'étape 2 $QAIRT_ROOT/lib/aarch64-android/. Notez que QAIRT_ROOT doit contenir le numéro de version, par exemple 2.42.0.251225.

adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp*Stub.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnSystem.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtpPrepare.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/hexagon-*/unsigned/libQnnHtp*Skel.so $DEVICE_FOLDER

Transférez l'API Dispatch et le fichier binaire principal compilés à l'étape 3.

adb push bazel-bin/external/litert/litert/vendors/qualcomm/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

Vous pouvez maintenant exécuter le binaire.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER ADSP_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm

MediaTek NeuroPilot

Voici les étapes à suivre pour exécuter les LLM sur le NPU MediaTek :

Étape 1 : Téléchargez le modèle .litertlm. Le runtime LiteRT-LM est conçu pour fonctionner avec les modèles au format .litertlm. Vous trouverez et pourrez télécharger les modèles compatibles dans le tableau ci-dessous.

Modèle SoC (System on Chip) Quantification Taille du contexte Taille du modèle (Mo) Télécharger le lien
Gemma3-1B MT6989 4 bits par canal 1 280 985 télécharger
Gemma3-1B MT6991 4 bits par canal 1 280 986 télécharger

Vous devrez télécharger le modèle qui correspond à votre SoC. Vous trouverez ci-dessous un exemple de commande qui peut vous aider à obtenir le lien Hugging Face permettant de télécharger le modèle adapté au SoC de votre téléphone (notez que vous devrez vous connecter et confirmer le formulaire pour obtenir l'autorisation de télécharger le fichier). Assurez-vous qu'un appareil connecté est accessible à l'aide de adb.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

Vérifiez que $SOC_MODEL figure dans le tableau de compatibilité. Le lien généré ne fonctionnera pas pour les modèles non compatibles. Nous ajoutons régulièrement la prise en charge de NPU. Revenez donc plus tard pour voir si votre appareil est compatible.

Étape 2 : Créez le runtime / les bibliothèques LiteRT-LM

Développer sous Linux

Pour pouvoir compiler le binaire pour Android, vous devez installer NDK r28b ou une version ultérieure à partir de https://developer.android.com/ndk/downloads#stable-downloads. Voici les étapes à suivre :

  • Téléchargez le fichier zip depuis https://developer.android.com/ndk/downloads#stable-downloads.
  • Extrayez le fichier zip à l'emplacement de votre choix (par exemple, /path/to/AndroidNDK/).
  • Faites en sorte que ANDROID_NDK_HOME pointe vers le répertoire NDK. Le résultat devrait ressembler à ceci :
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

Conseil : Assurez-vous que votre ANDROID_NDK_HOME pointe vers le répertoire contenant README.md.

Une fois la configuration effectuée, essayez de créer le binaire litert_lm_main :

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

De plus, nous devons créer la bibliothèque d'API d'envoi pour que l'environnement d'exécution LiteRT-LM puisse interagir avec l'unité de traitement neuronal (NPU) :

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

Développer sous macOS

Les outils de ligne de commande Xcode incluent clang. Exécutez xcode-select --install si ce n'est pas déjà fait.

Pour pouvoir compiler le binaire pour Android, vous devez installer NDK r28b ou une version ultérieure à partir de https://developer.android.com/ndk/downloads#stable-downloads. Voici les étapes à suivre :

  • Téléchargez le fichier .dmg depuis https://developer.android.com/ndk/downloads#stable-downloads.
  • Ouvrez le fichier .dmg et déplacez le fichier AndroidNDK* vers l'emplacement de votre choix (par exemple, /path/to/AndroidNDK/).
  • Faites en sorte que ANDROID_NDK_HOME pointe vers le répertoire NDK. Le résultat devrait ressembler à ceci :
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

Conseil : Assurez-vous que votre ANDROID_NDK_HOME pointe vers le répertoire contenant README.md.

Une fois la configuration effectuée, essayez de créer le binaire litert_lm_main :

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

De plus, nous devons créer la bibliothèque d'API d'envoi pour que l'environnement d'exécution LiteRT-LM puisse interagir avec l'unité de traitement neuronal (NPU) :

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

Étape 3 : Exécuter le modèle sur l'appareil Une fois le binaire créé, nous pouvons essayer d'exécuter le modèle sur l'appareil. Assurez-vous d'avoir accès en écriture à DEVICE_FOLDER :

Pour exécuter le fichier binaire sur votre appareil Android, nous devons transférer quelques composants/binaires. Commencez par définir votre DEVICE_FOLDER et assurez-vous d'y avoir accès en écriture (vous pouvez généralement placer des éléments sous /data/local/tmp/) :

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

Déployez le fichier .litertlm. Conseil : Vous n'avez besoin d'envoyer ces composants qu'une seule fois.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

Transférez l'API Dispatch et le fichier binaire principal compilés à l'étape 2.

adb push bazel-bin/external/litert/litert/vendors/mediatek/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

Vous pouvez maintenant exécuter le binaire.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm