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 trình duyệt cho các ứng dụng web mà bạn có thể sử dụng để thực hiện nhiều thao tác nhiệm vụ cụ thể, 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 các mô hình ngôn ngữ lớn từ văn bản sang văn bản, nên bạn có thể áp dụng các mô hình ngôn ngữ mới nhất trên thiết bị các mô hình AI tạo sinh cho ứng dụng web.

Bạn có thể xem tác vụ này trong thực tế thông qua MediaPipe Studio bản minh hoạ. Để biết thêm thông tin về tính năng, kiểu máy và các lựa chọn cấu hình của nhiệm vụ nà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 công việc 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 bạn.

Bạn có thể truy cập vào ứng dụng mẫu của API suy luận LLM 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à các dự án lập trình dành riêng để sử dụng API suy luận LLM. Để biết thông tin chung về thiết lập môi trường phát triển để sử dụng MediaPipe Tasks, bao gồm yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập cho Web.

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

API suy luận LLM yêu cầu một trình duyệt web có khả năng tương thích với WebGPU. Để có một buổi danh sách trình duyệt tương thích, xem phần Trình duyệt GPU khả năng tương thích.

Gói JavaScript

Mã API suy luận LLM có sẵn thông qua @mediapipe/tasks-genai . Bạn có thể tìm và tải các thư viện này xuống từ các liên kết được cung cấp trong Hướng dẫn thiết lập 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 tới 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 MediaPipe yêu cầu một mô hình đã huấn luyện tương thích với mô hình này công việc. Đố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 đã huấn luyện hiện có cho API suy luận LLM, hãy xem nhiệm vụ phần Mô hình tổng quan.

Tải mô hình xuống

Trước khi khởi chạy API suy luận LLM, 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: Thuộc một gia đình gồm các mô hình mở gọn nhẹ, tiên tiến được xây dựng từ chính là 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 loại 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 luận. Tải xuống biến thể mô hình Gemma 2B hoặc Gemma 7B.
  • Phi-2: tham số 2,7 tỷ Mô hình máy biến áp, phù hợp nhất cho câu hỏi-Trả lời, trò chuyện và mã lập trình .
  • Falcon-RW-1B: 1 tỷ tham số chỉ dành cho bộ giải mã nhân quả được huấn luyện trên 350 tỷ mã thông báo của RefinedWeb.
  • Ổn địnhLM-3B: 3 tỷ mô hình ngôn ngữ chỉ dùng bộ giải mã tham số được huấn luyện trước trên 1 nghìn tỷ mã thông báo của nhiều tập dữ liệu tiếng Anh và mã nguồn.

Bạn nên sử dụng Gemma 2B hoặc Gemma 7B có trên Kaggle Mẫu sản phẩm và sắp tới ở định dạng tương thích với API suy luận LLM. Nếu bạn sử dụng một LLM khác, bạn sẽ cần chuyển đổi mô hình thành Định dạng phù hợp với MediaPipe. Để biết thêm thông tin về Gemma, hãy xem Trang web 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ề nhiệm vụ.

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

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

Trường hợp 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 mô hình không phải Kaggle phiên bản Gemma, sử dụng tập lệnh chuyển đổi của chúng tôi để định dạng mô hình tương thích với MediaPipe.

Quá trình chuyển đổi mô hình yêu cầu có gói MediaPipe PyPI. Lượt chuyển đổi tập lệnh sẽ 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ách làm như 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 mô hình cơ sở cũng như các tuỳ chọn LoRA bổ sung. Lưu ý rằng vì API chỉ hỗ trợ suy luận LoRA với GPU, phần phụ trợ phải được thiết lập 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 này sẽ xuất 2 tệp bộ đệm phẳng TFLite, một tệp cho mô hình cơ sở và quy tắc còn lại dành cho mô hình LoRA.

Thông số 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 safetytensors 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. ĐƯỜNG DẪN
ckpt_format Định dạng tệp mô hình. {"safetensors", "pytorch"}
model_type LLM đang được chuyển đổi. {&quot;PHI_2&quot;, &quot;FALCON_RW_1B&quot;, &quot;STABLELM_4E1T_3B&quot;, &quot;GEMMA_2B&quot;}
backend Bộ xử lý (uỷ quyền) dùng để chạy mô hình. {&quot;cpu&quot;, &quot;gpu&quot;}
output_dir Đường dẫn đến thư mục đầu ra lưu trữ các tệp trọng số mỗi lớp. ĐƯỜNG DẪN
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. ĐƯỜNG DẪN
vocab_model_file Đường dẫn đến thư mục lưu trữ tokenizer.jsontokenizer_config.json tệp. Đối với Gemma, hãy trỏ đến một tệp tokenizer.model. ĐƯỜNG DẪN
lora_ckpt Đường dẫn đến tệp LoRA ckpt của safetytensors có lưu trữ trọng số của bộ chuyển đổi LoRA. ĐƯỜNG DẪN
lora_rank Số nguyên đại diện cho thứ hạng của LoRA ckpt. Bắt buộc để chuyển đổi trọng số lora. Nếu không được cung cấp, thì trình chuyển đổi sẽ giả định rằng 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. ĐƯỜNG DẪN

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

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

Quy trình gói mô hình cần có gói MediaPipe PyPI. Lượt chuyển đổi tập lệnh sẽ 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ách làm như 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ố Mô tả Giá trị được chấp nhận
tflite_model Đường dẫn đến mô hình TFLite đã xuất sang AI Edge. ĐƯỜNG DẪN
tokenizer_model Đường dẫn đến mô hình bộ mã hoá SentencePiece. ĐƯỜNG DẪN
start_token Mã bắt đầu dành riêng cho mẫu. Mã bắt đầu phải có trong mô hình tokenizer được cung cấp. STRING
stop_tokens Mã dừng cụ thể cho mô hình. Mã dừng phải có trong mô hình tokenizer được cung cấp. DANH SÁCH[STRING]
output_filename Tên của tệp gói tác vụ đầu ra. ĐƯỜNG DẪN

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 đối tượng baseOptions modelAssetPath tham số:

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ụ cho chạy suy luận. Bạn có thể 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 tuỳ chọn cấu hình, hãy xem phần Tuỳ 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 cho ứng dụng web và JavaScript:

Tên lựa chọn Mô tả Khoảng 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 này 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 xuất hiện nhiều nhất. Số nguyên 40
temperature Mức độ ngẫu nhiên được đưa vào trong quá trình tạo. Cao hơn nhiệt độ sẽ mang lại nhiều sáng tạo hơn trong văn bản được tạo ra, trong khi nhiệt độ thấp hơn thì tạo ra máy tính dễ dự đoán hơn. Số thực dấu phẩy động 0,8
randomSeed Số ngẫu nhiên 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 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

Chuẩn bị dữ liệu

API suy luận LLM chấp nhận dữ liệu văn bản (string). Tác vụ này sẽ xử lý việc nhập dữ liệu xử lý trước, bao gồm cả mã hoá và xử lý trước tensor.

Mọi quy trình xử lý trước đều được xử lý trong hàm generateResponse(). Có không cần xử lý trước 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 các suy luận. Đối với phân loại văn bản, điều này có nghĩa là trả về các danh mục có thể cho văn bản nhập.

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

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

Để hiện câu trả lời theo thời gian thực, hãy sử dụng:

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

Xử lý và hiện kết quả

API suy luận LLM trả về một chuỗi, bao gồm cả văn bản phản hồi đã 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

API dự đoán LLM Mediapipe có thể được định cấu hình để hỗ trợ Điều chỉnh thứ hạng thấp (LoRA) cho các mô hình ngôn ngữ lớn. Bằng cách sử dụng 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 mô hình ngôn ngữ lớn 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 API suy luận LLM hoạt động cho 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ú ý. Chiến dịch này triển khai ban đầu đóng vai trò là API thử nghiệm cho các phát triển trong tương lai với kế hoạch hỗ trợ thêm nhiều mô hình và nhiều loại lớp trong thời gian tới bản cập nhật.

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 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ợ, Gemma-2B hoặc Phi-2. Các mô hình Gemma-2B và Phi-2 đều có sẵn trên HugingFace ở định dạng safetytensors. Vì LLM suy luận 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ú ý 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 được tinh chỉnh và có thể truy cập công khai phù hợp với API suy luận LLM (mô hình ngôn ngữ lớn) có trên HuggingFace. Ví dụ: monsterapi/gemma-2b-lora-maths-orca-200k cho Gemma-2B và lole25/phi-2-sft-ultrachat-lora cho Phi-2.

Sau khi huấn luyện trê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 trọng số của mô hình LoRA đã được tinh chỉnh. Tệp safetytensors 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 trọng số mô hình thành Bộ đệm phẳng TensorFlow Lite bằ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. Lưu ý rằng vì API chỉ hỗ trợ suy luận LoRA với 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 này sẽ xuất 2 tệp bộ đệm phẳng TFLite, một tệp cho mô hình cơ sở và quy tắc còn lại dành cho mô hình LoRA.

Suy luận mô hình LoRA

API suy luận LLM cho web, Android và iOS được cập nhật để hỗ trợ suy luận mô hình LoRA. Web hỗ trợ LoRA động, có thể chuyển đổi nhiều mô hình LoRA trong thời gian chạy. Android và iOS hỗ trợ LoRA tĩnh, sử dụng cùng các 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 các thứ hạng LoRA sẽ được sử 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;
});