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 các 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 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à tính 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 của chúng 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ị đã 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.

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 xuống 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ị đã 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 biến này ở các bước sau) để trỏ đến thư mục chưa giải nén chứa số phiên bản, ví dụ:

unzip <your_file.zip> -d ~/

QAIRT_ROOT=~/qairt/2.42.0.251225

Bước 3: Tạo 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ố tài sả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. Lưu ý: 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 xuống 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ị đã 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ạo 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ố tài sả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. Lưu ý: 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