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

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 iOS. 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 iOS.

Tác vụ này hỗ trợ các biến thể sau của Gemma: Gemma-2 2B, Gemma 2B và Gemma 7B. Gemma là một gia đình gồm các 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 ra các mô hình Gemini. Công cụ này cũng hỗ trợ các mô hình bên ngoài sau: Phi-2, Falcon-RW-1BStableLM-3B.

Ngoài các mô hình được hỗ trợ, người dùng có thể sử dụng AI Edge Torch của Google để xuất mô hình PyTorch sang mô hình LiteRT (tflite) nhiều chữ ký, được đóng gói với các tham số trình phân tích cú pháp để tạo Gói tác vụ tương thích với API suy luận LLM.

Bạn có thể xem cách thực hiện nhiệm vụ này thông qua màn hình 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.

Ví dụ về mã

Mã ví dụ về Tác vụ MediaPipe là cách triển khai cơ bản của ứng dụng API suy luận LLM cho iOS. Bạn có thể sử 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ã ví dụ về API suy luận LLM được lưu trữ trên GitHub.

Tải mã xuống

Hướng dẫn sau đây cho bạn biết 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ã mẫu 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ể định cấu hình thực thể git để sử dụng tính năng kiểm tra thư mục thưa, nhờ đó bạn chỉ có các tệp cho ứng dụng mẫu API suy luận LLM:

    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 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à dự án mã để sử dụng API suy luận LLM. Để biết thông tin chung về cách thiết lập môi trường phát triển cho việc 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 cho iOS.

Phần phụ thuộc

API suy luận LLM sử dụng thư viện MediaPipeTasksGenai. 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 và không yêu cầu thiết lập bổ sung 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 bằng các pod cần thiết cho ứng dụng, hãy tham khảo phần Sử dụng CocoaPods.

Thêm nhóm MediaPipeTasksGenai trong Podfile bằng 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 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 MediaPipe yêu cầu một mô hình đã được 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 đã huấn luyện có sẵn cho API suy luận LLM, hãy xem phần Mô hình trong phần tổng quan về tác vụ.

Tải mô hình xuống

Tải một mô hình xuống và thêm mô hình đó vào thư mục dự á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 phần Quản lý tệp và thư mục trong dự án Xcode.

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:

  • Gemma-2 2B: Phiên bản mới nhất của dòng mô hình Gemma. Một phần của một 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 mô hình Gemini.
  • Gemma 2B: Một phần của gia đình các 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 nhiệm vụ tạo văn bản, bao gồm cả trả lời câu hỏi, tóm tắt và suy luận.
  • Phi-2: Mô hình Transformer có 2, 7 tỷ tham số, phù hợp nhất với định dạng Câu hỏi-Trả lời, trò chuyện và mã.
  • Falcon-RW-1B: Mô hình chỉ giải mã nhân quả có 1 tỷ 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ỉ có bộ giải mã thông số 3 tỷ đượ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ã.

Ngoài các mô hình được hỗ trợ, bạn có thể sử dụng AI Edge Torch của Google để xuất mô hình PyTorch sang mô hình LiteRT (tflite) nhiều chữ ký. Để biết thêm thông tin, hãy xem phần Trình chuyển đổi tạo sinh Torch cho các mô hình PyTorch.

Bạn nên sử dụng Gemma-2 2B có trên Kaggle Models. Để biết thêm thông tin về các mô hình khác hiện có, hãy xem phần Mô hình trong phần tổng quan về tác vụ.

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

API suy luận LLM tương thích với hai loại mô hình, 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
Các mẫu được hỗ trợ Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon MediaPipe Android, iOS, web .bin
Các mô hình PyTorch khác Tất cả mô hình LLM PyTorch Thư viện AI Edge Torch Generative Android, iOS .task

Chúng tôi đang lưu trữ các tệp .bin đã chuyển đổi cho Gemma 2B, Gemma 7B và Gemma-2 2B trên Kaggle. Bạn có thể triển khai trực tiếp các mô hình này bằng API suy luận LLM. Để 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.

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 API đó. Trình khởi chạy LlmInference(options:) đặt giá trị cho các tuỳ chọn cấu hình.

Nếu không cần API suy luận LLM được khởi tạo 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 API suy luận LLM bằng các tuỳ chọn mặc định. Để biết thêm thông tin về các tuỳ 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 tuỳ chọn cấu hình sau đây cho ứng dụng iOS:

Tên tuỳ chọn Mô tả Phạm vi 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. ĐƯỜ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
loraPath Đường dẫn tuyệt đối đến mô hình LoRA cục bộ 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. ĐƯỜNG DẪN 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 xử lý quá trình xử lý trước đầu vào dữ liệu, bao gồm cả việc tạo mã thông báo và xử lý trước tensor.

Tất cả hoạt động 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 đầu vào.

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

Chạy tác vụ

Để chạy API suy luận LLM, hãy sử 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)

Để truyền trực tuyến phản hồi, 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ả

API suy luận LLM trả về 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ợ tính năng Điều chỉnh theo thứ hạ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 LLM thông qua một quy trình huấn luyện tiết kiệm chi phí.

Tính năng hỗ trợ LoRA của API suy luận LLM hoạt động cho tất cả các biến thể Gemma và mô hình Phi-2 cho phần phụ trợ GPU, với 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à một API thử nghiệm cho các hoạt động phát triển trong tương lai, với kế hoạch hỗ trợ nhiều mô hình và nhiều loại lớp hơn trong các 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ô hình LoRA được tinh chỉnh trên tập dữ liệu của riêng bạn bằng các loại mô hình được hỗ trợ, Gemma hoặc Phi-2. Các mô hình Gemma-2 2B, Gemma 2BPhi-2 đều có trên HuggingFace ở định dạng safetensors. Vì API suy luận LLM chỉ hỗ trợ LoRA trên các lớp chú ý, nên chỉ chỉ định các lớp chú ý trong khi tạo LoraConfig như sau:

# 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"],
)

Để thử nghiệm, có các mô hình LoRA được tinh chỉnh công khai phù hợp với API suy luận LLM 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 một tệp adapter_model.safetensors chứa các trọng số mô hình LoRA được tinh chỉnh. Tệp safetensors 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 Flatbuffer của 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. 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)

Trình chuyển đổi sẽ xuất ra hai tệp flatbuffer 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 suy luận LLM cho Web, Android và iOS được cập nhật để hỗ trợ suy luận mô hình LoRA.

iOS hỗ trợ LoRA tĩnh trong quá trình khởi chạy. Để tải mô hình LoRA, người dùng chỉ định đường dẫn mô hình LoRA cũng như LLM 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 quy trình suy luận LLM bằng LoRA, hãy sử dụng các phương thức generateResponse() hoặc generateResponseAsync() giống như mô hình cơ sở.