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

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 trình duyệt cho các ứng dụng web. Bạn có thể dùng trình duyệt này để thực hiện nhiều thao tác, 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. Nhiệm 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 chuyển văn bản thành 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 các ứng dụng web của mình.

Bạn có thể xem cách thực hiện của tác 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à lựa chọn cấu hình của nhiệm vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Ứng dụng mẫu cho API suy luận LLM cung cấp cách triển khai cơ bản của tác vụ này trong JavaScript để bạn tham khảo. Bạn có thể sử dụng ứng dụng mẫu này để bắt đầu tạo ứng dụng tạo văn bản của riêng mình.

Bạn có thể truy cập ứng dụng mẫu LLM Inference API trên GitHub.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và mã dự án dành riêng cho việc sử dụng API dự đoán LLM. Để biết thông tin chung về cách thiết lập môi trường phát triển để sử dụng MediaPipe Tasks, bao gồm cả các yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập dành cho web.

Khả năng tương thích với trình duyệt

API dự đoán LLM yêu cầu một 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.

Gói JavaScript

Mã API Suy luận LLM có sẵn trong gói @mediapipe/tasks-genai. Bạn có thể tìm và tải các thư viện này xuống qua các đường liên kết trong Hướng dẫn thiết lập của nền tảng.

Cài đặt các gói bắt buộc để thử nghiệm 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 của bạn:

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

Mẫu

API Suy luận LLM của MediaPipe cần một mô hình đã qua huấn luyện tương thích với tác vụ này. Đối với các ứng dụng web, mô hình phải tương thích với GPU.

Để biết thêm thông tin về các mô hình được huấn luyện hiện có cho LLM Inference API, hãy xem phần Mô hình tổng quan về nhiệm vụ.

Tải mô hình xuống

Trước khi khởi chạy LLM Inference API, hãy tải một trong các mô hình được hỗ trợ xuống và lưu trữ tệp trong thư mục dự án của bạn:

  • Gemma: Một phần của nhóm mô hình mở, hiện đại và gọn nhẹ được xây dựng từ cùng một nghiên cứu và công nghệ dùng để tạo các mô hình Gemini. Phù hợp với nhiều tác vụ tạo văn bản, bao gồm trả lời câu hỏi, tóm tắt và lập lý. Tải biến thể mô hình Gemma 2B hoặc Gemma 7B.
  • Phi-2: Mô hình Transformer với 2, 7 tỷ tham số, phù hợp nhất với định dạng câu hỏi, cuộc trò chuyện và mã.
  • Falcon-RW-1B: 1 tỷ mô hình chỉ dành cho bộ giải mã nhân quả có tham số được huấn luyện trên 350 tỷ mã thông báo của RefinedWeb.
  • StableLM-3B: Mô hình ngôn ngữ chỉ dành cho bộ giải mã tham số 3 tỷ được huấn luyện trước trên 1 nghìn tỷ mã thông báo gồm các tập dữ liệu mã và tiếng Anh đa dạng.

Bạn nên sử dụng Gemma 2B hoặc Gemma 7B có sẵn trên Mô hình Kaggle và có định dạng đã tương thích với API suy luận LLM. Nếu sử dụng một LLM khác, bạn sẽ cần chuyển đổi mô hình sang một định dạng thân thiện với MediaPipe. Để biết thêm thông tin về Gemma, vui lòng xem trang web của Gemma. Để biết thêm thông tin về các mô hình hiện có khác, hãy xem phần Mô hình tổng quan về tác vụ.

Chuyển đổi mô hình sang định dạng MediaPipe

Chuyển đổi mô hình gốc

Nếu bạn đang sử dụng một mô hình ngôn ngữ lớn (LLM) bên ngoài (Phi-2, Falcon hoặc StableLM) hoặc một phiên bản Gemma không phải của Kaggle, hãy sử dụng các tập lệnh chuyển đổi của chúng tôi để định dạng mô hình sao cho tương thích với MediaPipe.

Quá trình chuyển đổi mô hình cần có gói MediaPipe PyPI. Tập lệnh chuyển đổi có trong tất cả các gói MediaPipe sau 0.10.11.

Cài đặt và nhập các phần phụ thuộc bằng các thành phần sau:

$ python3 -m pip install mediapipe

Sử dụng thư viện genai.converter để chuyển đổi mô hình:

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

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

Để chuyển đổi mô hình LoRA, ConversionConfig phải chỉ định các tuỳ chọn mô hình cơ sở cũng như các tuỳ chọn LoRA bổ sung. Xin lưu ý rằng vì API chỉ hỗ trợ suy luận LoRA bằng GPU, nên bạn phải đặt phần phụ trợ thành 'gpu'.

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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

Bộ chuyển đổi sẽ xuất 2 tệp vùng đệm phẳng TFLite, một tệp cho mô hình cơ sở và tệp còn lại cho mô hình LoRA.

Thông số Nội dung mô tả Giá trị được chấp nhận
input_ckpt Đường dẫn đến tệp model.safetensors hoặc pytorch.bin. Xin lưu ý rằng đôi khi định dạng an toàn của mô hình được phân đoạn thành nhiều tệp, ví dụ: model-00001-of-00003.safetensors, model-00001-of-00003.safetensors. Bạn có thể chỉ định một mẫu tệp, chẳng hạn như model*.safetensors. PATH
ckpt_format Định dạng tệp mô hình. {"safetensors", "pytorch"}
model_type LLM đang được chuyển đổi. {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend Bộ xử lý (uỷ quyền) dùng để chạy mô hình. {"cpu", "gpu"}
output_dir Đường dẫn đến thư mục đầu ra lưu trữ các tệp trọng số trên mỗi lớp. PATH
output_tflite_file Đường dẫn đến tệp đầu ra. Ví dụ: "model_cpu.bin" hoặc "model_gpu.bin". Tệp này chỉ tương thích với API suy luận LLM và không thể dùng làm tệp "tflite" chung. PATH
vocab_model_file Đường dẫn đến thư mục lưu trữ các tệp tokenizer.jsontokenizer_config.json. Đối với Gemma, hãy trỏ đến một tệp tokenizer.model. PATH
lora_ckpt Đường dẫn đến ckpt LoRA của tệp an toàn lưu trữ trọng số của bộ chuyển đổi LoRA. PATH
lora_rank Một số nguyên thể hiện thứ hạng của ckpt LoRA. Đây là trường bắt buộc để chuyển đổi các trọng số lora. Nếu giá trị này không được cung cấp, thì bộ chuyển đổi sẽ giả định không có trọng số LoRA. Lưu ý: Chỉ phần phụ trợ GPU mới hỗ trợ LoRA. Số nguyên
lora_output_tflite_file Xuất tên tệp tflite cho các trọng số LoRA. PATH

Chuyển đổi mô hình AI Edge

Nếu bạn đang sử dụng một mô hình ngôn ngữ lớn (LLM) được liên kết với một mô hình TFLite thông qua AI Edge, hãy sử dụng tập lệnh gói của chúng tôi để tạo Task Bundle (Gói tác vụ). Quy trình gói gói mô hình đã liên kết với siêu dữ liệu bổ sung (ví dụ: Cần có Tham số mã hoá) để chạy dự đoán hai đầu.

Quá trình gói mô hình yêu cầu gói MediaPipe PyPI. Tập lệnh chuyển đổi có trong tất cả các gói MediaPipe sau 0.10.14.

Cài đặt và nhập các phần phụ thuộc bằng các thành phần sau:

$ python3 -m pip install mediapipe

Sử dụng thư viện genai.bundler để gói mô hình:

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

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
Thông số Nội dung mô tả Giá trị được chấp nhận
tflite_model Đường dẫn đến mô hình TFLite đã xuất cho AI Edge. PATH
tokenizer_model Đường dẫn đến mô hình trình tạo mã thông báo của SentenceFragment. PATH
start_token Mã khởi động dành riêng cho mô hình. Mã bắt đầu phải có trong mô hình trình tạo mã thông báo đã cung cấp. STRING
stop_tokens Mã dừng cụ thể của mẫu. Mã dừng phải có trong mô hình trình tạo mã thông báo đã cung cấp. DANH SÁCH[STRING]
output_filename Tên của tệp gói tác vụ đầu ra. PATH

Thêm mô hình vào thư mục dự án

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

<dev-project-root>/assets/gemma-2b-it-gpu-int4.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-int4.bin`}

Tạo việc cần làm

Sử dụng một trong các hàm createFrom...() của API Suy luận LLM để chuẩn bị nhiệm vụ chạy thông tin dự đoán. Bạn có thể sử dụng hàm createFromModelPath() với đường dẫn tương đối hoặc tuyệt đối đến tệp mô hình đã huấn luyện. Ví dụ về mã sử dụng hàm createFromOptions(). Để biết thêm thông tin về các lựa chọn cấu hình hiện có, hãy xem phần Lựa chọn cấu hình.

Mã sau đây minh hoạ cách tạo và định cấu hình tác vụ này:

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

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

Tác vụ này có các lựa chọn cấu hình sau đây cho ứng dụng Web và JavaScript:

Tên lựa chọn Nội dung mô tả Khoảng giá trị Giá trị mặc định
modelPath Đường dẫn đến nơi lưu trữ mô hình trong thư mục dự án. PATH 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 thông tin dự đoán cho k mã thông báo có nhiều khả năng xuất hiện nhất. Khi đặt topK, bạn cũng phải thiết lập giá trị cho randomSeed. Số nguyên 40
temperature Số lượng ngẫu nhiên được tạo ra trong quá trình tạo. Nhiệt độ càng cao thì văn bản càng sáng tạo, trong khi nhiệt độ càng thấp thì quá trình tạo văn bản càng dễ dự đoán. Khi đặt temperature, bạn cũng phải thiết lập giá trị cho randomSeed. Số thực dấu phẩy động 0,8
randomSeed Nội dung gốc 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ô hình GPU. Mảng số nguyên Không áp dụng

Chuẩn bị dữ liệu

LLM Inference API chấp nhận dữ liệu văn bản (string). Tác vụ này sẽ xử lý tiền xử lý đầu vào dữ liệu, bao gồm cả việc mã hoá và tiền xử lý tensor.

Mọi quá trình xử lý trước đều được xử lý trong hàm generateResponse(). Bạn không cần phải xử lý thêm văn bản nhập.

const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";

Chạy tác vụ

API Suy luận LLM sử dụng hàm generateResponse() để kích hoạt thông tin dự đoán. Để phân loại văn bản, phương thức này có nghĩa là trả về các danh mục có thể có cho văn bản đầu vào.

Mã sau đây minh hoạ cách thực thi quá trình xử lý bằng mô hình tác vụ.

const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;

Để tạo câu trả lời theo thời gian thực, hãy dùng các hàm sau:

llmInference.generateResponse(
  inputPrompt,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});

Xử lý và hiển thị kết quả

LLM Inference API trả về một chuỗi bao gồm văn bản phản hồi được tạo.

Here's a draft you can use:

Subject: Lunch on Saturday Reminder

Hi Brett,

Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.

Looking forward to it!

Best,
[Your Name]

Tuỳ chỉnh mô hình LoRA

Bạn có thể định cấu hình API suy luận LLM của Mediapipe để hỗ trợ Điều chỉnh mức độ thích ứng thấp (LoRA) cho các mô hình ngôn ngữ lớn. Bằng cách sử dụng các mô hình LoRA được tinh chỉnh, nhà phát triển có thể tuỳ chỉnh hành vi của các LLM thông qua một quy trình đào tạo tiết kiệm chi phí.

Tính năng hỗ trợ LoRA của LLM Inference API hoạt động trên các mô hình Gemma-2B và Phi-2 cho phần phụ trợ GPU, trong đó trọng số LoRA chỉ áp dụng cho các lớp chú ý. Phương thức triển khai ban đầu này đóng vai trò là API thử nghiệm cho các bản cập nhật trong tương lai, đồng thời lên kế hoạch hỗ trợ thêm nhiều mô hình và nhiều loại lớp trong bản cập nhật sắp tới.

Chuẩn bị mô hình LoRA

Làm theo hướng dẫn trên HuggingFace để huấn luyện một mô hình LoRA được tinh chỉnh tinh chỉnh trên tập dữ liệu của riêng bạn với các loại mô hình được hỗ trợ là Gemma-2B hoặc Phi-2. Các mô hình Gemma-2B và Phi-2 đều có trên HuggingFace ở định dạng SafeFrame. Vì LLM Inference API chỉ hỗ trợ LoRA trên các lớp chú ý, nên bạn chỉ cần chỉ định các lớp chú ý trong khi tạo LoraConfig như sau:

# For Gemma-2B
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"],
)

Để thử nghiệm, có các mô hình LoRA đã tinh chỉnh được tinh chỉnh công khai và phù hợp với LLM Inference API có trên HuggingFace. Ví dụ: monsterapi/gemma-2b-lora-maths-orca-200k đối với Gemma-2B và lole25/phi-2-sft-ultrachat-lora đối với Phi-2.

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

Bước tiếp theo, bạn cần chuyển đổi các trọng số của mô hình thành bộ đệm TensorFlow Lite Flat bằng cách sử dụng Gói Python MediaPipe. ConversionConfig phải chỉ định các tuỳ chọn mô hình cơ sở cũng như các tuỳ chọn LoRA bổ sung. Xin lưu ý rằng vì API chỉ hỗ trợ suy luận LoRA bằng GPU, nên bạn phải thiết lập phần phụ trợ thành 'gpu'.

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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

Bộ chuyển đổi sẽ xuất 2 tệp vùng đệm phẳng TFLite, một tệp cho mô hình cơ sở và tệp còn lại cho mô hình LoRA.

Suy luận mô hình LoRA

API dự đoán LLM của web, Android và iOS được cập nhật để hỗ trợ dự đoán mô hình LoRA. Web hỗ trợ LoRA động, có thể chuyển đổi các mô hình LoRA khác nhau trong thời gian chạy. Android và iOS hỗ trợ LoRA tĩnh. LoRA này sử dụng cùng một trọng số LoRA trong suốt thời gian thực hiện nhiệm vụ.

Web hỗ trợ LoRA động trong thời gian chạy. Tức là người dùng khai báo thứ hạng LoRA sẽ được dùng trong quá trình khởi chạy và 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]
});

Trong thời gian chạy, sau khi khởi tạo mô hình cơ sở, hãy tải các mô hình LoRA sẽ được sử dụng. Ngoài ra, hãy kích hoạt mô hình LoRA bằng cách truyền tham chiếu mô hình LoRA trong 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;
});