LLM Inference API 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 Web. Bạn có thể 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 khả 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, vì vậy, 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 các ứng dụng Web của mình. Nếu bạn đang sử dụng các mô hình Gemma-3n mới nhất, thì hệ thống cũng hỗ trợ dữ liệu đầu vào là hình ảnh và âm thanh.
Để nhanh chóng thêm LLM Inference API vào ứng dụng Web của bạn, 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 Web chạy LLM Inference API, hãy xem ứng dụng mẫu. Để hiểu rõ hơn về cách hoạt động của LLM Inference API, hãy tham khảo các phần lựa chọn cấu hình, chuyển đổi mô hình và điều chỉnh LoRA.
Bạn có thể xem tác vụ này hoạt động trong bản minh hoạ MediaPipe Studio. Để biết thêm thông tin về các chức năng, mô hình và lựa 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 LLM Inference API vào ứng dụng Web của bạn. LLM Inference API yêu cầu trình duyệt web có khả năng tương thích với WebGPU. Để xem danh sách đầy đủ các trình duyệt tương thích, hãy xem phần Khả năng tương thích của trình duyệt GPU.
Thêm phần phụ thuộc
LLM Inference API sử dụng gói @mediapipe/tasks-genai
.
Cài đặt các gói cần thiết cho giai đoạn dàn dựng cục bộ:
npm install @mediapipe/tasks-genai
Để triển khai đến một máy chủ, hãy sử dụng dịch vụ mạng phân phối nội dung (CDN) như jsDelivr để thêm mã trực tiếp vào trang HTML của bạn:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
Tải một mô hình xuống
Tải Gemma-3n E4B hoặc E2B xuống từ HuggingFace. Các mô hình có "-Web" trong tên được chuyển đổi dành riêng cho việc sử dụng trên web, vì vậy bạn nên luôn sử dụng một trong các mô hình này.
Để 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 hoặc duyệt xem trang Cộng đồng HuggingFace. Trang này cung cấp một số biến thể bổ sung của Gemma 3 không có trong tài liệu, nhưng đã được chuyển đổi đặc biệt cho web, chẳng hạn như 270M, 4B, 12B, 27B và MedGemma-27B-Text.
Lưu mô hình trong thư mục dự án của bạn:
<dev-project-root>/assets/gemma-3n-E4B-it-int4-Web.litertlm
Chỉ định đường dẫn của mô hình bằng tham số baseOptions
đối tượng modelAssetPath
:
baseOptions: { modelAssetPath: `/assets/gemma-3n-E4B-it-int4-Web.litertlm`}
Khởi chạy Task
Khởi chạy tác vụ bằng các lựa chọn cấu hình cơ bản:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
Chạy tác vụ
Dùng hàm generateResponse()
để kích hoạt suy luận.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
Để truyền trực tuyến phản hồi, hãy sử dụng nội dung sau:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
Đặt câu lệnh đa phương thức
Đối với các mô hình Gemma-3n, LLM Inference API Web API hỗ trợ câu lệnh đa phương thức. Khi bật chế độ đa phương thức, người dùng có thể đưa một tổ hợp có thứ tự gồm hình ảnh, âm thanh và văn bản vào câu lệnh của mình. Sau đó, LLM sẽ đưa ra một câu trả lời bằng văn bản.
Để bắt đầu, hãy sử dụng Gemma-3n E4B hoặc Gemma-3n E2B ở định dạng tương thích với MediaPipe và Web. Để biết thêm thông tin, hãy xem tài liệu về Gemma-3n.
Để bật tính năng hỗ trợ thị lực, hãy đảm bảo rằng maxNumImages
được đặt thành một giá trị dương. Tham số này xác định số lượng tối đa các phần hình ảnh mà LLM có thể xử lý trong một câu lệnh duy nhất.
Để bật chế độ hỗ trợ âm thanh, hãy đảm bảo bạn đã đặt supportAudio
thành true
.
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101,
maxNumImages: 5,
supportAudio: true,
});
Giờ đây, bạn có thể tạo phản hồi như trước, nhưng sử dụng một mảng chuỗi, hình ảnh và dữ liệu âm thanh có thứ tự:
const response = await llmInference.generateResponse([
'<ctrl99>user\nDescribe ',
{imageSource: '/assets/test_image.png'},
' and then transcribe ',
{audioSource: '/assets/test_audio.wav'},
'<ctrl100>\n<ctrl99>model\n',
]);
Đối với thị giác, hệ thống hỗ trợ URL hình ảnh và hầu hết các đối tượng hình ảnh, video hoặc canvas phổ biến. Đối với âm thanh, chỉ hỗ trợ AudioBuffer một kênh và URL tệp âm thanh một kênh. Bạn có thể xem thêm thông tin chi tiết bằng cách duyệt xem mã nguồn.
Ứng dụng mẫu
Ứng dụng mẫu là một ví dụ về ứng dụng tạo văn bản cơ bản cho Web, sử dụng LLM Inference API. Bạn có thể sử dụng ứng dụng này làm điểm bắt đầu cho ứng dụng Web 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
Để biết thêm thông tin, hãy xem Hướng dẫn thiết lập cho web.
Các lựa chọn về cấu hình
Sử dụng các lựa chọn cấu hình sau để thiết lập một ứng dụng Web:
Tên tuỳ chọn | Mô tả | Phạm vi giá trị | Giá trị mặc định |
---|---|---|---|
modelPath |
Đường dẫn đến nơi mô hình được lưu trữ 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 dự đoán ở k mã thông báo có khả năng xảy ra 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 độ càng cao thì văn bản được tạo càng sáng tạo, còn nhiệt độ càng thấp thì văn bản được tạo càng dễ dự đoán. | Số thực dấu phẩy động | 0,8 |
randomSeed |
Dữ liệu gốc ngẫu nhiên được dùng trong quá trình tạo văn bản. | Số nguyên | 0 |
loraRanks |
LoRA xếp hạng được các mô hình LoRA sử dụng trong thời gian chạy. Lưu ý: chế độ này chỉ tương thích với các mô hình GPU. | Mảng số nguyên | Không áp dụng |
Chuyển đổi mô hình
LLM Inference API tương thích với các loại mô hình sau đây, một số loại mô hình yêu cầu chuyển đổi mô hình. Hãy dùng bảng này để xác định phương thức gồm cá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ả cá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
LLM Inference API hỗ trợ tinh chỉnh LoRA (Thích ứng cấp thấp) bằng cách sử dụng thư viện PEFT (Tinh chỉnh hiệu quả về tham số). Quá trình tinh chỉnh LoRA tuỳ chỉnh hành vi của LLM thông qua quy trình huấn luyện tiết kiệm chi phí, tạo một nhóm 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.
LLM Inference API 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 pháp LoRA của PEFT để huấn luyện một mô hình LoRA được tinh chỉnh trên tập dữ liệu của riêng bạn.
LLM Inference API chỉ hỗ trợ LoRA trên các lớp chú ý, vì vậy, bạn chỉ cần 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.
Chuyển đổi mô hình
Sử dụng Gói Python MediaPipe để chuyển đổi trọng số mô hình thành định dạng Flatbuffer. ConversionConfig
chỉ định các lựa chọn mô hình cơ sở cùng với các lựa 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 tương thích với MediaPipe, một cho mô hình cơ sở và một cho mô hình LoRA.
Suy luận mô hình LoRA
Web hỗ trợ LoRA động trong thời gian chạy, nghĩa là người dùng khai báo các thứ hạng LoRA trong quá trình khởi tạo. Điều này có nghĩa là bạn có thể thay thế các mô hình LoRA khác nhau trong thời gian chạy.
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
Tải các mô hình LoRA trong thời gian chạy, sau khi khởi tạo mô hình cơ sở. Kích hoạt mô hình LoRA bằng cách truyền thông tin tham chiếu mô hình khi tạo phản hồi LLM.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});