Chạy LLM bằng LiteRT-LM

LiteRT-LM là một thư viện đa nền tảng được thiết kế để chạy hiệu quả các quy trình mô hình ngôn ngữ trên nhiều loại thiết bị, từ điện thoại di động đến hệ thống nhúng. Nền tảng này cung cấp cho nhà phát triển các công cụ để tạo và triển khai quy trình công việc mô hình ngôn ngữ phức tạp, hiện có khả năng tích hợp NPU liền mạch.

Chạy LLM trên CPU và GPU

Hãy xem kho lưu trữ LiteRT-LM trên GitHub để biết hướng dẫn chi tiết về hoạt động phát triển trên nhiều nền tảng và khả năng tăng tốc phần cứng CPU/GPU.

Chạy LLM trên NPU

Đơn vị xử lý thần kinh (NPU) cung cấp các khối phần cứng chuyên dụng được tối ưu hoá cho khối lượng công việc học sâu. Chúng ngày càng có nhiều trong các hệ thống hiện đại trên một hệ thống trên vi mạch (SoC), đặc biệt là trên thiết bị di động. Bản chất hiệu suất cao khiến chúng rất phù hợp để chạy suy luận LLM.

Nhà cung cấp NPU

LiteRT-LM hỗ trợ chạy LLM bằng cách sử dụng tính năng tăng tốc NPU với các nhà cung cấp sau. Chọn hướng dẫn tuỳ thuộc vào nhà cung cấp mà bạn muốn dùng thử:

Bắt đầu nhanh

Để bắt đầu, trước tiên hãy làm theo hướng dẫn trong phần Điều kiện tiên quyết để thiết lập môi trường và kho lưu trữ.

Ngoài ra, để có thể tương tác với thiết bị Android, hãy đảm bảo bạn đã cài đặt đúng cách Cầu gỡ lỗi Android và có một thiết bị thông minh đã kết nối mà bạn có thể truy cập bằng adb.

Để biết thêm hướng dẫn chi tiết, hãy xem phần Bắt đầu nhanh trong kho lưu trữ LiteRT-LM và tìm thêm thông tin về litert_lm_main bản minh hoạ dòng lệnh.

Google Tensor

Hãy làm theo các bước sau để chạy LLM trên Google Tensor:

Bước 1: Tải mô hình .litertlm xuống Thời gian chạy LiteRT-LM được thiết kế để hoạt động với các mô hình ở định dạng .litertlm.

Bạn có thể tìm và tải các mẫu tương thích xuống trong bảng sau:

Mô hình SoC Lượng tử hoá Kích thước ngữ cảnh Kích thước mô hình (Mb) Đường liên kết để tải xuống
Gemma3-1B Tensor_G5 8 bit cho mỗi kênh 1280 1704 download

Sau đây là một ví dụ về lệnh có thể giúp bạn lấy đường liên kết Hugging Face để tải mô hình phù hợp cho SoC của điện thoại (lưu ý rằng bạn sẽ phải đăng nhập và xác nhận biểu mẫu để có quyền tải tệp xuống). Bạn nên đảm bảo có một thiết bị thông minh đã kết nối mà bạn có thể truy cập bằng 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_Google_${SOC_MODEL}.litertlm"

Xác minh rằng $SOC_MODEL có trong bảng hỗ trợ. Đường liên kết được tạo sẽ không hoạt động đối với các mô hình không được hỗ trợ. Chúng tôi thường xuyên bổ sung tính năng hỗ trợ cho NPU, vì vậy, hãy quay lại sau để xem thiết bị của bạn có được hỗ trợ hay không.

Bước 2: Xây dựng thời gian chạy / thư viện LiteRT-LM

Phát triển trong Linux

Để có thể tạo tệp nhị phân cho Android, bạn cần cài đặt NDK r28b hoặc phiên bản mới hơn từ Phiên bản ổn định mới nhất.

Hãy làm theo các bước sau:

  • Tải gói NDK ổn định mới nhất (tệp zip) xuống từ Phiên bản ổn định mới nhất.
  • Giải nén tệp zip vào vị trí bạn muốn (ví dụ: /path/to/AndroidNDK/)
  • Hãy để ANDROID_NDK_HOME trỏ đến thư mục NDK. Nội dung sẽ có dạng như sau:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

Với chế độ thiết lập này, hãy tạo tệp nhị phân litert_lm_main bằng lệnh sau:

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

Ngoài ra, hãy tạo thư viện API điều phối để cho phép thời gian chạy LiteRT-LM tương tác với NPU:

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

Bước 3: Chạy mô hình trên thiết bị Sau khi tạo thành công tệp nhị phân, giờ đây, chúng ta có thể thử chạy mô hình trên thiết bị. Đảm bảo bạn có quyền ghi vào DEVICE_FOLDER:

Để chạy tệp nhị phân trên thiết bị Android, chúng ta phải đẩy một số thành phần/tệp nhị phân. Trước tiên, hãy đặt DEVICE_FOLDER, đảm bảo bạn có quyền ghi vào đó (thường thì bạn có thể đặt mọi thứ trong /data/local/tmp/):

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

export MODEL_PATH=<path to your downloaded .litertlm >

Đẩy tệp .litertlm.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

Đẩy API điều phối và tệp nhị phân chính được biên dịch ở Bước 2.

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

Giờ đây, bạn có thể thực thi tệp nhị phân.

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

Qualcomm AI Engine Direct

Sau đây là các bước chạy LLM trên NPU của Qualcomm:

Bước 1: Tải mô hình .litertlm xuống Thời gian chạy LiteRT-LM được thiết kế để hoạt động với các mô hình ở định dạng .litertlm. Bạn có thể tìm và tải các mẫu tương thích xuống trong bảng sau.

Mô hình SoC Lượng tử hoá Kích thước ngữ cảnh Kích thước mô hình (Mb) Đường liên kết để tải xuống
Gemma3-1B SM8750 4 bit cho mỗi kênh 1280 658 download
Gemma3-1B SM8650 4 bit cho mỗi kênh 1280 658 download
Gemma3-1B SM8550 4 bit cho mỗi kênh 1280 657 download

Bạn sẽ phải tải mô hình tương ứng với SoC của mình xuống. Sau đây là một lệnh ví dụ có thể giúp bạn lấy đường liên kết đến Hugging Face. Đường liên kết này có thể tải mô hình phù hợp cho SoC của điện thoại xuống (lưu ý rằng bạn sẽ phải đăng nhập và xác nhận biểu mẫu để có quyền tải tệp xuống). Bạn nên đảm bảo có một thiết bị thông minh đã kết nối mà bạn có thể truy cập bằng 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"

Xác minh rằng $SOC_MODEL có trong bảng hỗ trợ. Đường liên kết được tạo sẽ không hoạt động đối với các mô hình không được hỗ trợ. Chúng tôi thường xuyên bổ sung tính năng hỗ trợ cho NPU, vì vậy, hãy quay lại sau để xem thiết bị của bạn có được hỗ trợ hay không.

Bước 2: Tải xuống và trích xuất các thư viện QAIRT Để chạy mô hình bằng NPU Qualcomm, bạn cần có các thư viện thời gian chạy liên kết trên thiết bị. Bạn có thể tải QAIRT SDK xuống từ đường liên kết rồi giải nén tệp. Đặt biến QAIRT_ROOT (sẽ dùng trong các bước sau) để trỏ đến thư mục chưa giải nén có chứa số phiên bản, ví dụ:

unzip <your_file.zip> -d ~/

QAIRT_ROOT=~/qairt/2.42.0.251225

Bước 3: Xây dựng thời gian chạy / thư viện LiteRT-LM

Phát triển trong Linux

Để có thể tạo tệp nhị phân cho Android, bạn cần cài đặt NDK r28b trở lên từ https://developer.android.com/ndk/downloads#stable-downloads. Các bước cụ thể là:

  • Tải tệp zip xuống từ https://developer.android.com/ndk/downloads#stable-downloads.
  • Giải nén tệp zip vào vị trí bạn muốn (ví dụ: /path/to/AndroidNDK/)
  • Thiết lập ANDROID_NDK_HOME để trỏ đến thư mục NDK. Nội dung sẽ có dạng như sau:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

Lưu ý: hãy đảm bảo ANDROID_NDK_HOME trỏ đến thư mục có chứa README.md.

Sau khi thiết lập, hãy thử tạo tệp nhị phân litert_lm_main:

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

Ngoài ra, chúng ta nên tạo Thư viện API điều phối để thời gian chạy LiteRT-LM tương tác với NPU:

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

Phát triển trong macOS

Công cụ dòng lệnh Xcode bao gồm clang. Chạy xcode-select --install nếu bạn chưa cài đặt trước đó.

Để có thể tạo tệp nhị phân cho Android, bạn cần cài đặt NDK r28b trở lên từ https://developer.android.com/ndk/downloads#stable-downloads. Các bước cụ thể là:

  • Tải tệp .dmg xuống từ https://developer.android.com/ndk/downloads#stable-downloads.
  • Mở tệp .dmg rồi di chuyển tệp AndroidNDK* đến vị trí bạn muốn (ví dụ: /path/to/AndroidNDK/)
  • Thiết lập ANDROID_NDK_HOME để trỏ đến thư mục NDK. Nội dung sẽ có dạng như sau:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

Lưu ý: hãy đảm bảo ANDROID_NDK_HOME trỏ đến thư mục có chứa README.md.

Sau khi thiết lập, hãy thử tạo tệp nhị phân litert_lm_main:

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

Ngoài ra, chúng ta nên tạo Thư viện API điều phối để thời gian chạy LiteRT-LM tương tác với NPU:

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

Bước 4: Chạy mô hình trên thiết bị Sau khi tạo thành công tệp nhị phân, giờ đây, chúng ta có thể thử chạy mô hình trên thiết bị. Đảm bảo bạn có quyền ghi vào DEVICE_FOLDER:

Để chạy tệp nhị phân trên thiết bị Android, chúng ta phải đẩy một số thành phần/tệp nhị phân. Trước tiên, hãy đặt DEVICE_FOLDER, đảm bảo bạn có quyền ghi vào đó (thường thì bạn có thể đặt mọi thứ trong /data/local/tmp/):

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

export MODEL_PATH=<path to your downloaded .litertlm >

Đẩy tệp .litertlm. Mẹo: bạn chỉ cần đẩy những thành phần đó một lần.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

Đẩy các thư viện QAIRT. Bạn có thể tìm thấy các tệp này trong thư mục chưa giải nén ở Bước 2 $QAIRT_ROOT/lib/aarch64-android/. Xin lưu ý rằng QAIRT_ROOT phải chứa số phiên bản, ví dụ: 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

Đẩy API điều phối và tệp nhị phân chính được biên dịch ở Bước 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

Giờ đây, bạn có thể thực thi tệp nhị phân.

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

Các bước chạy LLM trên NPU của MediaTek như sau:

Bước 1: Tải mô hình .litertlm xuống Thời gian chạy LiteRT-LM được thiết kế để hoạt động với các mô hình ở định dạng .litertlm. Bạn có thể tìm và tải các mẫu tương thích xuống trong bảng sau.

Mô hình SoC Lượng tử hoá Kích thước ngữ cảnh Kích thước mô hình (Mb) Đường liên kết để tải xuống
Gemma3-1B MT6989 4 bit cho mỗi kênh 1280 985 download
Gemma3-1B MT6991 4 bit cho mỗi kênh 1280 986 download

Bạn sẽ phải tải mô hình tương ứng với SoC của mình xuống. Sau đây là một lệnh ví dụ có thể giúp bạn lấy đường liên kết đến Hugging Face. Đường liên kết này có thể tải mô hình phù hợp cho SoC của điện thoại xuống (lưu ý rằng bạn sẽ phải đăng nhập và xác nhận biểu mẫu để có quyền tải tệp xuống). Bạn nên đảm bảo có một thiết bị thông minh đã kết nối mà bạn có thể truy cập bằng 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"

Xác minh rằng $SOC_MODEL có trong bảng hỗ trợ. Đường liên kết được tạo sẽ không hoạt động đối với các mô hình không được hỗ trợ. Chúng tôi thường xuyên bổ sung tính năng hỗ trợ cho NPU, vì vậy, hãy quay lại sau để xem thiết bị của bạn có được hỗ trợ hay không.

Bước 2: Xây dựng thời gian chạy / thư viện LiteRT-LM

Phát triển trong Linux

Để có thể tạo tệp nhị phân cho Android, bạn cần cài đặt NDK r28b trở lên từ https://developer.android.com/ndk/downloads#stable-downloads. Các bước cụ thể là:

  • Tải tệp zip xuống từ https://developer.android.com/ndk/downloads#stable-downloads.
  • Giải nén tệp zip vào vị trí bạn muốn (ví dụ: /path/to/AndroidNDK/)
  • Thiết lập ANDROID_NDK_HOME để trỏ đến thư mục NDK. Nội dung sẽ có dạng như sau:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

Lưu ý: hãy đảm bảo ANDROID_NDK_HOME trỏ đến thư mục có chứa README.md.

Sau khi thiết lập, hãy thử tạo tệp nhị phân litert_lm_main:

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

Ngoài ra, chúng ta nên tạo Thư viện API điều phối để thời gian chạy LiteRT-LM tương tác với NPU:

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

Phát triển trong macOS

Công cụ dòng lệnh Xcode bao gồm clang. Chạy xcode-select --install nếu bạn chưa cài đặt trước đó.

Để có thể tạo tệp nhị phân cho Android, bạn cần cài đặt NDK r28b trở lên từ https://developer.android.com/ndk/downloads#stable-downloads. Các bước cụ thể là:

  • Tải tệp .dmg xuống từ https://developer.android.com/ndk/downloads#stable-downloads.
  • Mở tệp .dmg rồi di chuyển tệp AndroidNDK* đến vị trí bạn muốn (ví dụ: /path/to/AndroidNDK/)
  • Thiết lập ANDROID_NDK_HOME để trỏ đến thư mục NDK. Nội dung sẽ có dạng như sau:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

Lưu ý: hãy đảm bảo ANDROID_NDK_HOME trỏ đến thư mục có chứa README.md.

Sau khi thiết lập, hãy thử tạo tệp nhị phân litert_lm_main:

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

Ngoài ra, chúng ta nên tạo Thư viện API điều phối để thời gian chạy LiteRT-LM tương tác với NPU:

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

Bước 3: Chạy mô hình trên thiết bị Sau khi tạo thành công tệp nhị phân, giờ đây, chúng ta có thể thử chạy mô hình trên thiết bị. Đảm bảo bạn có quyền ghi vào DEVICE_FOLDER:

Để chạy tệp nhị phân trên thiết bị Android, chúng ta phải đẩy một số thành phần/tệp nhị phân. Trước tiên, hãy đặt DEVICE_FOLDER, đảm bảo bạn có quyền ghi vào đó (thường thì bạn có thể đặt mọi thứ trong /data/local/tmp/):

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

export MODEL_PATH=<path to your downloaded .litertlm >

Đẩy tệp .litertlm. Mẹo: bạn chỉ cần đẩy những thành phần đó một lần.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

Đẩy API điều phối và tệp nhị phân chính được biên dịch ở Bước 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

Giờ đây, bạn có thể thực thi tệp nhị phân.

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

Intel OpenVino

Chạy bằng tệp thực thi C++

Các bước chạy LLM trên NPU của Intel như sau:

Bước 1: Tải mô hình .litertlm xuống Thời gian chạy LiteRT-LM được thiết kế để hoạt động với các mô hình ở định dạng .litertlm. Bạn có thể tìm và tải các mẫu tương thích xuống trong bảng sau.

Mô hình SoC Kích thước ngữ cảnh Kích thước mô hình (Mb) Đường liên kết để tải xuống
Gemma4-2B PantherLake 4096 2,95 GB download
Gemma4-2B LunarLake 4096 2,96 GB download

Bước 2: Xây dựng thời gian chạy LiteRT-LM và thư viện điều phối LiteRT Intel

Phát triển trên Windows

Sau khi thiết lập, hãy thử tạo tệp nhị phân litert_lm_main:

bazel --output_base=C:\bzl_lrtlm build --define=DISABLE_HUGGINGFACE_TOKENIZER=1 --config=windows //runtime/engine:litert_lm_main

Ngoài ra, chúng ta nên tạo Thư viện API điều phối để thời gian chạy LiteRT-LM tương tác với NPU:

bazel --output_base=C:\bzl_lrtlm build --config=windows  @litert//litert/vendors/intel_openvino/dispatch:LiteRtDispatch

Bước 3: Chạy mô hình trên thiết bị Sau khi tạo thành công tệp nhị phân, giờ đây, chúng ta có thể thử chạy mô hình trên thiết bị. Chúng ta sẽ đóng gói tất cả các tệp nhị phân, DLL và mô hình vào một "execution_dir":

cp bazel-bin/external/litert/vendors/intel_openvino/dispatch/LiteRtDispatch.dll execution_dir
cp bazel-bin/runtime/engine/litert_lm_main.exe execution_dir
cp prebuilt\windows_x86_64\libGemmaModelConstraintProvider.dll execution_dir

# Run OpenVino's setup script to ensure the OpenVino DLLs can be found.
& C:\bzl_lrtlm\external\intel_openvino\openvino\setupvars.ps1

# Test run
cd execution_dir
.\litert_lm_main.exe --backend=npu --model_path="execution_dir\model.litertlm"  --input_prompt="What is the capital of France?"

Bạn cũng có thể xem https://ai.google.dev/edge/litert-lm/python để biết API Python của LiteRT-LM nhằm chạy một .Tệp litertlm có phần phụ trợ NPU.

import litert_lm

with litert_lm.Engine("C:\path\to\npu-model.litertlm", backend=litert_lm.Backend.NPU()) as engine:
  with engine.create_conversation() as conversation:
    print(conversation.send_message("What is the capital of France?"))