Hướng dẫn dự đoán LLM dành cho Android

API suy luận LLM cho phép bạn chạy các mô hình ngôn ngữ lớn (LLM) hoàn toàn trên thiết bị cho các ứng dụng Android. Bạn có thể sử dụng API này để thực hiện nhiều tác vụ, chẳng hạn như tạo văn bản, truy xuất thông tin ở dạng ngôn ngữ tự nhiên và tóm tắt tài liệu. Tác vụ này cung cấp tính năng hỗ trợ tích hợp cho nhiều mô hình ngôn ngữ lớn từ văn bản sang văn bản, nhờ đó, bạn có thể áp dụng các mô hình AI tạo sinh mới nhất trên thiết bị cho ứng dụng Android.

Để nhanh chóng thêm API suy luận LLM vào ứng dụng Android, hãy làm theo hướng dẫn Bắt đầu nhanh. Để biết ví dụ cơ bản về một ứng dụng Android chạy API suy luận LLM, hãy xem ứng dụng mẫu. Để hiểu rõ hơn về cách hoạt động của API suy luận LLM, hãy tham khảo các phần tuỳ chọn cấu hình, chuyển đổi mô hìnhđiều chỉnh LoRA.

Bạn có thể xem cách thực hiện nhiệm vụ này thông qua bản minh hoạ MediaPipe Studio. Để biết thêm thông tin về các tính năng, mô hình và tuỳ chọn cấu hình của tác vụ này, hãy xem phần Tổng quan.

Bắt đầu nhanh

Hãy làm theo các bước sau để thêm API suy luận LLM vào ứng dụng Android. API suy luận LLM được tối ưu hoá cho các thiết bị Android cao cấp, chẳng hạn như Pixel 8 và Samsung S23 trở lên, đồng thời không hỗ trợ đáng tin cậy cho trình mô phỏng thiết bị.

Thêm phần phụ thuộc

API suy luận LLM sử dụng thư viện com.google.mediapipe:tasks-genai. Thêm phần phụ thuộc này vào tệp build.gradle của ứng dụng Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.22'
}

Đối với các thiết bị chạy Android 12 (API 31) trở lên, hãy thêm phần phụ thuộc thư viện OpenCL gốc. Để biết thêm thông tin, hãy xem tài liệu về thẻ uses-native-library.

Thêm các thẻ uses-native-library sau vào tệp AndroidManifest.xml:

<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

Tải mô hình xuống

Tải Gemma-3 1B ở định dạng lượng tử hoá 4 bit từ Hugging Face. Để biết thêm thông tin về các mô hình hiện có, hãy xem Tài liệu về mô hình.

Đẩy nội dung của thư mục output_path vào thiết bị Android.

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task

Khởi chạy tác vụ

Khởi chạy tác vụ bằng các tuỳ chọn cấu hình cơ bản:

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath('/data/local/tmp/llm/model_version.task')
        .setMaxTopK(64)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)

Chạy tác vụ

Sử dụng phương thức generateResponse() để tạo nội dung trả lời bằng văn bản. Thao tác này sẽ tạo ra một câu trả lời được tạo.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

Để truyền trực tuyến phản hồi, hãy sử dụng phương thức generateResponseAsync().

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

Ứng dụng mẫu

Ứng dụng mẫu là ví dụ về một ứng dụng tạo văn bản cơ bản cho Android, sử dụng API suy luận LLM. Bạn có thể sử dụng ứng dụng này làm điểm xuất phát cho ứng dụng Android của riêng mình hoặc tham khảo ứng dụng này khi sửa đổi một ứng dụng hiện có. Mã ví dụ được lưu trữ trên GitHub.

Sao chép kho lưu trữ git bằng lệnh sau:

git clone https://github.com/google-ai-edge/mediapipe-samples

Sau khi tạo phiên bản cục bộ của mã ví dụ, bạn có thể nhập dự án vào Android Studio và chạy ứng dụng. Để biết thêm thông tin, hãy xem Hướng dẫn thiết lập cho Android.

Các lựa chọn về cấu hình

Sử dụng các tuỳ chọn cấu hình sau để thiết lập ứng dụng Android:

Tên tuỳ chọn Mô tả Phạm vi giá trị Giá trị mặc định
modelPath Đường dẫn đến vị trí lưu trữ mô hình trong thư mục dự án. ĐƯỜNG DẪN Không áp dụng
maxTokens Số lượng mã thông báo tối đa (mã thông báo đầu vào + mã thông báo đầu ra) mà mô hình xử lý. Số nguyên 512
topK Số lượng mã thông báo mà mô hình xem xét ở mỗi bước tạo. Giới hạn các dự đoán ở k mã thông báo có nhiều khả năng nhất. Số nguyên 40
temperature Mức độ ngẫu nhiên được đưa vào trong quá trình tạo. Nhiệt độ cao hơn sẽ tạo ra văn bản sáng tạo hơn, trong khi nhiệt độ thấp hơn sẽ tạo ra văn bản dễ dự đoán hơn. Số thực dấu phẩy động 0,8
randomSeed Giá trị khởi tạo ngẫu nhiên được dùng trong quá trình tạo văn bản. Số nguyên 0
loraPath Đường dẫn tuyệt đối đến mô hình LoRA cục bộ trên thiết bị. Lưu ý: tính năng này chỉ tương thích với các mẫu GPU. ĐƯỜNG DẪN Không áp dụng
resultListener Đặt trình nghe kết quả để nhận kết quả một cách không đồng bộ. Chỉ áp dụng khi sử dụng phương thức tạo không đồng bộ. Không áp dụng Không áp dụng
errorListener Đặt trình nghe lỗi không bắt buộc. Không áp dụng Không áp dụng

Lượt chuyển đổi được mô hình hoá

API suy luận LLM tương thích với các loại mô hình sau đây, một số mô hình trong đó yêu cầu chuyển đổi mô hình. Sử dụng bảng để xác định phương thức bước bắt buộc cho mô hình của bạn.

Mô hình Phương thức chuyển đổi Nền tảng tương thích Loại tệp
Gemma-3 1B Không cần chuyển đổi Android, web .task
Gemma 2B, Gemma 7B, Gemma-2 2B Không cần chuyển đổi Android, iOS, web .bin
Phi-2, StableLM, Falcon Tập lệnh chuyển đổi MediaPipe Android, iOS, web .bin
Tất cả mô hình LLM PyTorch Thư viện AI Edge Torch Generative Android, iOS .task

Để tìm hiểu cách chuyển đổi các mô hình khác, hãy xem phần Chuyển đổi mô hình.

Tuỳ chỉnh LoRA

API suy luận LLM hỗ trợ điều chỉnh LoRA (Thích ứng thứ hạng thấp) bằng cách sử dụng thư viện PEFT (Điều chỉnh tinh vi hiệu quả theo tham số). Tính năng điều chỉnh LoRA tuỳ chỉnh hành vi của LLM thông qua một quy trình huấn luyện hiệu quả về chi phí, tạo một tập hợp nhỏ các trọng số có thể huấn luyện dựa trên dữ liệu huấn luyện mới thay vì huấn luyện lại toàn bộ mô hình.

API suy luận LLM hỗ trợ việc thêm trọng số LoRA vào các lớp chú ý của mô hình Gemma-2 2B, Gemma 2BPhi-2. Tải mô hình xuống ở định dạng safetensors.

Mô hình cơ sở phải ở định dạng safetensors để tạo trọng số LoRA. Sau khi huấn luyện LoRA, bạn có thể chuyển đổi các mô hình thành định dạng FlatBuffers để chạy trên MediaPipe.

Chuẩn bị trọng số LoRA

Sử dụng hướng dẫn Phương thức LoRA của PEFT để huấn luyện mô hình LoRA được tinh chỉnh trên tập dữ liệu của riêng bạn.

API suy luận LLM chỉ hỗ trợ LoRA trên các lớp chú ý, vì vậy, chỉ chỉ định các lớp chú ý trong LoraConfig:

# For Gemma
from peft import LoraConfig
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)

# For Phi-2
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)

Sau khi huấn luyện trên tập dữ liệu đã chuẩn bị và lưu mô hình, các trọng số mô hình LoRA được tinh chỉnh sẽ có trong adapter_model.safetensors. Tệp safetensors là điểm kiểm tra LoRA được dùng trong quá trình chuyển đổi mô hình.

Lượt chuyển đổi được mô hình hoá

Sử dụng Gói Python MediaPipe để chuyển đổi trọng số mô hình sang định dạng Flatbuffer. ConversionConfig chỉ định các tuỳ chọn mô hình cơ sở cùng với các tuỳ chọn LoRA bổ sung.

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  # Other params related to base model
  ...
  # Must use gpu backend for LoRA conversion
  backend='gpu',
  # LoRA related params
  lora_ckpt=LORA_CKPT,
  lora_rank=LORA_RANK,
  lora_output_tflite_file=LORA_OUTPUT_FILE,
)

converter.convert_checkpoint(config)

Trình chuyển đổi sẽ tạo ra hai tệp Flatbuffer, một tệp cho mô hình cơ sở và một tệp cho mô hình LoRA.

Suy luận mô hình LoRA

Android hỗ trợ LoRA tĩnh trong quá trình khởi chạy. Để tải mô hình LoRA, hãy chỉ định đường dẫn mô hình LoRA cũng như LLM cơ sở.

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

Để chạy quy trình suy luận LLM bằng LoRA, hãy sử dụng các phương thức generateResponse() hoặc generateResponseAsync() giống như mô hình cơ sở.