litert-cli
LiteRT CLI tool to download, convert, quantize, run, benchmark, and visualize LiteRT models.
معلومات المصدر
- المستودع
- google-ai-edge/LiteRT-CLI
- آخر نشاط في المصدر
- ٢٩ سبتمبر ٢٠٢٦ في ٠٤:١٥
- لغة SKILL.md المكتشفة
- الإنجليزية
- النجوم
- ٤٣
- التفرعات
- ٨
خيارات التثبيت
يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.
مراجعة ملفات المصدر
اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.
عرض SKILL.md
SKILL.md
تعليمات المصدر · معاينة للقراءة فقط- name
- litert-cli
- description
- LiteRT CLI tool to download, convert, quantize, run, benchmark, and visualize LiteRT models.
# LiteRT-CLI Agent Skill
This skill allows the agent to download, convert, quantize, run, benchmark, and
visualize LiteRT models using the `litert` command on desktop, device, or Google
Cloud.
## Setup & Prerequisites (Agent Auto-Setup Guide)
Before running any `litert` commands, you must ensure a Python virtual
environment is active and the `litert-cli` package is correctly installed.
### Option 1: Install from Local Clone (Editable Mode)
Use this method if you are developing inside the cloned repository clone:
#### Using `uv` (Recommended - Super Fast)
```bash
# Create a venv with seed packages (critical for dynamic deps.py auto-installers)
uv venv --clear --python=3.13 --seed
source .venv/bin/activate
# Install local clone
uv pip install -e .
```
#### Using standard venv & pip
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install -e .
```
### Option 2: Install Standalone from PyPI (Nightly)
Use this method if you are installing the published package:
#### Using `uv`
```bash
uv venv --clear --python=3.13 --seed
source .venv/bin/activate
uv pip install litert-cli-nightly
```
#### Using standard venv & pip
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install litert-cli-nightly
```
> [!TIP]
>
> If you encounter package resolution or network errors with `uv`, set the
> standard PyPI index URL first: `export UV_INDEX_URL=https://pypi.org/simple`
## Core Commands
### 💡 The Model Reference (`model-ref`) System
To avoid handling complex and fragile absolute filesystem paths, the LiteRT CLI
uses a centralized **Model Reference (`model-ref`)** catalog.
When you download or import a model to the centralized cache, you can assign it
a reference alias (and optional sub-references):
* **Format**: `<alias_name>` or `<alias_name>:<sub_reference>` (e.g.,
`mobilenet`, `resnet18:gpu`, `efficientnet:int8`).
* **Default alias**: For HuggingFace downloads, if `--model-ref` is omitted,
the CLI automatically assigns a flattened repository ID (e.g.,
`litert-community__MobileNet-v3-large`) as the default alias.
Once a model is registered, **all CLI commands** (including `run`, `benchmark`,
`compile`, `delete`, `list`) accept this `<model_ref>` directly instead of a
file path! The CLI will automatically resolve it to the correct absolute cache
file path on the fly.
Here are some examples of using model references in action:
```bash
# Run inference using the central alias directly
litert run mobilenet --android --cpu
# Benchmark using a specific sub-reference GPU file
litert benchmark resnet18:gpu --android --gpu
# Compile for NPU directly using the reference alias
litert compile efficientnet --target sm8750
# Delete from the central cache
litert delete mobilenet
```
### 1. Download
Download public LiteRT models from HuggingFace Hub or a direct URL.
```bash
# Download public models using repo path
litert download repo_id_or_url --output ./models
# Download only .tflite files from HuggingFace
litert download litert-community/MobileNet-v3-large --file "*.tflite" --output ./models
# Download models with a custom model-ref alias
litert download litert-community/MobileNet-v3-large --model-ref my_model_ref
```
> [!NOTE]
>
> If `--output` is omitted during HuggingFace downloads, the model is downloaded
> to `~/.cache/litert-cli/models/` and cataloged automatically via
> `metadata.json` (associating it with the repo ID as the `model-ref`). If
> `--output` is provided, it is treated as a standalone folder and is **not**
> cataloged.
### 2. Convert (PyTorch to LiteRT)
Convert a PyTorch or HuggingFace model into a TFLite model.
```bash
# Automated HF model conversion
litert convert Qwen/Qwen1.5-0.5B-Chat --output /tmp/qwen
# Conversion with INT8 Weight-Only Quantization
litert convert Qwen/Qwen1.5-0.5B-Chat --quantize-recipe weight_only_wi8_afp32 --output /tmp/qwen_w8
# From a custom local PyTorch script
litert convert my_model.py --quantize-recipe dynamic_wi8_afp32 --output /tmp/mymodel
```
> [!NOTE]
>
> **Custom Python Script Interface (`my_model.py`):** To convert from a custom
> Python script, the file must expose functions to return the instantiated
> PyTorch model and generate sample inputs for tracer graph execution: *
> `--model-func`: Function name returning the model (`torch.nn.Module`).
> Default: `get_model`. * `--input-func`: Function name returning sample trace
> inputs (tuple/dict). Default: `get_args`.
**Minimal Script Example:**
```python
import torch
def get_model() -> torch.nn.Module: return MyPyTorchModel()
def get_args() -> tuple: return (torch.randn(1, 3, 224, 224),)
```
### 3. Quantize
Quantize a TFLite model using optimized recipes.
```bash
# Dynamic Range Quantization (dynamic_wi8_afp32) (Default)
litert quantize model.tflite --recipe dynamic_wi8_afp32 --output dynamic.tflite
# Weight-Only Quantization
litert quantize model.tflite --recipe weight_only_wi8_afp32 --output weight_only.tflite
# Static Range Quantization (requires calibration data)
litert quantize model.tflite --recipe static_wi8_ai8 --calibration-data calib_data.py --output static.tflite
# Custom JSON Recipe
litert quantize model.tflite --custom-recipe recipe.json --output recipe.tflite
```
### 4. Compile (NPU Offline AOT Compilation)
Apply Ahead-of-Time (AOT) offline compilation to a standard TFLite model for
edge SoC target NPUs.
> [!NOTE]
>
> Currently only supported on Linux hosts for Qualcomm targets. Other targets
> are coming soon!
```bash
# Basic offline compile for Qualcomm sm8750 NPU
litert compile model.tflite --target sm8750
# Compile for multiple NPUs and export as Android AI Pack
litert compile model.tflite --target sm8750 --target mt6989 --export-aipack my_npu_models
# Download the latest SoC metadata target maps from GitHub
litert compile --update-targets main
```
### 5. Run (Inference)
Run a TFLite model locally on desktop or on an adb-connected Android device.
**Desktop Execution:**
```bash
# Run locally on desktop (CPU)
litert run model.tflite --desktop --cpu
# Run using registered model-ref
litert run my_model_ref --desktop --cpu
# Enable GPU acceleration with CPU fallback (multi-accelerator)
litert run model.tflite --desktop --accelerator gpu,cpu
```
* Output logs are **clean by default**. To enable C++ verbose debug logs, set
the environment variable:`export LITERT_VERBOSE=1`.
**Android Execution (CPU, GPU, or NPU):**
```bash
# Run on connected Android device (CPU side)
litert run model.tflite --android --cpu
# Enable GPU acceleration with CPU fallback
litert run model.tflite --android --accelerator gpu,cpu
# Enable NPU acceleration with CPU fallback (JIT compilation mode)
litert run standard_model.tflite --android --accelerator npu,cpu
```
* **NPU Ahead-Of-Time (AOT) execution mode**: Pass an already NPU-compiled
TFLite model (compiled offline via `litert compile`). The on-device runtime
loads the compiled binary block directly, avoiding graph-compilation warmup
overhead:
```bash
litert run resnet18_compiled_sm8750.tflite --android --npu
```
**Custom Inputs and Formats:**
```bash
# Run multiple iterations and print output tensors
litert run model.tflite --iterations 5 --print-tensors
# Multi-Input Formats using literals or numpy arrays
litert run model.tflite --desktop --input inputs="[0.5, 0.5, 0.5]"
# Multi-Input Formats using files (numpy arrays, raw binaries, or images)
litert run model.tflite --desktop --input "image.png" --print-tensors
```
### 6. Benchmark
Benchmark LiteRT models on different platforms (Android, Google Cloud, or
Desktop).
```bash
# Benchmark on connected Android device via CPU
litert benchmark model.tflite --android --cpu
# On the CPU and the GPU (--android, --desktop, --ddp), benchmark_model runs twice: a first process writes the XNNPACK and
# GPU caches (no inference), the measured process reads them and reports the peak memory. The GPU cache needs a
# benchmark_model with --gpu_serialization_dir (nightly has it, 2.2.0 does not). If a process with the cache flags fails,
# benchmark_model runs once without them, as before, and the report says so; LITERT_DISABLE_MODEL_CACHES=1 runs it once
# from the start.
# Benchmark on Android GPU using OpenCL/OpenGL delegates
litert benchmark model.tflite --android --gpu
# Benchmark on Android NPU (JIT compilation mode)
litert benchmark model.tflite --android --npu
# Benchmark compiled AOT model on Android NPU
litert benchmark model_compiled.tflite --android --npu
# Benchmark on macOS CPU
litert benchmark my_model_ref --desktop --cpu
# Benchmark on Google AI Edge Portal (Google Cloud)
# Note: You must join EAP program first, authenticate using 'gcloud auth login', and configure
# --gcp-project and --gcp-bucket.
litert benchmark model.tflite --gcp --device "pixel 7" --gcp-project "your-gcp-project-id" --gcp-bucket "your-gcp-bucket"
# Benchmark on Developer Device Platform (DDP) devices (Google Cloud)
# Note: You must enable the Device Run API in your GCP project, authenticate using
# 'gcloud auth application-default login', and configure --gcp-project.
# Find device ids with 'gcloud beta device-run devices list --project <PROJECT_ID>'.
# The devices run benchmark_model of LiteRT 2.2.0; set DDP_LITERT_VERSION to pick another release.
litert benchmark model.tflite --ddp --device caiman-35 --gcp-project "your-gcp-project-id"
litert benchmark model.tflite --ddp --devices "caiman-35, pa3q-35" --gpu --gcp-project "your-gcp-project-id"
# A .litertlm bundle on DDP devices runs LiteRT-LM's prebuilt benchmark binary (gs://litert/binaries/latest/android_arm64/litert_lm/;
# DDP_LITERT_LM_VERSION picks another version there, DDP_LITERT_LM_DIR a gs:// directory laid out the same way): prefill and decode tokens/s at --prefill-tokens / --decode-tokens
# (default 1024 / 256), --num-iterations times (default 5). The binary runs twice: a warm-up process (one iteration, a cold
# Init) writes the caches beside the bundle, then the measured process loads them; the printed medians leave out its first
# --warmup-runs iterations (default 1) and the summary shows both Init times and the peak memory. The metrics proto and
# provenance land under ~/.cache/litert-cli/ddp/<session>/<job>/.
litert benchmark model.litertlm --ddp --device caiman-35 --gpu --gcp-project "your-gcp-project-id"
```
### 7. Large Language Models (LM)
Interact with LLM generative models (like Qwen 1.5 or Gemma 4) using native
`litert-lm` utilities.
> [!TIP]
>
> **Non-interactive / Background Execution:** When running LLM inferences in
> scripts or background tasks, the process will block waiting for chat prompts
> on `stdin`. To prevent hanging, **always redirect stdin from `/dev/null`**
> (i.e. append `< /dev/null` to the end of command).
```bash
# Run a generative model loading from Hugging Face
litert lm run --from-huggingface-repo=litert-community/gemma-4-E2B-it-litert-lm --prompt="What is the capital of France?" < /dev/null
# Run using a local compiled LLM (.litertlm) file
litert lm run gemma-4-E2B-it.litertlm --prompt "Hello, how are you?" < /dev/null
# Benchmark a generative LLM model
litert lm benchmark gemma-4-E2B-it.litertlm
```
### 8. Visualize
Launch Model Explorer to visualize the model structure.
```bash
# Open model structure graph in web browser
litert visualize model.tflite
# Clean up and stop all background visualization servers
litert visualize --stop-all
```
### 9. Import
Import a local model file or folder into the centralized cache.
```bash
# Import a local file into the cache
litert import my_model.tflite --model-ref my_model
# Import a directory and associate with a Hugging Face repository ID
litert import ./my_model_dir --model-ref my_model --hf-id my_org/my_model
```
### 10. List
List managed model references or view details of a specific model.
```bash
# List all models in the catalog
litert list
# Show detailed configurations of a specific model
litert list my_model
```
### 11. Delete
Delete a managed model reference from the centralized catalog.
```bash
# Delete a model reference from the cache
litert delete my_model
```
### 12. Clean
Clean up local caches, downloads, and temporary directories.
```bash
# Clean up local caches, downloaded files, and temporary on-device directories
litert clean
```
## 🧪 Testing
Agents should run tests after modifying code to ensure no regressions.
To run unit tests locally:
```bash
python litert_cli/litert_test.py
python litert_cli/litert_help_test.py
```
To run comprehensive end-to-end regression tests:
```bash
./examples/run_smoke_tests.sh ./examples/run_commands.sh
./examples/run_models.sh
```
## Best Practices for Agents
* Pipe outputs to text files or grep them if you are looking for specific
tensor shapes or runtime metrics.
* **Avoid hanging background processes**: When executing the `litert lm run`
command in a script or in the background, **always** append `< /dev/null` to
redirect standard input. Otherwise, the process will block indefinitely
waiting on stdin.
* **Explore Demos**: Refer to the `examples/` directory to explore
comprehensive per-command demos (under `examples/commands/`) and
model-specific demos (under `examples/models/`) for complete automation
patterns.
* **Read Troubleshooting Guides**: Refer to the main project `README.md`
file's **Troubleshooting & Tips** section for platform-specific
environmental setup guides, adb port recoveries, and NPU offline compiler
clang version requirements.
## 🤖 Example Agent Prompts
These prompts demonstrate how developers can leverage this skill. You can copy
and use them directly in your agent queries:
* "Download LiteRT model `litert-community/efficientnet_b1` and run it on CPU"
* "Benchmark LiteRT model `litert-community/efficientnet_b1` on my Android
GPU"
* "Compile LiteRT model `litert-community/efficientnet_b1` for NPU target
`sm8750`"
* "Visualize LiteRT model `litert-community/efficientnet_b1`"
* "Download the FP32 EfficientNet model `litert-community/efficientnet_b1`
from HuggingFace. Quantize it to INT8 dynamic range (`--recipe
dynamic_wi8_afp32`), then benchmark both the FP32 and INT8 models on my
Android GPU, comparing the throughput speedup."
* "Convert the model `Qwen/Qwen1.5-0.5B-Chat` from HuggingFace Hub to LiteRT
format, and run it locally with the prompt 'Explain edge machine learning in
one sentence'."
* "Download `litert-community/efficientnet_b1`, offline compile (AOT) it for
the `sm8750` target NPU into `./models/compiled`, then run on-device
inference and benchmark on the NPU, confirming zero JIT warmup latency."
عرض على GitHub