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

API suy luận LLM (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ị dành cho các ứng dụng iOS mà bạn có thể dùng để thực hiện nhiều tác vụ, chẳng hạn như 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 iOS.

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ã

Mã ví dụ MediaPipe Tasks là cách triển khai cơ bản của API suy luận LLM dành cho iOS. Bạn có thể sử dụng ứng dụng làm điểm khởi đầu cho ứng dụng iOS của riêng mình hoặc tham chiếu đến phần này khi sửa đổi ứng dụng hiện có. Mã ví dụ cho API suy luận LLM là được lưu trữ trên GitHub.

Tải mã xuống

Các hướng dẫn sau đây chỉ cho bạn cách tạo bản sao trên máy của 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ể đị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 có chỉ các tệp cho ứng dụng ví dụ cho LLM suy luận 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 nhiệm vụ MediaPipe, hãy mở dự án bằng Xcode rồi chạy ứng dụng. Cho 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à mã dự án để sử dụng LLM suy luận API. Để biết thông tin chung về cách thiết lập môi trường phát triển để sử dụng các tác vụ MediaPipe, bao gồm cả 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 và bạn phải cài đặt thư viện này bằng cách sử dụng CocoaPods. Thư viện này tương thích với cả ứng dụng Swift và GOAL-C và không yêu cầu thiết lập theo ngôn ngữ cụ thể nào khác.

Để biết hướng dẫn cài đặt CocoaPods trên macOS, hãy tham khảo CocoaPods hướng dẫn cài đặt. Để xem hướng dẫn về cách tạo Podfile với các nhóm cần thiết cho ứng dụng, hãy tham khảo Việc 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ó 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 của bạn.

Mẫu

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

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. Cho hướng dẫn về cách thêm tệp vào dự án Xcode của bạn, hãy tham khảo bài viết Quản lý tệp và các thư mục trong Xcode của bạn dự án.

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 Gemma 4 bit 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.
  • AI Edge Torch đã liên kết những mô hình tuân thủ yêu cầu về bộ nhớ iOS.

Để biết thêm thông tin về các mô hình khác, hãy xem bài viết Mô hình tổng quan về công việc .

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 LLM đó. Chiến lược phát hành đĩ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 bạn không cần API suy luận LLM được khởi chạy bằng 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 lựa chọn mặc định. Để biết thêm thông tin về cấu hình hãy xem phần Configuration Overview (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

Nhiệm vụ này có các lựa chọn cấu hình sau đây cho ứng dụng iOS:

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
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ẫu 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 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(inputText:). Không cần xử lý trước thêm văn bản nhập.

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:). Chiến lược phát hành đĩa đơn 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 kết quả

API suy luận LLM trả về một LlmInferenceResult, bao gồm cả dữ liệu đã tạo nội dung phản hồi.

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

iOS hỗ trợ LoRA tĩnh trong quá trình khởi chạy. Để tải mô hình LoRA, người dùng sẽ 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 dự đoán LLM bằng LoRA, hãy sử dụng cùng các phương thức generateResponse() hoặc generateResponseAsync() làm mô hình cơ sở.