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 tích hợp sẵn tính năng hỗ trợ 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 và điều chỉnh LoRA.
Bạn có thể xem cách thực hiện nhiệm vụ này thông qua màn hình 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.24'
}
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
Để xem các API suy luận LLM đang hoạt động và khám phá một loạt tính năng AI tạo sinh toàn diện trên thiết bị, hãy xem ứng dụng Google AI Edge Gallery.
Google AI Edge Gallery là một ứng dụng Android nguồn mở, đóng vai trò là một sân chơi tương tác dành cho nhà phát triển. Trang này giới thiệu:
- Ví dụ thực tế về cách sử dụng API suy luận LLM cho nhiều tác vụ, bao gồm:
- Hỏi về hình ảnh: Tải hình ảnh lên và đặt câu hỏi về hình ảnh đó. Nhận thông tin mô tả, giải quyết vấn đề hoặc xác định đối tượng.
- Phòng thí nghiệm câu lệnh: Tóm tắt, viết lại, tạo mã hoặc sử dụng câu lệnh dạng tự do để khám phá các trường hợp sử dụng LLM một lượt.
- Trò chuyện bằng AI: Tham gia các cuộc trò chuyện có nhiều lượt.
- Khả năng khám phá, tải xuống và thử nghiệm với nhiều mô hình được tối ưu hoá bằng LiteRT từ Cộng đồng Hugging Face LiteRT và các bản phát hành chính thức của Google (ví dụ: Gemma 3N).
- Điểm chuẩn hiệu suất trên thiết bị theo thời gian thực cho nhiều mô hình (Thời gian để tạo mã thông báo đầu tiên, tốc độ giải mã, v.v.).
- Cách nhập và kiểm thử các mô hình
.task
tuỳ chỉnh của riêng bạn.
Ứng dụng này là tài nguyên để hiểu cách triển khai thực tế của API suy luận LLM và tiềm năng của AI tạo sinh trên thiết bị. Khám phá mã nguồn và tải ứng dụng xuống từ kho lưu trữ GitHub của Google AI Edge Gallery.
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ô hình 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ời nhắc đa phương thức
API Suy luận LLM cho Android hỗ trợ lời nhắc đa phương thức bằng các mô hình chấp nhận dữ liệu đầu vào là văn bản và hình ảnh. Khi bật tính năng đa phương thức, người dùng có thể đưa cả hình ảnh và văn bản vào câu lệnh của họ và LLM sẽ cung cấp câu trả lời bằng văn bản.
Để bắt đầu, hãy sử dụng biến thể tương thích với MediaPipe của Gemma 3n:
- Gemma-3n E2B: mô hình 2B của gia đình Gemma-3n.
- Gemma-3n E4B: mô hình 4B của gia đình Gemma-3n.
Để biết thêm thông tin, hãy xem tài liệu về Gemma-3n.
Để cung cấp hình ảnh trong một câu lệnh, hãy chuyển đổi hình ảnh hoặc khung hình đầu vào thành đối tượng com.google.mediapipe.framework.image.MPImage
trước khi truyền đối tượng đó đến API suy luận LLM:
import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage
// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
Để bật tính năng hỗ trợ thị giác cho API suy luận LLM, hãy đặt tuỳ chọn cấu hình EnableVisionModality
thành true
trong các tuỳ chọn Biểu đồ:
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
Gemma-3n chấp nhận tối đa một hình ảnh cho mỗi phiên, vì vậy, hãy đặt MaxNumImages
thành 1.
LlmInferenceOptions options = LlmInferenceOptions.builder()
...
.setMaxNumImages(1)
.build();
Sau đây là ví dụ về cách triển khai API suy luận LLM được thiết lập để xử lý dữ liệu đầu vào về thị giác và văn bản:
MPImage image = getImageFromAsset(BURGER_IMAGE);
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
.setTopK(10)
.setTemperature(0.4f)
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
try (LlmInference llmInference =
LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
LlmInferenceSession session =
LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
session.addQueryChunk("Describe the objects in the image.");
session.addImage(image);
String result = session.generateResponse();
}
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 ra 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 2B và Phi-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ập mô hình lượt chuyển đổi
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ở.