Hướng dẫn dự đoán LLM dành cho iOS

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 iOS. Bạn có thể dùng các mô hình 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 ứng dụng iOS 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ã

Mã ví dụ về MediaPipe Tasks là cách triển khai cơ bản của ứng dụng API suy luận LLM dành cho iOS. Bạn có thể dùng ứng dụng này làm điểm xuất phát cho ứng dụng iOS 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ã mẫu LLM Inference API được lưu trữ trên GitHub.

Tải mã xuống

Hướng dẫn sau đây chỉ cho bạn cách tạo bản sao cục bộ của mã ví dụ bằng công cụ dòng lệnh git.

Cách tải mã ví dụ xuống:

  1. Sao chép kho lưu trữ git bằng lệnh sau:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Bạn có thể tuỳ ý định cấu hình thực thể git để sử dụng quy trình thanh toán thưa thớt, vì vậy, bạn chỉ có các tệp dành cho ứng dụng mẫu LLM Inference API:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/ios/
    

Sau khi tạo phiên bản cục bộ của mã ví dụ, bạn có thể cài đặt thư viện tác vụ MediaPipe, mở dự án bằng Xcode và chạy ứng dụng. Để biết hướng dẫn, hãy xem Hướng dẫn thiết lập dành cho iOS.

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 để 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 nhằm sử dụng các tác vụ MediaPipe, 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 iOS.

Phần phụ thuộc

API suy luận LLM sử dụng thư viện MediaPipeTasksGenai và bạn phải cài đặt thư viện này bằng CocoaPods. Thư viện này tương thích với cả ứng dụng Swift và Objective-C, đồng thời không yêu cầu thiết lập thêm tuỳ theo ngôn ngữ.

Để biết hướng dẫn cài đặt CocoaPods trên macOS, hãy tham khảo Hướng dẫn cài đặt CocoaPods. Để biết hướng dẫn về cách tạo Podfile với các nhóm cần thiết cho ứng dụng của bạn, hãy tham khảo bài viết Sử dụng CocoaPods.

Thêm nhóm MediaPipeTasksGenai trong Podfile bằng đoạn mã sau:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

Nếu ứng dụng của bạn có các mục tiêu kiểm thử đơn vị, hãy tham khảo Hướng dẫn thiết lập dành cho iOS để biết thêm thông tin về cách thiết lập Podfile.

Mẫu

Tác vụ API suy luận LLM của MediaPipe cần có một mô hình đã huấn luyện tương thích với tác vụ này. Để 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 nội dung tổng quan về tác vụ, phần Mô hình.

Tải mô hình xuống

Tải một mô hình xuống rồi thêm mô hình đó vào thư mục dự án của bạn bằng Xcode. Để biết hướng dẫn về cách thêm tệp vào dự án Xcode, hãy tham khảo bài viết Quản lý tệp và thư mục trong dự án Xcode.

Tải Gemma 2B xuống

Khi tạo ứng dụng iOS, hãy sử dụng một trong các biến thể sau:

  • gemma-2b-it-cpu-int4: Mô hình 4 bit Gemma có khả năng tương thích với CPU.
  • gemma-2b-it-gpu-int4: Mô hình Gemma 4 bit có khả năng tương thích với GPU.
  • Các mô hình được ánh xạ bằng AI Edge Torch phù hợp với yêu cầu về bộ nhớ của iOS.

Để biết thêm thông tin về các mô hình khác, hãy xem phần Mô hình tổng quan về tác vụ.

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

Bạn có thể tạo tác vụ API Suy luận LLM bằng cách gọi một trong các trình khởi tạo của nó. Trình khởi tạo LlmInference(options:) đặt giá trị cho các tuỳ chọn cấu hình.

Nếu không cần khởi chạy LLM Inference API bằng các tuỳ chọn cấu hình tuỳ chỉnh, bạn có thể sử dụng trình khởi tạo LlmInference(modelPath:) để tạo một API suy luận LLM với các tuỳ chọn mặc định. Để biết thêm thông tin về các lựa chọn cấu hình, hãy xem phần Tổng quan về cấu hình.

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

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let LlmInference = try LlmInference(options: options)

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 đối với ứng dụng iOS:

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
loraPath Đường dẫn tuyệt đối đến mô hình LoRA 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. PATH Không áp dụng

Chuẩn bị dữ liệu

API Suy luận LLM hoạt động với dữ liệu văn bản. 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(inputText:). Bạn không cần phải xử lý trước văn bản nhập trước.

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

Chạy tác vụ

Để chạy LLM Inference API, hãy dùng phương thức generateResponse(inputText:). API Suy luận LLM trả về các danh mục có thể có cho văn bản đầu vào.

let result = try LlmInference.generateResponse(inputText: inputPrompt)

Để tạo câu trả lời theo thời gian thực, hãy sử dụng phương thức generateResponseAsync(inputText:).

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

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

LLM Inference API trả về một LlmInferenceResult, bao gồm cả 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ụ.

iOS hỗ trợ LoRA tĩnh trong quá trình khởi chạy. Để tải một mô hình LoRA, người dùng sẽ chỉ định đường dẫn mô hình LoRA cũng như mô hình ngôn ngữ lớn cơ sở.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let LlmInference = try LlmInference(options: options)

Để chạy dự đoán LLM bằng LoRA, hãy sử dụng cùng một phương thức generateResponse() hoặc generateResponseAsync() làm mô hình cơ sở.