Hướng dẫn suy luận LLM dành cho Web

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 web. 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 web của mình.

Để nhanh chóng thêm API suy luận LLM vào ứng dụng Web, 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 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 Web. API suy luận LLM yêu cầu trình duyệt web có khả năng tương thích với WebGPU. Để biết 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

API suy luận LLM sử dụng gói @mediapipe/tasks-genai.

Cài đặt các gói bắt buộc để tạo bản dựng cục bộ:

npm install @mediapipe/tasks-genai

Để triển khai cho 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:

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
    crossorigin="anonymous"></script>
</head>

Tải mô hình xuống

Tải Gemma-2 2B xuống ở định dạng lượng tử hoá 8 bit từ Mô hình Kaggle. Để 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.

Lưu trữ mô hình trong thư mục dự án:

<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin

Chỉ định đường dẫn của mô hình bằng tham số modelAssetPath của đối tượng baseOptions:

baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}

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:

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-2b-it-gpu-int8.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

Chạy tác vụ

Sử 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;
});

Ứ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 Web, 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 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 tuỳ chọn cấu hình sau để thiết lập ứ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 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
loraRanks Các thứ hạng LoRA sẽ được các mô hình LoRA sử dụng trong thời gian chạy. Lưu ý: tính năng này chỉ tương thích với các mẫu GPU. Mảng số nguyên 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 tương thích với MediaPipe, 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

Web hỗ trợ LoRA động trong thời gian chạy, nghĩa là người dùng khai báo thứ hạng LoRA trong quá trình khởi chạy. Điều này có nghĩa là bạn có thể hoán đổi 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 chạy mô hình cơ sở. Kích hoạt mô hình LoRA bằng cách truyền 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;
});