Chạy các Mô hình Transformer Lớn trên Thiết bị Di động và Biên

Chạy các Mô hình Transformer Lớn trên Thiết bị Di động và Biên

  • 40 min read
Chạy các Mô hình Transformer Lớn trên Thiết bị Di động và Biên
Chạy các Mô hình Transformer Lớn trên Thiết bị Di động và Biên

Chạy các Mô hình Transformer Lớn trên Thiết bị Di động và Thiết bị Biên

Chạy các mô hình học máy trên thiết bị di động và môi trường biên đã trở thành một chủ đề quan trọng ngày càng tăng trong những năm gần đây. Đặc biệt, việc chạy các mô hình ngôn ngữ lớn dựa trên Transformer trực tiếp trên thiết bị thay vì trên đám mây mang lại những lợi thế đáng kể về quyền riêng tưđộ trễ thấp. Quyền riêng tư của người dùng được bảo vệ vì dữ liệu không bao giờ rời khỏi thiết bị và khả năng nhận phản hồi theo thời gian thực xuất hiện khi độ trễ mạng được loại bỏ. Tuy nhiên, hàng triệu tham số và yêu cầu tính toán cao của các mô hình lớn này làm cho việc chạy chúng một cách hiệu quả dưới các ràng buộc về bộ xử lý và bộ nhớ của thiết bị di động trở nên thách thức.

Trong bài viết này, chúng ta sẽ đề cập đến các kỹ thuật tối ưu hóa mô hìnhcông cụ cần thiết để chạy các mô hình Transformer lớn trên thiết bị di động và thiết bị biên. Trong hệ sinh thái Hugging Face, chúng ta sẽ xem xét các cách làm cho mô hình phù hợp với thiết bị di động (như lượng tử hóa, chưng cất kiến thức và cắt tỉa mô hình) và chi tiết các phương pháp triển khai bằng cách sử dụng các công nghệ và công cụ như ONNX, Core MLHugging Face Optimum. Chúng ta sẽ bao gồm các giải thích kỹ thuật và các đoạn mã để hướng dẫn các nhà phát triển di động và kỹ sư AI, cùng với các ví dụ thực tế.

Tại sao lại Chạy Mô hình Trên Thiết bị?

Chạy mô hình trực tiếp trên thiết bị thay vì trên cơ sở hạ tầng đám mây có một số ưu điểm:

  • Quyền riêng tư: Dữ liệu người dùng không rời khỏi thiết bị, cho phép xử lý thông tin nhạy cảm mà không cần gửi lên đám mây. Ví dụ, Apple đã nhấn mạnh rằng việc chạy các mô hình ngôn ngữ lớn trên thiết bị bảo vệ quyền riêng tư của người dùng. Cách tiếp cận này rất quan trọng để đảm bảo quyền riêng tư dữ liệu trong các lĩnh vực như y tế hoặc tài chính.
  • Độ trễ thấp: Đầu ra của mô hình có thể được nhận ngay lập tức mà không cần kết nối internet. Các ứng dụng có thể phản hồi theo thời gian thực vì không có lưu lượng mạng hoặc độ trễ máy chủ. Điều này đặc biệt quan trọng đối với các ứng dụng quan trọng về thời gian như thực tế tăng cường, trợ lý giọng nói hoặc thiết bị tự hành.
  • Sử dụng ngoại tuyến: Các ứng dụng di động có thể tiếp tục hoạt động ngay cả khi không có kết nối internet. Ví dụ, một ứng dụng dịch thuật có thể thực hiện dịch ngoại tuyến bằng cách lưu trữ một mô hình Transformer đã được huấn luyện trước trên thiết bị.
  • Chi phí và Khả năng mở rộng: Việc liên tục chạy mô hình trên máy chủ đám mây có thể tốn kém. Đối với các ứng dụng có hàng triệu người dùng, việc chạy mô hình trên thiết bị của người dùng thay vì thực hiện các yêu cầu đám mây riêng biệt cho từng khách hàng sẽ giảm chi phí máy chủ. Hơn nữa, các bộ xử lý mạnh mẽ trên thiết bị (như Apple Neural Engine, Qualcomm Hexagon DSP) thường có dung lượng rảnh rỗi – AI trên thiết bị sử dụng hiệu quả phần cứng hiện có này.

Tất nhiên, chạy các mô hình lớn trên thiết bị có một số thách thức. Các trở ngại bao gồm yêu cầu bộ nhớ cao, thời lượng pin hạn chế, sức mạnh tính toán hạn chế của bộ xử lý di động và các ràng buộc về nhiệt. Dưới đây, chúng ta sẽ thảo luận về các kỹ thuật nén và tăng tốc mô hình thường được sử dụng để vượt qua những thách thức này.

Các Phương pháp để Thu nhỏ và Tăng tốc các Mô hình Lớn

Để làm cho một mô hình học máy lớn hoạt động hiệu quả trong môi trường di động, cần phải giảm kích thước và tải tính toán của nó. Trong số các phương pháp phổ biến nhất là lượng tử hóa, chưng cất kiến thứccắt tỉa mô hình. Các kỹ thuật này thường có thể được sử dụng cùng nhau để đạt được việc giảm mô hình đáng kể. Dưới đây, chúng tôi sẽ trình bày chi tiết từng phương pháp dưới các tiêu đề riêng biệt.

Lượng tử hóa (Giảm Độ chính xác Số học)

Lượng tử hóa là quá trình giảm biểu diễn số học của trọng số và kích hoạt mô hình. Ví dụ, các cách tiếp cận phổ biến bao gồm sử dụng dấu phẩy động 16 bit (FP16) hoặc số nguyên 8 bit (INT8) thay vì dấu phẩy động 32 bit (FP32). Điều này làm giảm đáng kể kích thước mô hình và việc sử dụng bộ nhớ (chuyển từ FP32 sang INT8 mang lại mức giảm kích thước khoảng 4 lần). Đồng thời, các phép tính có số bit thấp có thể chạy nhanh hơn với sự hỗ trợ phần cứng thích hợp (ví dụ: các phép toán vector, bộ tăng tốc GPU hoặc NPU).

Lượng tử hóa có thể là tĩnh hoặc động. Lượng tử hóa động chuyển đổi trọng số sang định dạng số nguyên tại thời điểm chạy và thường chỉ lượng tử hóa các trọng số (kích hoạt vẫn có thể là FP32). Cách tiếp cận này không yêu cầu huấn luyện bổ sung và được sử dụng để tăng tốc các lớp cụ thể trong các mô hình Transformer (ví dụ: phép nhân ma trận). Trong lượng tử hóa tĩnh (với huấn luyện nhận biết lượng tử hóa hoặc hiệu chuẩn sau huấn luyện), các phạm vi kích hoạt của mô hình được đo bằng một tập dữ liệu hiệu chuẩn, và cả trọng số lẫn kích hoạt đều được chuyển đổi sang biểu diễn bit thấp trước. Lượng tử hóa tĩnh thường mang lại kết quả tốt hơn về việc bảo tồn độ chính xác nhưng phức tạp hơn một chút (nó yêu cầu hiệu chuẩn mô hình).

Trong môi trường Hugging Face, thư viện Optimum cung cấp các công cụ lượng tử hóa dễ sử dụng với hỗ trợ ONNX Runtime. Ví dụ, xuất một mô hình Transformers sang định dạng ONNX và áp dụng lượng tử hóa động 8 bit có thể được thực hiện chỉ với vài dòng mã. Mã sau đây minh họa việc sử dụng Hugging Face Optimum để chuyển đổi mô hình DistilBERT sang định dạng ONNX và lượng tử hóa động nó cho tập lệnh AVX512-VNNI:

python from optimum.onnxruntime import ORTQuantizer, ORTModelForSequenceClassification from optimum.onnxruntime.configuration import AutoQuantizationConfig

Tải một mô hình PyTorch Transformers từ HF Hub dưới dạng ONNX

onnx_model = ORTModelForSequenceClassification.from_pretrained( “distilbert-base-uncased-finetuned-sst-2-english”, export=True )

Tạo đối tượng lượng tử hóa

quantizer = ORTQuantizer.from_pretrained(onnx_model)

Xác định cấu hình lượng tử hóa (ví dụ: cho AVX512_VNNI, động và không theo kênh)

qconfig = AutoQuantizationConfig.avx512_vnni(is_static=False, per_channel=False)

Lượng tử hóa mô hình và lưu kết quả

quantizer.quantize(save_dir=“quantized-model/”, quantization_config=qconfig)

Kết quả của quy trình trên là tất cả các lớp được hỗ trợ của mô hình được biểu diễn dưới dạng số nguyên 8 bit trong ONNX. Thư viện Optimum trừu tượng hóa các công cụ lượng tử hóa ONNX Runtime, đơn giản hóa quy trình này. Cũng có thể làm tương tự với lệnh một dòng:

bash optimum-cli onnxruntime quantize –onnx_model onnx_model_folder/ –arm64 -o onnx_quantized/

Cờ –arm64 trong lệnh chọn chế độ lượng tử hóa phù hợp cho các bộ xử lý di động dựa trên ARM (ví dụ: dựa trên số nguyên 8 bit thông qua SIMD). Optimum CLI có thể tự động xác định cài đặt lượng tử hóa tốt nhất cho các mục tiêu phần cứng khác nhau như ARM64, AVX2 và AVX512. Mô hình được lượng tử hóa sẽ nhỏ hơn nhiều so với bản gốc và mang lại khả năng tăng tốc trên phần cứng được hỗ trợ. Ví dụ, lượng tử hóa 8 bit của một mô hình BERT làm giảm tệp mô hình xuống còn một phần tư kích thước, mang lại lợi thế cả về lưu trữ và bộ nhớ.

Hiệu suất: Việc tăng hiệu suất từ lượng tử hóa phụ thuộc vào phần cứng được sử dụng. Nhiều CPU di động có các đơn vị vector được tối ưu hóa cho phép nhân ma trận số nguyên 8 bit. Apple Neural Engine hoặc DSP/NPU được hỗ trợ bởi Android NNAPI cũng mang lại sự tăng tốc đáng kể cho các phép toán 8 bit. ONNX Runtime có thể tích hợp với NNAPI hoặc XNNPACK trên Android và Core ML trên iOS, cho phép các mô hình được lượng tử hóa hưởng lợi từ phần cứng này. Nếu phần cứng không hỗ trợ trực tiếp các phép toán 8 bit, mô hình được lượng tử hóa vẫn sẽ chạy, nhưng lợi ích có thể bị hạn chế. Ngoài ra, độ sâu bit thấp có thể dẫn đến một số mất mát độ chính xác, đặc biệt là trong các mô hình rất sâu. Do đó, đối với các ứng dụng quan trọng, các giải pháp đa độ chính xác (ví dụ: một số lớp là 8 bit, lớp khác là 16 bit) hoặc cải thiện độ chính xác thông qua tinh chỉnh sau lượng tử hóa được sử dụng.

Chưng cất Kiến thức (Knowledge Distillation)

Chưng cất kiến thức là một kỹ thuật nhằm mục đích chuyển giao kiến thức từ một mô hình giáo viên lớn, có khả năng cao cho một mô hình học sinh nhỏ hơn, nhanh hơn. Trong phương pháp này, mô hình học sinh được huấn luyện để bắt chước đầu ra hoặc các biểu diễn trung gian của mô hình giáo viên. Kết quả là, mô hình học sinh, mặc dù có ít tham số hơn và độ sâu ít hơn, có thể đạt được hiệu suất gần với mô hình giáo viên.

Chưng cất đã được áp dụng rất thành công, đặc biệt là cho các mô hình Transformer. Ví dụ, DistilBERT là một mô hình do nhóm Hugging Face tạo ra, nhỏ hơn và nhanh hơn 40% so với mô hình BERT gốc, đạt được điều này thông qua chưng cất. DistilBERT là phiên bản có khoảng 66 triệu tham số của mô hình BERT-Base và mang lại độ chính xác gần với BERT gốc. Được huấn luyện với ba hàm mất mát (mất mát ngôn ngữ, mất mát chưng cất và mất mát tương tự cosine), DistilBERT chứa 6 lớp Transformer thay vì 12 lớp của BERT, do đó giảm một nửa cả bộ nhớ và tải xử lý.

Tương tự, các mô hình như TinyBERTMobileBERT cũng được chưng cất từ mô hình giáo viên BERT. MobileBERT là một mô hình được tối ưu hóa cho thiết bị di động, được Google tạo ra bằng cách sửa đổi cấu trúc của mô hình BERT lớn (thêm các lớp nút cổ chai và phép biến đổi tuyến tính). MobileBERT có khoảng 25 triệu tham số và đã được chứng minh là chạy nhanh hơn nhiều lần so với BERT-Base trên điện thoại Pixel. Một ví dụ khác, SqueezeBERT, giảm kích thước BERT bằng cách kết hợp cơ chế chú ý với cấu trúc khác và lấy cảm hứng từ các lớp tích chập; nó được báo cáo là chạy nhanh hơn 4,3 lần so với BERT-base trên điện thoại Pixel 3.

Ý tưởng cơ bản trong chưng cất là logit mềm hoặc đầu ra lớp trung gian của mô hình giáo viên sẽ hướng dẫn mô hình học sinh. Mô hình học sinh cố gắng học các phân phối xác suất do mô hình giáo viên dự đoán và, nếu có sẵn, các bản đồ chú ý của nó. Điều này cho phép nó học cách mô hình giáo viên phân tán kiến thức của mình, thay vì chỉ học câu trả lời đúng. Cuối cùng, mô hình học sinh đạt được độ chính xác cao hơn so với một mô hình tương đương được huấn luyện từ đầu trên cùng một dữ liệu. Ví dụ, nếu một mô hình BERT-Base đạt 90% độ chính xác, một mô hình nhỏ được huấn luyện trên cùng dữ liệu có thể chỉ đạt 85%; nhưng với chưng cất, mô hình nhỏ này có thể đạt gần 88-89% độ chính xác.

Ưu điểm: Các mô hình được áp dụng chưng cất kiến thức thường nhỏ gọn hơnnhanh hơn. Điều này cực kỳ quan trọng đối với các ứng dụng thời gian thực trên thiết bị di động. Một lợi ích khác của chưng cất là nếu mô hình giáo viên đã được huấn luyện trước trên một lượng lớn dữ liệu, mô hình học sinh có thể đạt được sự tổng quát hợp lý với ít dữ liệu hơn – giống như nó được hưởng lợi từ kinh nghiệm của giáo viên. Thật vậy, một giáo viên có thể được chuyển giao cho nhiều học sinh, do đó tạo ra các họ mô hình có kích thước khác nhau. Các nhà nghiên cứu của NVIDIA báo cáo rằng khi họ giảm mô hình Llama 3.1 (8 tỷ tham số) xuống các mô hình Minitron có 4 tỷ và 2,7 tỷ tham số bằng cách sử dụng chưng cất và cắt tỉa, các mô hình nhỏ hơn này hoạt động gần với bản gốc nhưng yêu cầu ít tính toán hơn nhiều. Họ cũng tuyên bố rằng chưng cất đã giảm 40 lần lượng dữ liệu cần thiết để huấn luyện mô hình 8 tỷ tham số.

Những điều cần lưu ý: Khi áp dụng chưng cất, kiến trúc mô hình học sinh thường được xác định trước (ví dụ: một nửa số lớp, kích thước ẩn hẹp hơn, v.v.). Nếu mô hình học sinh được chọn quá nhỏ, có nguy cơ nó không thể hấp thụ hoàn toàn kiến thức của mô hình giáo viên – đây được gọi là khoảng cách năng lực trong tài liệu (nếu năng lực của học sinh không đủ để đại diện cho giáo viên, hiệu suất sẽ giảm). Do đó, trong thực tế, kích thước của mô hình học sinh phải được cân bằng với các yêu cầu của tác vụ mục tiêu. Ngoài ra, quy trình huấn luyện chưng cất có thể phức tạp hơn huấn luyện tiêu chuẩn, vì nó liên quan đến việc tối ưu hóa nhiều thuật ngữ mất mát đồng thời. Tuy nhiên, các framework hiện đại (ví dụ: hỗ trợ chưng cất trong API Trainer của Hugging Face hoặc các script huấn luyện do Tencent cung cấp cho TinyBERT) đang làm cho quy trình này dễ dàng hơn. Tóm lại, các mô hình được chưng cất mang đến giải pháp cho các ứng dụng di động gần như tốt như mô hình giáo viên, nhưng hiệu quả hơn nhiều.

Cắt tỉa Mô hình (Model Pruning)

Cắt tỉa mô hình là quá trình làm cho mô hình nhỏ hơn và nhanh hơn bằng cách loại bỏ (thiết lập về 0) một số phần của nó. Quy trình cắt tỉa có thể là không có cấu trúc hoặc có cấu trúc.

  • Cắt tỉa không có cấu trúc: Điều này có nghĩa là thiết lập các trọng số có tầm quan trọng nhỏ nhất trong một ma trận trọng số thành 0. Ví dụ, thiết lập 20% trọng số trong một lớp thành 0 làm cho các tham số mô hình trở nên thưa thớt. Cách tiếp cận này không trực tiếp giảm kích thước tệp mô hình (số 0 vẫn chiếm không gian), nhưng nó có thể mang lại sự tăng tốc nếu các runtime đặc biệt có thể bỏ qua phép tính cho các số 0 này. Thật không may, nhiều trình biên dịch tiêu chuẩn không hiệu quả trong việc bỏ qua số 0, vì vậy việc tăng tốc từ cắt tỉa không có cấu trúc thuần túy trên thiết bị di động có thể bị hạn chế. Tuy nhiên, cắt tỉa không có cấu trúc có thể giảm tải băng thông bộ nhớ và được sử dụng như một bước tiền tối ưu hóa.
  • Cắt tỉa có cấu trúc: Điều này liên quan đến việc loại bỏ hoàn toàn các phần tử nhất định khỏi cấu trúc mô hình. Ví dụ, cắt tỉa hoàn toàn một số đầu chú ý (attention heads) trong một mô hình Transformer hoặc loại bỏ một số lớp là cắt tỉa có cấu trúc. Bằng cách này, các phần bị cắt tỉa không được tính toán chút nào, và kích thước mô hình thực sự bị thu nhỏ. Ví dụ, có thể thu được một mô hình có ít đầu chú ý hơn bằng cách cắt tỉa các đầu chú ý có ý nghĩa thấp nhất từ mỗi lớp trong mô hình BERT. Cắt tỉa có cấu trúc là một tối ưu hóa nâng cao hơn và thường yêu cầu mô hình phải được huấn luyện lại (tinh chỉnh) sau khi cắt tỉa, vì việc xóa đột ngột một số neuron có thể gây ra sự sụt giảm hiệu suất đáng kể. Huấn luyện lại cho phép các phần còn lại của mô hình phục hồi và hiệu suất tăng lên.

Nghiên cứu hiện tại đã chỉ ra rằng việc kết hợp cắt tỉa với chưng cất là rất hiệu quả. Trong nghiên cứu Minitron của NVIDIA đã đề cập ở trên, họ đầu tiên cắt tỉa mô hình Llama 8B dựa trên lớp và chiều rộng xuống còn 4 tỷ tham số, sau đó lấy lại hiệu suất của nó bằng cách chưng cất. Bằng cách này, mô hình đã cắt tỉa đạt được điểm kiểm tra tổng thể tốt hơn 16% (MMLU) so với huấn luyện ban đầu. Hugging Face cũng đã đạt được sự tăng tốc tương tự bằng cách sử dụng cắt tỉa khối trên mô hình BLOOM, chẳng hạn (các nghiên cứu cắt tỉa có cấu trúc GLU tồn tại). Một ứng dụng khác của cắt tỉa là cung cấp tính linh hoạt cho tiêu thụ tài nguyên hạn chế trong một mô hình: Ví dụ, bạn có thể tạo ra các phiên bản kích thước khác nhau của một mô hình (ví dụ: phiên bản 100 triệu, 50 triệu, 10 triệu tham số) từ cùng một mô hình cơ sở thông qua cắt tỉa và chọn phiên bản phù hợp dựa trên năng lực của thiết bị.

Tích hợp với Optimum-Intel: Thư viện Hugging Face Optimum-Intel cung cấp cắt tỉa và lượng tử hóa tích hợp với các công cụ như Intel Neural Compressor (INC) và Neural Network Compression Framework (NNCF). Ví dụ, cấu trúc INCTrainer trong Optimum có thể tự động cắt tỉa trọng số mô hình tại các bước nhất định trong quá trình huấn luyện. Một ví dụ về cấu hình được hiển thị bên dưới:

python from optimum.intel.neural_compressor import INCTrainer from neural_compressor import WeightPruningConfig

pruning_config = WeightPruningConfig( pruning_type=“magnitude”, target_sparsity=0.2, pruning_scope=“local”, # …các bước bắt đầu/kết thúc, v.v. )

trainer = INCTrainer( model=model, args=TrainingArguments(…), train_dataset=…, pruning_config=pruning_config, # … các tham số Trainer khác ) trainer.train() trainer.save_model(“pruned_model”)

Cấu hình như trên sẽ đặt các trọng số nhỏ nhất thành 0 với một tỷ lệ nhất định trong mỗi bước huấn luyện. Tuy nhiên, cắt tỉa dựa trên độ lớn (magnitude-based pruning) này, như đã thấy trong cấu hình, đặt các trọng số thành 0 theo cách “cục bộ” và theo tỷ lệ. Điều này không làm giảm kích thước mô hình; nó chỉ có nghĩa là 20% trọng số trở thành 0. Để kích thước mô hình thực sự thu nhỏ, các trọng số này cần được loại bỏ (xóa hàng/cột) sau khi đủ số lượng đã được đặt về 0. Có thể thực hiện cắt tỉa có cấu trúc bằng Optimum-Intel với NNCF, và phương pháp này có thể thực sự tạo ra các tệp mô hình nhỏ hơn.

Điểm chính: Khi áp dụng cắt tỉa, người ta phải cẩn thận rằng việc cắt tỉa quá mạnh có thể làm giảm năng lực mô hình và dẫn đến giảm độ chính xác. Thông thường, tỷ lệ cắt tỉa từ 10-30% (độ thưa mục tiêu) mang lại sự tăng tốc với sự suy giảm hiệu suất nhỏ. Tỷ lệ cắt tỉa cao (ví dụ: 80-90%) chỉ khả thi nếu được bù đắp bằng chưng cất hoặc các kỹ thuật huấn luyện lại đặc biệt. Hơn nữa, lợi ích thực tế đạt được nếu cơ sở hạ tầng được sử dụng để chạy các mô hình được cắt tỉa có thể tăng tốc các phép toán ma trận thưa thớt (ví dụ: NVIDIA cuSparse hoặc thư viện thưa thớt trên CPU). Các thư viện suy luận phổ biến trên thiết bị di động chưa thực sự hiệu quả với phép nhân ma trận thưa thớt, vì vậy trong các tình huống di động thực tế, cắt tỉa có cấu trúc nên được ưu tiên. Ví dụ, cắt tỉa toàn bộ đầu chú ý hoặc loại bỏ toàn bộ một lớp đều giảm kích thước mô hình và trực tiếp có nghĩa là ít phép tính hơn trên thiết bị di động.

Tóm lại, bằng cách sử dụng các kỹ thuật lượng tử hóa, chưng cất và cắt tỉa cùng nhau, kích thước và thời gian chạy của một mô hình Transformer ban đầu có thể được giảm đi rất nhiều. Ví dụ, hãy lấy mô hình BERT-base: 110 triệu tham số, sử dụng ~440 MB bộ nhớ với trọng số FP32, và có lẽ nó có thể xử lý vài câu mỗi giây trên CPU di động. Giả sử chúng ta giảm mô hình xuống còn 66 triệu tham số bằng cách chưng cất (DistilBERT), chuyển sang trọng số 8 bit bằng cách lượng tử hóa (110 MB), và cắt tỉa một số đầu chú ý, để lại 60 triệu tham số hiệu quả. Mô hình kết quả có thể có kích thước dưới ~100 MB và, với thư viện di động được tối ưu hóa, có thể cung cấp phản hồi gần như thời gian thực trên thiết bị một cách thoải mái. Thật vậy, các mô hình như TinyBERTMiniLM trong thư viện Hugging Face Transformers đã được huấn luyện với các kỹ thuật như vậy và đã trở nên phổ biến cho việc sử dụng trên thiết bị di động.

Chuyển đổi Mô hình và Phương pháp Runtime cho Thiết bị Di động

Sau khi thu nhỏ mô hình của chúng ta bằng các kỹ thuật tối ưu hóa hoặc chọn một mô hình nhỏ ngay từ đầu, vấn đề chạy (suy luận) nó trên nền tảng di động sẽ phát sinh. Có các định dạng mô hình và tùy chọn runtime khác nhau cho các nền tảng di động khác nhau (Android, iOS, thiết bị IoT, v.v.). Trong phần này, chúng ta sẽ mô tả các phương pháp phổ biến như ONNX, Core MLTensorFlow Lite, và các cách chuyển đổi sang các định dạng này bằng chuỗi công cụ Hugging Face. Chúng ta cũng sẽ thảo luận về khả năng tương thích phần cứng và đặc điểm hiệu suất của các phương pháp này.

Triển khai Độc lập Nền tảng với ONNX và ONNX Runtime

ONNX (Open Neural Network Exchange) là một định dạng trung gian được hỗ trợ rộng rãi cho phép trao đổi mô hình giữa các framework học máy khác nhau. Ngay cả khi các mô hình Transformer được huấn luyện trong PyTorch hoặc TensorFlow, chúng có thể được xuất sang định dạng ONNX và chạy trong nhiều môi trường khác nhau, bao gồm cả thiết bị di động. Ưu điểm của ONNX là nó có các định nghĩa chuẩn hóa cho từng phép toán. Điều này có nghĩa là khi bạn chuyển đổi mô hình của mình sang ONNX, bất kỳ cơ sở hạ tầng nào hỗ trợ nó đều có thể diễn giải mô hình đó. Ví dụ, có thể chuyển đổi một mô hình được huấn luyện bằng PyTorch sang ONNX và sử dụng nó với TensorFlow.

Thư viện Hugging Face Transformers có một công cụ tích hợp để chuyển đổi mô hình sang ONNX. Bạn có thể xuất một mô hình phổ biến bằng một lệnh đơn giản. Ví dụ:

bash pip install transformers[onnx] # Các phụ thuộc cần thiết cho mô-đun xuất ONNX python -m transformers.onnx –model=distilbert-base-uncased –feature=sequence-classification onnx/

Lệnh trên sẽ lưu mô hình phân loại văn bản DistilBERT ở định dạng ONNX vào tệp onnx/model.onnx. Trong quá trình xuất, thư viện Transformers sử dụng các lớp config được hỗ trợ bởi mô hình tương ứng cho ONNX và cũng xác minh rằng các đầu ra được tạo ra chính xác. Nhiều kiến trúc được hỗ trợ (BERT, RoBERTa, GPT-2, T5, MobileBERT, SqueezeBERT, v.v., có các cấu hình ONNX sẵn sàng).

Tùy chọn phổ biến nhất để chạy một mô hình đã được chuyển đổi sang định dạng ONNX là thư viện ONNX Runtime (ORT). Được phát triển bởi Microsoft, ORT được sử dụng để chạy hiệu quả các mô hình ONNX trong cả môi trường máy chủ và di động. ORT cung cấp một cấu trúc mô-đun được gọi là Execution Providers để sử dụng các bộ tăng tốc khác nhau trên các thiết bị khác nhau. Các bộ tăng tốc quan trọng đối với thiết bị di động là:

  • CPU (Mặc định): Chế độ chạy trên hầu hết mọi thiết bị, sử dụng các thư viện được tối ưu hóa trên CPU thuần túy (ví dụ: XNNPACK). Đây là lựa chọn đáng tin cậy cho các mô hình nhỏ và trong trường hợp có vấn đề về nhiệt.
  • NNAPI (Android Neural Networks API): Giao diện do Android cung cấp để sử dụng phần cứng DSP, GPU hoặc NPU trên thiết bị Android. ONNX Runtime có thể kích hoạt chế độ NNAPI để chạy các phép toán được hỗ trợ trên các bộ tăng tốc đặc biệt của điện thoại. Điều này có thể mang lại lợi ích tăng tốc rất lớn, đặc biệt với các mô hình được lượng tử hóa (ví dụ: Qualcomm Hexagon DSP thực hiện các phép toán ma trận int8 nhanh hơn nhiều so với CPU).
  • Core ML (iOS): Đối với các thiết bị iPhone/iPad, ONNX Runtime có thể sử dụng trực tiếp cơ sở hạ tầng Core ML. Điều này cho phép các đơn vị như Apple Neural Engine được sử dụng.
  • XNNPACK: Đây là một thư viện tính toán CPU được tối ưu hóa có sẵn trên cả Android và iOS. Nó đặc biệt nhanh cho các phép toán float32 và float16 trên CPU di động. ORT có thể tự động sử dụng XNNPACK cho các mô hình không được lượng tử hóa.

Việc tích hợp mô hình ONNX vào ứng dụng di động yêu cầu thêm gói ORT tương ứng của nền tảng vào dự án và thực hiện một vài lệnh gọi API. ORT cung cấp các thư viện sẵn sàng cho Java, C++ và Swift/Obj-C. Ví dụ, trên Android, sau khi thêm gói .aar, bạn có thể tạo OrtEnvironment với giao diện Java, tải mô hình thông qua InferenceSession và chạy nó. Mã liên quan tương tự như sử dụng PyTorch hoặc TensorFlow, chỉ khác là framework. Cũng có thể lấy mô hình ONNX do Hugging Face cung cấp trực tiếp từ HF Hub vào ứng dụng; tuy nhiên, để kiểm soát kích thước ứng dụng, việc phân phối tệp mô hình cùng với ứng dụng thường được ưu tiên.

Hiệu suất và Kích thước: Phân phối di động của ONNX Runtime khá toàn diện theo mặc định và chiếm khoảng 10-15 MB không gian (vì nó bao gồm nhiều toán tử khác nhau). Tuy nhiên, kích thước này có thể được giảm bằng cách loại bỏ các phần không cần thiết (bản dựng tối thiểu). Ví dụ, có thể giảm thư viện ORT xuống còn 4-5 MB bằng cách chỉ biên dịch các toán tử được sử dụng bởi một mô hình cụ thể. Kích thước tệp mô hình ONNX tương tự như kích thước tệp trọng số PyTorch/TensorFlow gốc; nó sẽ nhỏ hơn nếu bạn đã lượng tử hóa nó. Kết hợp các kỹ thuật tối ưu hóa chúng ta đã đề cập ở trên với ONNX rất hiệu quả: bạn có thể đạt được hiệu quả tối đa cho cả mô hình và phần cứng bằng cách chạy mô hình được chưng cất và lượng tử hóa với ONNX Runtime + NNAPI.

Hãy đưa ra một ví dụ kịch bản: Giả sử người dùng sẽ phân loại một văn bản ngắn trong ứng dụng. Bạn đã chuyển đổi mô hình DistilBERT sang ONNX và lượng tử hóa nó thành 8 bit. Ứng dụng Android của bạn tải mô hình ONNX này bằng ORT. Khi ứng dụng nhận đầu vào văn bản, nó trước tiên sẽ mã hóa câu bằng Hugging Face Tokenizer (ví dụ: AutoTokenizer) và chuyển đổi nó thành các mảng numpy, sau đó đưa nó cho ORT. ORT, ở chế độ nền, sử dụng NNAPI nếu có để tận dụng các bộ tăng tốc khác ngoài CPU. Kết quả là, nó nhận được kết quả phân loại trong mili giây và hiển thị cho người dùng. Quy trình này nhanh hơn và riêng tư hơn nhiều so với việc gửi lên đám mây. Không có sự khác biệt lớn so với việc sử dụng PyTorch về mặt mã, ngoại trừ việc sử dụng ORT. Thật vậy, tài liệu của Hugging Face nêu rõ: “Sau khi mô hình được xuất sang định dạng ONNX, việc chạy nó trên nhiều bộ tăng tốc là rất dễ dàng – ví dụ, chúng ta có thể tải và chạy nó với ONNX Runtime”. Nói cách khác, chuyển sang định dạng ONNX là chìa khóa để linh hoạt và tốc độ trên thiết bị di động.

Mô hình Transformer trên Thiết bị iOS với Core ML

Core ML là framework được sử dụng để chạy các mô hình học máy trong hệ sinh thái Apple (iOS, macOS, watchOS, tvOS). Nó cung cấp khả năng chạy mô hình trên chip Apple (chip dòng A, chip dòng M Mac) với hiệu suất cực kỳ cao và tiêu thụ điện năng thấp. Giống như ONNX, Core ML sử dụng các định dạng mô hình khác nhau bằng cách chuyển đổi chúng sang định dạng riêng của nó được gọi là .mlmodel. Apple tuyên bố rằng các mô hình chạy với Core ML tự động và hiệu quả nhất được cân bằng giữa Apple Neural Engine, GPU và CPU – vì vậy nhà phát triển không cần lo lắng về chi tiết phần cứng cấp thấp.

Để chuyển đổi mô hình PyTorch hoặc TensorFlow sang định dạng Core ML, gói Python Core ML Tools (coremltools) của Apple được sử dụng. Việc chuyển đổi thường là quy trình hai bước:

  1. Chuyển đổi mô hình sang định dạng TorchScript (cho PyTorch): Các mô hình PyTorch trước tiên được chuyển đổi sang TorchScript (tệp .pt). TorchScript là một biểu diễn có thể tuần tự hóa của mô hình, độc lập với mã Python. Nó có thể được thực hiện theo hai cách: Truy vết (truy xuất đồ thị tính toán từ một ví dụ đầu vào cụ thể) hoặc Scripting (biên dịch mã mô hình ở cấp độ AST Python). Truy vết tạo ra mã nhanh và được tối ưu hóa, nhưng scripting có thể cần thiết cho các mô hình có luồng điều khiển động. Các mô hình như Transformers, có một bộ lớp cụ thể, thường có thể được chuyển đổi thành công bằng cách truy vết.
  2. Chuyển đổi mô hình TorchScript sang định dạng Core ML: Gói coremltools chuyển đổi mô hình TorchScript (hoặc SavedModel, ONNX, Keras) sang tệp .mlmodel bằng hàm ct.convert(). Trong bước này, các định dạng đầu vào/đầu ra của mô hình và, lý tưởng nhất, phiên bản iOS mục tiêu được chỉ định. Ví dụ:

python import coremltools as ct traced_model = torch.jit.trace(my_model, example_input) mlmodel = ct.convert( traced_model, inputs=[ct.TensorType(shape=input_shape)] ) mlmodel.save(“model.mlmodel”)

Mã trên truy vết mô hình PyTorch và lưu mô hình Core ML. Ở đây, chúng ta đang cố định chiều của tensor đầu vào với input_shape; Core ML nói chung hoạt động với tensor có kích thước cố định. Kích thước linh hoạt có thể được chỉ định nếu cần, nhưng cố định chúng được khuyến nghị để đạt hiệu suất.

Có một vài điểm cần lưu ý khi chuyển đổi các mô hình dựa trên Transformer lớn sang định dạng Core ML:

  • Kích thước bộ nhớ: Core ML Tools lưu trọng số mô hình dưới dạng FP16 (Float16) theo mặc định. Điều này làm giảm một nửa kích thước mô hình (16 bit thay vì 32 bit). Ví dụ, trong bản demo của Apple, họ nói rằng khi họ chuyển đổi mô hình Llama2 8B sang Core ML, nó chiếm ~16 GB (8 tỷ tham số * 2 byte). Điều này có vẻ khá lớn; do đó, trong thực tế, các lượng tử hóa mạnh mẽ hơn như 8 bit hoặc 4 bit (ví dụ: lượng tử hóa thành 4 bit bằng thuật toán GPTQ và sau đó chuyển đổi sang Core ML) sẽ có hiệu lực. Apple nói rằng Core ML cũng hỗ trợ chuyển đổi nhận biết lượng tử hóa, nhưng đối với các mô hình lớn, kết quả tốt nhất đạt được với việc sử dụng GPU và 16 bit.
  • Bộ nhớ đệm khóa-giá trị (KV cache): Trong các mô hình tạo ngôn ngữ (như GPT-2, Llama), bộ nhớ đệm theo đầu chú ý (khóa giá trị quá khứ) được sử dụng để cải thiện hiệu suất trong việc tạo token tiếp theo. Có thể khó hỗ trợ cơ chế này trong Core ML vì nó yêu cầu nhúng một cấu trúc đệ quy trong mô hình. Trong ví dụ Llama của Apple, người ta thấy rằng họ đã xuất một mô hình đơn giản hơn bằng cách vô hiệu hóa bộ nhớ đệm KV ở giai đoạn đầu (use_cache=False). Sau đó, họ thảo luận về các cách quản lý điều này trong một phiên bản được tối ưu hóa. Đó là, nếu bạn đang chuyển đổi một mô hình ngôn ngữ, việc chuyển đổi một mô hình tạo ra toàn bộ câu cùng một lúc (theo lô) dễ dàng hơn là chuyển đổi một cấu trúc tạo ra các token đơn lẻ từng bước.
  • Khả năng tương thích phiên bản Core ML Tools: Điều quan trọng là sử dụng các phiên bản PyTorch và coremltools tương thích. Ví dụ, tính đến năm 2023, các phiên bản coremltools 6+ được tích hợp tốt hơn với PyTorch 2 và đã hỗ trợ hầu hết các phép toán Transformer. Tại WWDC 2023, Apple thậm chí còn công bố các gói Swift để chạy trực tiếp các mô hình Transformers trong Core ML (như Stable Diffusion Core ML, Swift Transformers). Điều này cho thấy khía cạnh Core ML đã phát triển đến mức nào.

Hiệu suất: Trên các thiết bị Apple, các mô hình chạy với Core ML nhận được sự tăng tốc phần cứng từ các đơn vị như Neural Engine và GPU. Theo số liệu do Apple công bố, mô hình Llama 3.1 với 8 tỷ tham số đạt tốc độ tạo khoảng 33 token/giây trên chip M1 Max. Đây là một giá trị rất ấn tượng và có thể mang lại trải nghiệm mượt mà cho LLM trên thiết bị trong sử dụng hàng ngày. Tất nhiên, hiệu suất này đạt được trong một kịch bản mà mô hình chạy ở chế độ 16 bit và sử dụng GPU. Có thể chạy một mô hình nhỏ hơn (ví dụ: 1-2 tỷ tham số, 4 bit) với tốc độ hợp lý trên iPhone – ví dụ, cộng đồng đã báo cáo rằng một mô hình trò chuyện 70 triệu tham số mang lại phản hồi gần như thời gian thực trên iPhone đời 2024. Những kết quả này cho thấy sức mạnh của phần cứng chuyên dụng trong thiết bị di động. Core ML cung cấp một cách lý tưởng để sử dụng sức mạnh này. Hugging Face đang hợp tác với Apple để xuất bản nhiều mô hình tương thích Core ML (ví dụ: các mô hình như Stable Diffusion Core ML, MobileNet Core ML được liệt kê dưới tổ chức apple trên Hugging Face Hub).

Ví dụ Thực tế: Được biết Apple sử dụng một mô hình Transformer nhỏ trong ứng dụng Mail của mình để phát hiện thư rác. Mô hình này được nhúng trong ứng dụng ở định dạng Core ML và xác định trên thiết bị xem các email đến có phải là thư rác hay không. Tương tự, các ứng dụng bàn phím di động như SwiftKeyGboard đã bắt đầu chạy các phiên bản nhỏ của các mô hình ngôn ngữ dựa trên Transformer (như DistilGPT-2 hoặc các LM nhỏ tùy chỉnh) trên thiết bị để dự đoán văn bản. Tất cả các ứng dụng này biên dịch và sử dụng mô hình với Core ML hoặc các framework tương tự. Từ góc độ nhà phát triển, khi bạn thêm tệp .mlmodel vào dự án Xcode của mình, một lớp Swift/Obj-C sẽ tự động được tạo ra, và bạn có thể dễ dàng cung cấp đầu vào và nhận đầu ra từ mô hình thông qua lớp này. Điều này đã làm cho học máy trong hệ sinh thái Apple trở nên rất dễ tiếp cận.

TensorFlow Lite và Các Cách Tiếp cận Khác

Một phương pháp phổ biến khác trong hệ sinh thái Android là sử dụng TensorFlow Lite (TFLite). TFLite là một giải pháp được tối ưu hóa để chạy các mô hình TensorFlow trên thiết bị di động và thiết bị nhúng, chuyển đổi mô hình thành định dạng nhị phân đặc biệt với phần mở rộng .tflite. Ưu điểm của TFLite là hỗ trợ phần cứng rộng rãi do Google phát triển và kích thước runtime nhỏ của nó (khoảng ~1-2MB). Trên nhiều thiết bị Android, TFLite có thể thực hiện tăng tốc với NNAPI hoặc trực tiếp với cơ chế GPU Delegate của riêng nó. TFLite thường được sử dụng, đặc biệt cho các tác vụ xử lý ảnh và NLP cơ bản.

Thư viện Hugging Face Optimum cũng hỗ trợ chuyển đổi các mô hình Transformers sang định dạng TFLite. Bạn có thể trước tiên chuyển đổi mô hình PyTorch sang TF và sau đó tạo tệp .tflite bằng lệnh optimum-cli export tflite. Ví dụ, để chuyển đổi mô hình BERT-base:

bash pip install optimum[exporters-tf] # Plugin cần thiết cho xuất TFLite optimum-cli export tflite –model google/bert-base-uncased –sequence_length 128 bert_tflite/

Lệnh này lấy mô hình BERT base chính thức từ Hugging Face Hub, cố định kích thước đầu vào thành 128 và tạo ra một mô hình TFLite. Các log được hiển thị trong đầu ra cho biết nó đã được lưu thành công. Trong quá trình chuyển đổi, các tính năng lượng tử hóa sau huấn luyện của TFLite cũng có thể được sử dụng nếu mong muốn. Ví dụ, có thể giảm trọng số xuống FP16 với một tham số như –quantize float16 (Optimum cũng hỗ trợ các cấu hình TFLite).

Sử dụng TFLite, tương tự như ONNX, dựa trên việc thêm một thư viện vào ứng dụng và cung cấp đầu vào cho mô hình. Trên Android, lớp TensorFlow Lite Interpreter thường được sử dụng; bạn tải tệp .tflite, cung cấp dữ liệu dưới dạng ByteBuffer và nhận đầu ra. Hugging Face cũng đã bắt đầu lưu trữ mô hình ở định dạng TFLite trên Hub. Ví dụ, một phiên bản lượng tử hóa .tflite của một mô hình bộ chuyển đổi câu nhỏ dựa trên MiniLM có sẵn. Điều này cho phép các nhà phát triển tải trực tiếp mô hình TFLite và tích hợp nó vào ứng dụng của họ.

Ngoài ra, đối với những người thích sử dụng PyTorch, có thể đề cập đến cách tiếp cận PyTorch Mobile (TorchScript). PyTorch cho phép bạn chuyển đổi mô hình của mình sang TorchScript và chạy nó trên Android/iOS với API C++. Tuy nhiên, vì runtime của PyTorch Mobile tương đối lớn (~5MB+) và hỗ trợ GPU của nó bị hạn chế (không hỗ trợ GPU trên Android, hạn chế với Metal trên iOS), ONNX/TFLite thường được ưu tiên cho các tác vụ quan trọng về hiệu suất. Tuy nhiên, những người đã sử dụng hệ sinh thái PyTorch và cần chuyển đổi mô hình của họ nhanh chóng có thể chọn con đường TorchScript. Các mô hình Hugging Face Transformers có thể được tải trực tiếp theo cách tương thích TorchScript với tham số .from_pretrained(…, torchscript=True). Sau đó, bạn có thể lấy tệp .pt để sử dụng trên thiết bị di động bằng cách gọi traced_model.save(“model.pt”).

Tóm lại, có nhiều tùy chọn để chạy mô hình trên thiết bị di động, và việc lựa chọn nên dựa trên nhu cầu của dự án:

  • ONNX Runtime: Độc lập với framework, linh hoạt và hiệu suất cao. Kích thước nhị phân hơi lớn hơn, nhưng bao gồm cả iOS và Android với một giải pháp duy nhất.
  • Core ML: Mang lại hiệu suất tốt nhất cho iOS/macOS, dành riêng cho hệ sinh thái Apple.
  • TensorFlow Lite: Phổ biến cho Android (và iOS), runtime rất nhỏ và nhanh, nhưng nói chung dễ dàng tích hợp với các mô hình dựa trên TF hơn.
  • PyTorch Mobile: Cung cấp khả năng dễ dàng chuyển đổi mô hình PyTorch hiện có, nhưng sự trưởng thành của nó trên thiết bị di động không cao như các mô hình khác.

Như có thể thấy, Hugging Face Optimum có thể cung cấp chuyển đổi sang các định dạng như ONNX và TFLite và áp dụng lượng tử hóa ở các định dạng đó dưới một ô dù duy nhất. Bằng cách này, một nhà phát triển muốn chạy một mô hình Transformer trên thiết bị di động có thể đạt được mục tiêu của mình bằng cách chuyển đổi nó sang định dạng phù hợp với Optimum và sau đó sử dụng thư viện di động tương ứng.

Tối ưu hóa và Tích hợp với Hugging Face Optimum

Hugging Face Optimum, mà chúng tôi đã đề cập trong nhiều ngữ cảnh ở trên, là một bộ công cụ đơn giản hóa việc tối ưu hóa mô hình. Để tóm tắt, Optimum cung cấp:

  • Tích hợp Bộ tăng tốc Phần cứng: Optimum tích hợp các thư viện dành riêng cho các hệ sinh thái phần cứng và phần mềm khác nhau với Transformers. Ví dụ, mô-đun optimum.onnxruntime dành cho ONNX Runtime, optimum.intel dành cho các công cụ mã nguồn mở của Intel (OpenVINO, Intel Neural Compressor, v.v.), optimum.habana dành cho INTEL Gaudi :) , và optimum.graphcore dành cho IPU. Trong phạm vi chủ đề của chúng ta, các mô-đun optimum.onnxruntimeoptimum.exporters nổi bật nhất.
  • Giao diện Lượng tử hóa Dễ dàng: Optimum trình bày công cụ lượng tử hóa của ONNX Runtime dưới dạng giao diện Python đơn giản hoặc CLI. Việc lấy một mô hình Transformers (ví dụ: mô hình .onnx từ một thư mục hoặc trực tiếp từ HF Hub) và giảm nó xuống 8 bit bằng cách sử dụng lớp ORTQuantizer là rất thiết thực. Chúng tôi đã chỉ ra cách sử dụng này trong ví dụ mã ở trên. Các chế độ lượng tử hóa được hỗ trợ bao gồm động, tĩnh (với hiệu chuẩn), và các chế độ được tối ưu hóa cho các tập lệnh bộ xử lý cụ thể. Ví dụ, bạn có thể chọn cài đặt tốt nhất cho CPU di động dựa trên ARM bằng cách gọi AutoQuantizationConfig.arm64(). Optimum cũng đã bắt đầu tích hợp các kỹ thuật lượng tử hóa mới hơn như GPTQ (lượng tử hóa LLM 4 bit).
  • Công cụ Biên dịch và Chuyển đổi: Optimum xử lý việc chuyển đổi trong một bước duy nhất với các lệnh optimum-cli export onnx hoặc export tflite. Bên dưới các lệnh này, các trình chuyển đổi của Transformers hoặc ONNX thực sự đang chạy, nhưng Optimum giúp bạn dễ dàng đặt các tham số chính xác và tránh sự không khớp. Ví dụ, khi chuyển đổi sang TFLite, nếu phiên bản TensorFlow của mô hình không tồn tại ở chế độ nền, nó sẽ tự động tạo một mô hình TF và sau đó gọi Trình chuyển đổi TFLite.
  • Tích hợp Intel Neural Compressor và NNCF: Nếu bạn muốn thực hiện tối ưu hóa nâng cao hơn (như kết hợp lượng tử hóa + cắt tỉa + chưng cất trong quá trình huấn luyện), mô-đun Optimum-Intel cho phép bạn thực hiện điều này trực tiếp với API Trainer. Ví dụ, áp dụng huấn luyện nhận biết lượng tử hóa (QAT) trong quá trình huấn luyện hoặc thực hiện cắt tỉa có cấu trúc với mục tiêu độ thưa cụ thể là có thể với Optimum. Các tính năng này dành cho các nhà phát triển mô hình hơn, các công cụ được tích hợp vào giai đoạn huấn luyện; nhưng kết quả là các mô hình siêu hiệu quả chạy trên thiết bị di động. Ví dụ, sử dụng Optimum-Intel, cắt tỉa có cấu trúc 90% + chưng cất đã được áp dụng cho một mô hình BERT, và mô hình kết quả đã được làm cho chạy nhanh hơn 10 lần trong khi vẫn giữ được 99% độ chính xác của bản gốc (các nghiên cứu như vậy tồn tại trong tài liệu).

Nói tóm lại, Hugging Face Optimum là một công cụ quan trọng cả cho việc tối ưu hóa và triển khai các mô hình được huấn luyện trước và cho việc đơn giản hóa nghiên cứu nén mô hình. Các nhà phát triển di động được hưởng sự tiện lợi khi giảm các quy trình chuyển đổi phức tạp thành các lệnh đơn giản bằng cách sử dụng Optimum. Ví dụ, ngay cả một nhà phát triển di động có kiến thức Python hạn chế cũng có thể lượng tử hóa và chuyển đổi một mô hình bằng Optimum CLI và sau đó tích hợp nó vào ứng dụng di động của họ. Tài liệu của Hugging Face khuyến khích điều này, nói rằng, “nếu bạn muốn chạy các mô hình của mình với hiệu quả tối đa, hãy xem thư viện Optimum.”

Kết luận và Các kịch bản Ví dụ

Việc chạy các mô hình Transformer lớn trên thiết bị di động và thiết bị biên đã trở nên khả thi khi áp dụng các kỹ thuật phù hợp. Với các phương pháp như lượng tử hóa, chưng cấtcắt tỉa, mà chúng ta đã thảo luận trong bài viết này, việc phù hợp và tăng tốc các mô hình khổng lồ cho môi trường di động giờ đây là thực tế phổ biến. Đặc biệt, các đổi mới trong hệ sinh thái Hugging Face đã làm cho quy trình này trở nên dễ tiếp cận hơn bao giờ hết. Ví dụ, một nhà phát triển ứng dụng di động có thể dễ dàng thêm tính năng phân loại văn bản nhanh chóng và ngoại tuyến bằng cách tải xuống mô hình DistilBERT từ Hugging Face, chuyển đổi nó sang định dạng ONNX + INT8 bằng Optimum và chạy nó với ORT trong ứng dụng của họ.

Các ví dụ thực tế cho thấy xu hướng này đang ngày càng tăng: Apple đang thúc đẩy ML trên thiết bị trong các ứng dụng và công cụ phát triển của riêng mình nhờ Core ML; Google đang làm việc trên các mô hình ngôn ngữ được tích hợp vào điện thoại Android (NLP trên thiết bị trên thiết bị Pixel); và các công ty như Meta và NVIDIA đang khuyến khích việc sử dụng chúng trên Biên bằng cách phát hành các phiên bản nhỏ (Alpaca, Minitron, v.v.) của các mô hình lớn. Hugging Face Hub hiện có các thẻ và bộ sưu tập cho các mô hình tương thích với thiết bị di động, và các phiên bản lượng tử hóa của nhiều mô hình đang được chia sẻ.

Tóm lại, thông điệp cho các nhà phát triển di động và kỹ sư trí tuệ nhân tạo là: Bằng cách sử dụng các công cụ phù hợp, bạn có thể mang lại lợi ích của các mô hình Transformer lớn cho người dùng của mình trong môi trường di động. Với các kỹ thuật được đề cập trong bài viết này, ứng dụng của bạn có thể cung cấp các câu trả lời thông minh mà không cần gửi dữ liệu người dùng lên đám mây và có thể xử lý văn bản, hình ảnh hoặc âm thanh theo thời gian thực. Hơn nữa, bạn có thể thực hiện điều này trong khi cung cấp trải nghiệm thân thiện với pin và nhanh chóng bằng cách tận dụng tối đa phần cứng của thiết bị. Nhờ các công cụ mã nguồn mở đang phát triển (Optimum, ONNX Runtime, Core ML Tools, v.v.) và việc thu nhỏ liên tục các mô hình “lớn”, việc tích hợp AI vào một chiếc túi giờ đây không còn là một giấc mơ, mà là hiện thực của ngày hôm nay.

Recommended for You

Bảng xếp hạng so sánh- AI - Từ lượt bình chọn của người dùng đến bảng xếp hạng mô hình dựa trên sự tham gia

Bảng xếp hạng so sánh- AI - Từ lượt bình chọn của người dùng đến bảng xếp hạng mô hình dựa trên sự tham gia

Bảng xếp hạng so sánh- AI - Từ lượt bình chọn của người dùng đến bảng xếp hạng mô hình dựa trên sự tham gia

Hướng tới An toàn do Cộng đồng Quản lý

Hướng tới An toàn do Cộng đồng Quản lý

Hướng tới An toàn do Cộng đồng Quản lý