Sự phát triển của trí tuệ nhân tạo và học máy đã tạo ra nhu cầu cấp thiết về các phương pháp lưu trữ và phân phối mô hình sao cho hiệu quả, an toàn và tương thích với các hệ thống khác nhau. Khi các mô hình ngày càng phức tạp và được sử dụng trong nhiều bối cảnh đa dạng hơn, việc lựa chọn định dạng tuần tự hóa là một quyết định then chốt. Lựa chọn này ảnh hưởng đến hiệu suất, việc sử dụng tài nguyên và tính bảo mật của các hệ thống AI.
Báo cáo này xem xét các định dạng tuần tự hóa mô hình hàng đầu, bao gồm Safetensors, CKPT, ONNX và GGUF. Báo cáo sẽ nêu bật các tính năng độc đáo, các ứng dụng phổ biến và so sánh chúng với nhau.
1. Giới thiệu về Tuần tự hóa Mô hình trong AI/ML
Tuần tự hóa mô hình là quá trình lưu một mô hình học máy đã được huấn luyện vào một tệp. Tệp này sau đó có thể được lưu trữ, chia sẻ hoặc tải lại để sử dụng sau này, chẳng hạn như để đưa ra dự đoán, tiếp tục huấn luyện hoặc thực hiện phân tích. Khả năng này rất cần thiết cho toàn bộ vòng đời của AI/ML, từ nghiên cứu và phát triển đến triển khai quy mô lớn.
Vai trò Quan trọng của các Định dạng Mô hình trong Vòng đời AI/ML
Việc lưu các mô hình theo một định dạng chuẩn là rất quan trọng vì nhiều lý do:
- Khả năng tái tạo (Reproducibility): Nó cho phép các thí nghiệm nghiên cứu được sao chép và xác thực một cách chính xác.
- Hợp tác (Collaboration): Các định dạng chuẩn giúp các nhóm dễ dàng chia sẻ mô hình, cho phép họ làm việc cùng nhau và tích hợp các mô hình vào các hệ thống lớn hơn.
- Triển khai (Deployment): Tuần tự hóa biến một mô hình đã được huấn luyện thành một tệp di động có thể được tải và chạy trong nhiều môi trường khác nhau, từ máy chủ đám mây đến các thiết bị biên.
- Học chuyển giao (Transfer Learning): Nó cho phép sử dụng các mô hình được huấn luyện trước làm nền tảng cho các tác vụ mới, giúp tiết kiệm đáng kể thời gian và dữ liệu huấn luyện.
Tổng quan về các Thách thức được Giải quyết bởi các Định dạng Hiện đại
Khi học máy đã tiến bộ, các định dạng tuần tự hóa hiện đại đã phát triển để giải quyết một số thách thức chính:
- Bảo mật: Một mối quan tâm lớn là rủi ro bảo mật trong các phương pháp truyền thống, đặc biệt là những phương pháp sử dụng mô-đun
picklecủa Python. Các phương pháp này có thể cho phép mã độc chạy khi một mô hình được tải, tạo ra một mối đe dọa bảo mật nghiêm trọng nếu mô hình đến từ một nguồn không đáng tin cậy. - Hiệu suất: Các mô hình lớn và phức tạp ngày nay đòi hỏi tốc độ tải rất nhanh và quản lý bộ nhớ hiệu quả. Điều này đặc biệt quan trọng đối với các thiết bị có tài nguyên hạn chế, như điện thoại di động, và cho các ứng dụng cần phản hồi ngay lập tức.
- Tính di động và Tương thích (Portability and Interoperability): Thế giới học máy sử dụng nhiều framework khác nhau (như PyTorch, TensorFlow và JAX). Cần có các định dạng cho phép các mô hình di chuyển dễ dàng giữa các framework này và chạy trên các phần cứng khác nhau (GPU, TPU) mà không cần chỉnh sửa nhiều.
Trong những năm gần đây, cộng đồng AI đã chuyển hướng sang các định dạng hiệu quả và an toàn hơn như GGUF và Safetensors, phản ánh nỗ lực tập thể để giải quyết các vấn đề này.
Các phương pháp ban đầu để lưu mô hình ML, như việc PyTorch sử dụng mô-đun pickle của Python cho các tệp .pt và .pth, được chọn vì tính dễ sử dụng của chúng. Chúng có thể dễ dàng lưu các đối tượng Python phức tạp, bao gồm cả thiết kế của mô hình và trạng thái huấn luyện của nó (như trình tối ưu hóa). Mặc dù điều này thuận tiện cho việc nghiên cứu trong môi trường Python, nó đã tạo ra một lỗ hổng bảo mật lớn. Mô-đun pickle được thiết kế theo cách cho phép nó chạy bất kỳ mã nào được nhúng trong một tệp trong quá trình tải. Điều này có nghĩa là việc tải một mô hình có vẻ vô hại từ một nguồn không đáng tin cậy có thể gây nguy hiểm cho toàn bộ hệ thống.
Sự ra đời của các định dạng như Safetensors, cùng với việc sử dụng ngày càng nhiều ONNX và GGUF, là một phản ứng trực tiếp đối với rủi ro bảo mật này, cũng như nhu cầu về hiệu suất và tính di động tốt hơn. Ví dụ, Safetensors được xây dựng đặc biệt để ngăn chặn mã độc chạy. Điều này cho thấy khi lĩnh vực học máy trưởng thành và AI chuyển từ nghiên cứu sang các ứng dụng thực tế, bảo mật và hiệu quả không còn là những yếu tố phụ mà là những nguyên tắc cốt lõi trong việc thiết kế các định dạng mới. Sự thay đổi này đại diện cho một sự chuyển dịch cần thiết từ sự linh hoạt tập trung vào nghiên cứu sang bảo mật và sự mạnh mẽ ở cấp độ sản xuất, khắc phục "nợ kỹ thuật" của các phương pháp cũ, dễ dãi hơn.
Các định dạng dành riêng cho framework, chẳng hạn như .pt / .pth cho PyTorch và .ckpt / .h5 cho TensorFlow/Keras, được tích hợp chặt chẽ với các framework cụ thể của chúng. Mặc dù điều này giúp chúng hiệu quả trong một hệ sinh thái duy nhất, nó gây ra các vấn đề đáng kể về khả năng tương tác. Một mô hình được huấn luyện trong một framework không thể dễ dàng sử dụng trong một framework khác mà không có các chuyển đổi phức tạp hoặc duy trì các hệ thống riêng biệt cho mỗi framework. Điều này dẫn đến các quy trình phát triển và triển khai bị ngắt kết nối.
Định dạng Open Neural Network Exchange (ONNX) được tạo ra để phá bỏ những rào cản này. Nó cung cấp một tiêu chuẩn "đa nền tảng" và "trung lập với nhà cung cấp" cho các mô hình. Nó đạt được điều này bằng cách định nghĩa cấu trúc của mô hình (đồ thị tính toán của nó) một cách trừu tượng, độc lập với bất kỳ framework nào. Tương tự, GGUF, mặc dù ban đầu được tạo ra cho dự án llama.cpp, cũng tập trung vào việc cải thiện khả năng tương thích cho các mô hình ngôn ngữ lớn (LLM) trên các nền tảng khác nhau.
Sự đa dạng của các định dạng ngày nay phản ánh một sự căng thẳng cốt lõi trong ngành công nghiệp ML: mong muốn có các tính năng dành riêng cho framework trong quá trình phát triển (ví dụ: đồ thị động của PyTorch để linh hoạt trong nghiên cứu) so với nhu cầu triển khai phổ quát, hiệu quả và an toàn. Sự căng thẳng này có nghĩa là nhiều định dạng sẽ tiếp tục tồn tại, làm cho các công cụ chuyển đổi và các quy trình MLOps tiên tiến ngày càng trở nên quan trọng để kết nối việc phát triển mô hình với việc triển khai. Các định dạng khác nhau sẽ tiếp tục được sử dụng cho các giai đoạn cụ thể của vòng đời ML dựa trên các điểm mạnh độc đáo của chúng.
2. Tìm hiểu về Safetensors
Safetensors là một bước tiến lớn trong việc tuần tự hóa mô hình, được thiết kế đặc biệt để khắc phục các vấn đề về bảo mật và hiệu quả của các phương pháp lưu trữ mô hình truyền thống.
Định nghĩa và Nguyên tắc Thiết kế Cốt lõi
Safetensors là một định dạng tuần tự hóa hiện đại, an toàn và nhanh chóng cho các mô hình học sâu, được tạo ra bởi Hugging Face. Mục tiêu chính của nó là cung cấp một cách an toàn để lưu trữ và chia sẻ các tenxơ (tensor) — các mảng đa chiều là khối xây dựng dữ liệu cơ bản của học máy. Định dạng này được thiết kế để an toàn và nhanh hơn các định dạng cũ như pickle.
Một nguyên tắc cốt lõi của Safetensors là sự tách biệt nghiêm ngặt giữa trọng số mô hình (tenxơ) và bất kỳ mã nào có thể chạy được. Thiết kế này giải quyết trực tiếp các lỗ hổng bảo mật được tìm thấy trong các phương pháp tuần tự hóa cũ hơn.
Các tính năng chính
- Sao chép tại chỗ (Zero-copy) và Tải theo yêu cầu (Lazy Loading): Một chìa khóa cho hiệu suất của Safetensors là khả năng "sao chép tại chỗ". Điều này cho phép dữ liệu mô hình được ánh xạ trực tiếp từ đĩa vào bộ nhớ mà không tạo ra các bản sao bổ sung, giúp tiết kiệm bộ nhớ và tăng tốc độ tải. Nó cũng hỗ trợ "tải theo yêu cầu", có nghĩa là chỉ những phần cần thiết của một mô hình lớn được tải vào RAM khi cần. Điều này rất hữu ích cho các mô hình cực lớn hoặc các hệ thống có bộ nhớ hạn chế.
- Xử lý Siêu dữ liệu có Cấu trúc: Mỗi tệp Safetensors bao gồm một phần siêu dữ liệu riêng biệt ở định dạng JSON. Phần này liệt kê tất cả các tenxơ trong mô hình với các chi tiết như hình dạng, kiểu dữ liệu và tên của chúng. Siêu dữ liệu trỏ đến nơi dữ liệu tenxơ thực tế được lưu trữ riêng biệt trong tệp, giúp cải thiện cả khả năng đọc và bảo mật.
- Lưu trữ Dữ liệu Chỉ chứa Tenxơ: Tính năng bảo mật quan trọng nhất của Safetensors là nó được thiết kế để "chỉ chứa dữ liệu tenxơ thô và siêu dữ liệu liên quan". Về mặt kiến trúc, nó "không cho phép tuần tự hóa mã Python tùy ý". Lựa chọn thiết kế cơ bản này loại bỏ nguy cơ chạy mã độc khi tải một mô hình.
- Hỗ trợ Lượng tử hóa (Quantization): Safetensors có thể xử lý các tenxơ đã được lượng tử hóa, giúp làm cho các mô hình nhỏ hơn và sử dụng ít bộ nhớ hơn. Tuy nhiên, hỗ trợ lượng tử hóa của nó "không linh hoạt bằng GGUF" vì nó phụ thuộc vào các tính năng do framework PyTorch cung cấp.
Lợi ích chính
- Tăng cường Bảo mật (Giảm thiểu Rủi ro Thực thi Mã Tùy ý): Đây là lợi thế lớn nhất của Safetensors. Theo thiết kế, nó hoàn toàn ngăn chặn việc lưu mã Python vào tệp. Điều này loại bỏ rủi ro bảo mật nghiêm trọng nhất được tìm thấy trong các định dạng dựa trên pickle: chạy mã độc khi một mô hình được tải. Điều này làm cho Safetensors trở thành lựa chọn tốt nhất để chia sẻ và sử dụng các mô hình từ các nguồn công cộng hoặc không đáng tin cậy. Định dạng này cũng bao gồm các tính năng bảo mật khác như "các kỹ thuật mã hóa tiên tiến" và kiểm soát truy cập để ngăn chặn việc giả mạo dữ liệu.
- Tối ưu hóa Hiệu suất: Việc sử dụng sao chép tại chỗ và tải theo yêu cầu dẫn đến "thời gian tải nhanh hơn và sử dụng bộ nhớ thấp hơn". Các bài kiểm tra hiệu năng cho thấy nó "nhanh hơn" nhiều so với pickle và có thể "nhanh hơn 76.6 lần trên CPU và 2 lần trên GPU so với phương pháp lưu trữ truyền thống của PyTorch".
- Tính di động (Portability): Định dạng này được thiết kế để có tính di động, có nghĩa là nó hoạt động trên các ngôn ngữ lập trình khác nhau. Điều này giúp dễ dàng chia sẻ và sử dụng các mô hình trong các hệ thống phần mềm khác nhau.
- Tích hợp liền mạch: Safetensors "tích hợp liền mạch với các framework và thư viện học máy hiện có". Điều này cho phép các nhà phát triển dễ dàng áp dụng định dạng an toàn hơn này mà không cần thực hiện những thay đổi lớn đối với quy trình làm việc hiện tại của họ.
So sánh với Tuần tự hóa Truyền thống (ví dụ: Pickle)
Mô-đun pickle của Python, được sử dụng cho các tệp .pt và .pth của PyTorch, vốn dĩ không an toàn. Nó cho phép bất kỳ mã nào được ẩn bên trong một tệp đã tuần tự hóa và chạy tự động khi tệp được tải. Đây là một lỗ hổng bảo mật nghiêm trọng và nổi tiếng, đặc biệt là khi sử dụng các mô hình được tải xuống từ các trang web công cộng. Mặc dù các công cụ như picklescan có thể phát hiện một số mẫu độc hại, chúng không phải là hoàn hảo và không thể đảm bảo an toàn.
Safetensors được tạo ra đặc biệt để giải quyết vấn đề bảo mật này. Bằng cách chỉ cho phép dữ liệu tenxơ thô và siêu dữ liệu có cấu trúc trong tệp, nó loại bỏ khả năng thực thi mã độc. Ngoài bảo mật, Safetensors còn mang lại hiệu suất tốt hơn nhiều. Thiết kế của nó cho việc ánh xạ bộ nhớ và tải theo yêu cầu dẫn đến thời gian tải nhanh hơn đáng kể và sử dụng bộ nhớ hiệu quả hơn so với pickle, vốn thường tải toàn bộ mô hình vào bộ nhớ cùng một lúc.
Lỗ hổng bảo mật trong pickle của Python có nghĩa là việc tải xuống một tệp .pt hoặc .pth từ một nguồn không đáng tin cậy không chỉ là tải xuống dữ liệu; nó giống như việc chạy một chương trình có khả năng gây hại. Người ta biết rằng "không có giải pháp nào chống đạn 100% để xác minh sự an toàn của một tệp pickle mà không cần thực thi". Điều này đặt gánh nặng kiểm tra sự an toàn của tệp lên người dùng, điều này rất khó khăn và không đáng tin cậy.
Safetensors thay đổi động lực này bằng cách thiết kế lại chính định dạng để ngăn chặn mã độc được đưa vào ngay từ đầu. Nó chuyển trách nhiệm bảo mật từ quy trình xác minh khó khăn của người dùng sang sự an toàn tích hợp sẵn của định dạng. Điều này đánh dấu một sự thay đổi lớn trong cộng đồng AI mã nguồn mở từ cách tiếp cận "xác minh, sau đó tin tưởng" sang mô hình "tin tưởng theo thiết kế". Sự thay đổi này thừa nhận rằng gần như không thể quét mọi mối đe dọa có thể có trong các tệp phức tạp. Bằng cách chặn véc-tơ tấn công (thực thi mã tùy ý), Safetensors giúp việc chia sẻ các mô hình rộng rãi trở nên an toàn hơn, khuyến khích sự hợp tác và giúp nhiều người dễ dàng sử dụng các mô hình được huấn luyện trước hơn. Nguyên tắc "tin tưởng theo thiết kế" này là cần thiết cho sự phát triển và bảo mật của toàn bộ hệ sinh thái AI.
Mặc dù Safetensors được tạo ra chủ yếu vì lý do bảo mật (để khắc phục các lỗ hổng của pickle), nó cũng mang lại những cải tiến hiệu suất lớn, chẳng hạn như tải nhanh hơn, sử dụng bộ nhớ thấp hơn và các hoạt động sao chép tại chỗ. Những lợi ích về hiệu suất này không chỉ là một hiệu ứng phụ; chúng là kết quả trực tiếp của thiết kế được tối ưu hóa của Safetensors, sử dụng ánh xạ bộ nhớ và tải theo yêu cầu để xử lý dữ liệu một cách hiệu quả. Điều này làm cho nó tự nhiên hiệu quả hơn cho các mô hình lớn.
Sự kết hợp giữa bảo mật nâng cao và những cải tiến hiệu suất đáng kể này đã là một động lực chính cho việc áp dụng rộng rãi của nó. Nếu Safetensors chỉ cung cấp bảo mật tốt hơn, việc áp dụng nó có thể đã chậm hơn, đặc biệt là đối với những người dùng không tập trung ngay vào bảo mật. Tuy nhiên, những lợi ích hiệu suất rõ ràng và có thể đo lường được cung cấp một lý do mạnh mẽ để mọi người chuyển đổi, đẩy nhanh việc tích hợp nó vào các nền tảng lớn như Hugging Face. Điều này cho thấy trong kỹ thuật AI, một công nghệ thường cần phải cung cấp cả lợi thế về bảo mật và hiệu suất để được ngành công nghiệp chấp nhận nhanh chóng và rộng rãi.
3. Tổng quan về các Định dạng Mô hình Chính
Ngoài Safetensors, một số định dạng khác cũng quan trọng trong thế giới học máy, mỗi định dạng có các tính năng và trường hợp sử dụng riêng.
3.1. CKPT (Checkpoints)
Một checkpoint AI không phải là một loại tệp duy nhất mà là một bản ghi nhanh (snapshot) về trạng thái của một mô hình được lưu tại một thời điểm cụ thể trong quá trình huấn luyện. Các checkpoint rất cần thiết để lưu tiến trình trong các công việc huấn luyện dài.
Đặc điểm và các Trường hợp Sử dụng Tiêu biểu
Một checkpoint thường chứa các tham số đã học của mô hình, như trọng số và độ lệch (bias). Nó cũng có thể lưu trữ các thông tin quan trọng khác cần thiết để tiếp tục huấn luyện, chẳng hạn như trạng thái của trình tối ưu hóa, số epoch hiện tại và lịch trình tốc độ học. Phần mở rộng tệp cho các checkpoint thay đổi theo framework. Đối với PyTorch, chúng thường là .pt hoặc .pth, trong khi đối với TensorFlow/Keras, chúng là .ckpt hoặc .h5.
Các lợi ích chính của tệp CKPT bao gồm:
- Khả năng tái tạo: Chúng đảm bảo một mô hình hoạt động nhất quán khi được tải lại, điều này rất quan trọng để xác thực nghiên cứu và duy trì hiệu suất đáng tin cậy.
- Hợp tác: Chúng dễ dàng chia sẻ, cho phép các nhà phát triển sao chép kết quả hoặc xây dựng trên công việc hiện có.
- Linh hoạt: Các định dạng
.pt/.pthcủa PyTorch đặc biệt linh hoạt, giúp đơn giản hóa việc lưu và tải các mô hình cho mục đích nghiên cứu.
Các trường hợp sử dụng phổ biến cho tệp CKPT bao gồm:
- Tiếp tục Huấn luyện: Tiếp tục một phiên huấn luyện đã bị gián đoạn, giúp tiết kiệm đáng kể thời gian và tài nguyên tính toán.
- Tinh chỉnh (Fine-Tuning): Sử dụng một mô hình được huấn luyện trước làm điểm khởi đầu để huấn luyện trên một tập dữ liệu mới, cụ thể hơn.
- Đánh giá Mô hình: Kiểm tra hiệu suất của mô hình ở các giai đoạn huấn luyện khác nhau mà không cần phải huấn luyện lại.
- Suy luận (Inference): Tải một mô hình đã được huấn luyện đầy đủ vào một hệ thống sản xuất để đưa ra dự đoán.
- Nghiên cứu và Thử nghiệm: Phân tích cách một mô hình phát triển theo thời gian và tinh chỉnh các tham số của nó một cách có hệ thống.
- Học chuyển giao: Đóng vai trò là một điểm khởi đầu mạnh mẽ cho các tác vụ liên quan, giúp giảm thời gian và nhu cầu dữ liệu huấn luyện.
- Phục hồi sau Thảm họa: Hoạt động như một bản sao lưu để tiếp tục công việc sau một sự cố trong quá trình huấn luyện dài.
Những cân nhắc về Bảo mật
Rủi ro bảo mật lớn nhất với các tệp CKPT, đặc biệt là các định dạng .pt và .pth của PyTorch, đến từ sự phụ thuộc của chúng vào mô-đun pickle của Python. Điều này có nghĩa là các tệp này có thể được thiết kế để chứa và chạy mã Python độc hại khi được tải (nếu hàm torch.load được sử dụng mà không có thiết lập weights_only=True). Lỗ hổng này (CWE-502: Deserialization of Untrusted Data - Giải tuần tự hóa dữ liệu không đáng tin cậy) có thể gây ra hậu quả nghiêm trọng, chẳng hạn như đánh cắp dữ liệu, thay đổi hành vi của mô hình, hoặc thậm chí là chiếm quyền kiểm soát toàn bộ hệ thống.
Ngành công nghiệp đã thừa nhận rủi ro này, và Safetensors đã nổi lên như một lựa chọn an toàn hơn. Như đã lưu ý, "Hầu hết các checkpoint của Stable Diffusion AI được lưu ở các định dạng như .ckpt hoặc .safetensors... .safetensors là một giải pháp thay thế an toàn hơn, được thiết kế để ngăn chặn việc thực thi mã độc." Điều này cho thấy một xu hướng rõ ràng hướng tới các định dạng an toàn hơn để chia sẻ các mô hình.
CKPT, đặc biệt ở định dạng .pt/.pth của PyTorch, được biết đến là "rất linh hoạt". Sự linh hoạt này cho phép chúng lưu không chỉ trọng số mô hình mà còn cả trạng thái của trình tối ưu hóa và thậm chí cả các lớp Python tùy chỉnh, điều này rất hữu ích để tiếp tục huấn luyện một cách chính xác.
Tuy nhiên, chính sự linh hoạt này lại tạo ra lỗ hổng bảo mật. Bởi vì định dạng có thể lưu bất kỳ đối tượng Python nào, kẻ tấn công có thể giấu mã độc bên trong một tệp mô hình. Khi tệp được tải mà không có biện pháp phòng ngừa thích hợp, mã đó sẽ chạy. Điều này minh họa một sự đánh đổi cơ bản trong thiết kế hệ thống: linh hoạt hơn thường dẫn đến bề mặt tấn công lớn hơn và rủi ro bảo mật cao hơn.
Giải pháp của ngành công nghiệp là áp dụng các định dạng như Safetensors để phân phối các mô hình, ngay cả khi các định dạng .pt/.pth linh hoạt hơn vẫn được sử dụng để huấn luyện trong các môi trường được kiểm soát. Điều này cho thấy một sự hiểu biết ngày càng tăng rằng các giai đoạn khác nhau của vòng đời ML đòi hỏi các mức độ bảo mật khác nhau. Sức mạnh của việc lưu toàn bộ trạng thái huấn luyện được giữ tốt nhất trong một môi trường phát triển đáng tin cậy, trong khi việc chia sẻ và triển khai đòi hỏi các định dạng có đảm bảo bảo mật tích hợp sẵn.
3.2. ONNX (Open Neural Network Exchange)
ONNX, viết tắt của Open Neural Network Exchange, là một định dạng tiêu chuẩn mở cho các mô hình học máy. Nó được thiết kế để cho phép các mô hình hoạt động trên các framework học sâu khác nhau.
Đặc điểm và các Trường hợp Sử dụng Chính
Một tệp ONNX chứa cấu trúc hoàn chỉnh của một mô hình, bao gồm chuỗi các hoạt động của nó (đồ thị tính toán), các trọng số đã học và các siêu dữ liệu khác. Một thế mạnh lớn của ONNX là nó hoạt động như một trình dịch phổ quát. Các mô hình được huấn luyện trong các framework như PyTorch, TensorFlow, hoặc scikit-learn có thể được chuyển đổi sang định dạng ONNX, cho phép một cách tiếp cận "huấn luyện một lần, triển khai ở mọi nơi".
Không giống như các định dạng chỉ lưu trữ trọng số mô hình (như Safetensors hoặc GGUF), ONNX bao gồm đồ thị tính toán của mô hình. Cấu trúc dựa trên đồ thị này cung cấp "linh hoạt hơn khi chuyển đổi các mô hình giữa các framework khác nhau". ONNX mang lại khả năng di động tuyệt vời trên nhiều nền tảng, thiết bị và bộ tăng tốc phần cứng (CPU, GPU, chip AI). Các mô hình được lưu trữ ở định dạng Protobuf, là một cách hiệu quả, trung lập với nền tảng để lưu dữ liệu có cấu trúc.
Các trường hợp sử dụng chính cho ONNX bao gồm:
- Triển khai Đa Framework: Chạy một mô hình trong một framework hoặc môi trường khác với môi trường mà nó đã được huấn luyện.
- Suy luận Hiệu suất Cao: ONNX Runtime là một công cụ suy luận tự động tối ưu hóa các mô hình cho phần cứng cụ thể, thường dẫn đến hiệu suất nhanh hơn.
- Triển khai trên Thiết bị Biên và Di động: Dấu chân nhỏ và runtime được tối ưu hóa làm cho ONNX trở thành một lựa chọn tốt để chạy các mô hình trên các thiết bị có tài nguyên hạn chế.
- Hệ thống Sản xuất: Sự mạnh mẽ và tính di động của nó làm cho nó phổ biến để triển khai các mô hình trong các môi trường sản xuất đòi hỏi khắt khe.
Những cân nhắc về Bảo mật
Một rủi ro bảo mật tinh vi nhưng nghiêm trọng với các mô hình ONNX là khả năng có các cửa hậu kiến trúc (architectural backdoors). Kẻ tấn công có thể sửa đổi đồ thị tính toán của mô hình để bao gồm một đường dẫn ẩn chỉ được kích hoạt bởi các đầu vào cụ thể. Khi được kích hoạt, cửa hậu này có thể khiến mô hình tạo ra các đầu ra độc hại hoặc không mong muốn, trong khi vẫn hoạt động bình thường trên các đầu vào tiêu chuẩn, làm cho nó khó bị phát hiện. Các rủi ro khác bao gồm các cuộc tấn công đảo ngược mô hình (trích xuất dữ liệu huấn luyện nhạy cảm) và các cuộc tấn công đối nghịch (sử dụng các đầu vào độc hại để đánh lừa mô hình).
Để giảm thiểu những mối đe dọa này, một số thực hành được khuyến nghị:
- Ký số các mô hình ONNX để đảm bảo chúng không bị giả mạo.
- Triển khai các mô hình trong các môi trường cô lập, như Docker container, với bảo mật mạng mạnh mẽ.
- Sử dụng các công cụ giám sát để theo dõi hành vi của mô hình và phát hiện các bất thường.
- Tuân theo các thực hành bảo mật tốt nhất chung, chẳng hạn như làm sạch đầu vào và cập nhật phần mềm.
ONNX nói chung an toàn hơn các định dạng dựa trên pickle vì nó không chạy mã tùy ý khi được tải. Tuy nhiên, nếu một mô hình ONNX sử dụng các lớp tùy chỉnh được triển khai bên ngoài, các lớp đó có thể chứa mã Python độc hại nếu không được quản lý cẩn thận.
Nhược điểm
Mặc dù ONNX hỗ trợ các mô hình đã được lượng tử hóa, nó "không hỗ trợ các tenxơ đã được lượng tử hóa một cách tự nhiên" liền mạch như GGUF. Nó chia chúng thành các tenxơ số nguyên và hệ số tỷ lệ riêng biệt, điều này "có thể dẫn đến giảm chất lượng". Việc chuyển đổi các mô hình có các lớp phức tạp hoặc tùy chỉnh không phải là tiêu chuẩn trong ONNX cũng có thể khó khăn và có thể yêu cầu công việc tùy chỉnh có thể làm chậm hiệu suất.
Các định dạng truyền thống dựa trên pickle của Python (như tệp .pt) lưu các đối tượng Python, có thể bao gồm mã có thể chạy được. Điều này coi mô hình như một chương trình. Ngược lại, ONNX tập trung vào việc lưu "đồ thị tính toán" của mô hình — một biểu diễn trừu tượng hơn về các hoạt động và luồng dữ liệu của nó, thay vì một triển khai mã cụ thể.
Cách tiếp cận lấy đồ thị làm trung tâm này là điều mang lại cho ONNX khả năng di động đa framework tuyệt vời và cho phép nó được tối ưu hóa cho các phần cứng khác nhau. Bằng cách định nghĩa logic của mô hình ở một cấp độ cao hơn, nó trở nên độc lập với framework mà nó đã được huấn luyện. Đây là một sự thay đổi khái niệm đáng kể, chuyển từ một triển khai dành riêng cho framework sang một biểu diễn tính toán di động. Mặc dù điều này cải thiện đáng kể tính linh hoạt khi triển khai, nó cũng tạo ra các mối lo ngại về bảo mật mới, như các cửa hậu kiến trúc, đòi hỏi các chiến lược bảo mật khác với các chiến lược được sử dụng cho các định dạng dựa trên pickle.
3.3. GGUF (GPT-Generated Unified Format)
GGUF (GPT-Generated Unified Format) là một định dạng tệp được thiết kế đặc biệt để lưu trữ và chạy các mô hình ngôn ngữ lớn (LLM) một cách hiệu quả. Nó là một phiên bản cải tiến của tiền thân của nó, GGML, và nhằm mục đích làm cho các LLM dễ sử dụng hơn, đặc biệt là trên các máy tính cá nhân.
Đặc điểm và các Trường hợp Sử dụng Chính
GGUF được thiết kế để làm cho các LLM nhỏ hơn và tải nhanh hơn nhiều. Điều này rất quan trọng để chạy các mô hình cục bộ, nơi không gian lưu trữ và RAM thường bị hạn chế. Định dạng này sử dụng "các kỹ thuật nén tiên tiến" để đạt được điều này. Nó cũng cung cấp một cách tiêu chuẩn để đóng gói trọng số, kiến trúc và siêu dữ liệu của một mô hình, đảm bảo nó hoạt động nhất quán trên các phần mềm khác nhau, đặc biệt là với các công cụ suy luận dựa trên llama.cpp.
Một tính năng chính của GGUF là sự hỗ trợ tuyệt vời cho lượng tử hóa. Lượng tử hóa làm giảm độ chính xác số học của trọng số của một mô hình (ví dụ: từ số 16-bit xuống 4-bit), điều này làm giảm đáng kể kích thước tệp và tính toán cần thiết để chạy nó. Các mô hình GGUF có sẵn ở các mức lượng tử hóa khác nhau (từ Q2 đến Q8), cung cấp một loạt các sự đánh đổi giữa kích thước và chất lượng.
- Các mức lượng tử hóa thấp hơn (như Q2 hoặc Q3) dẫn đến các tệp rất nhỏ có thể chạy trên phần cứng có ít RAM hơn, nhưng có thể có một sự sụt giảm nhẹ về chất lượng mô hình.
- Các mức lượng tử hóa cao hơn (như Q6 hoặc Q8) duy trì chất lượng tốt hơn nhưng yêu cầu nhiều dung lượng lưu trữ và RAM hơn.
Các trường hợp sử dụng chính cho GGUF bao gồm:
- Triển khai LLM Cục bộ: Các công cụ như Ollama sử dụng GGUF để giúp người dùng dễ dàng chạy các LLM mạnh mẽ trên máy tính của riêng họ.
- Trợ lý AI Ngoại tuyến: Nhiều ứng dụng sử dụng các mô hình GGUF để cung cấp các giải pháp thay thế cục bộ, riêng tư cho các công cụ AI dựa trên đám mây.
- Hỗ trợ Viết mã: Các IDE và trình soạn thảo mã đang bắt đầu sử dụng các mô hình GGUF để hoàn thành mã thông minh.
- Chatbot Cục bộ: Các mô hình GGUF thường được sử dụng cho các hệ thống AI đàm thoại riêng tư và phản hồi nhanh.
- Nghiên cứu AI: Sự linh hoạt và hỗ trợ lượng tử hóa của nó làm cho nó phổ biến trong giới nghiên cứu để thử nghiệm với các LLM trên phần cứng có thể tiếp cận.
Những cân nhắc về Bảo mật
Trái với suy nghĩ phổ biến, thư viện GGML cơ bản (mà GGUF dựa trên) đã có các lỗ hổng được ghi nhận liên quan đến "việc xác thực không đầy đủ trên tệp đầu vào". Những thiếu sót này có thể dẫn đến "các lỗ hổng tham nhũng bộ nhớ có khả năng khai thác trong quá trình phân tích cú pháp". Các vấn đề bảo mật cụ thể đã được xác định, trong đó đầu vào không được kiểm tra từ người dùng có thể gây ra tràn bộ đệm heap, có khả năng cho phép kẻ tấn công chạy mã độc.
Có một quan niệm sai lầm phổ biến rằng một tệp GGUF "không thể chứa mã" và "chỉ là một tệp mô hình". Tuy nhiên, một báo cáo bảo mật từ Databricks đã chỉ ra rằng trong khi bản thân tệp GGUF không chứa mã Python có thể thực thi, một tệp được tạo ra đặc biệt có thể khai thác các lỗ hổng trong trình phân tích cú pháp (phần mềm đọc tệp) để gây ra tham nhũng bộ nhớ và đạt được việc thực thi mã.
Để giảm thiểu những rủi ro này, tốt nhất là:
- Sử dụng các mô hình và công cụ từ các nguồn uy tín, nổi tiếng (như Koboldcpp).
- Chạy các LLM trong các môi trường cô lập (như Docker container).
- Đối với các tác vụ có độ nhạy cảm cao, hãy xem xét sử dụng một máy chuyên dụng không có truy cập internet.
Nhược điểm
Một nhược điểm lớn của GGUF là hầu hết các mô hình ban đầu được phát triển trong các framework khác (như PyTorch) và phải được chuyển đổi sang định dạng GGUF. Quá trình chuyển đổi này không phải lúc nào cũng dễ dàng, và một số mô hình có thể không được hỗ trợ đầy đủ bởi các công cụ tương thích với GGUF. Ngoài ra, việc sửa đổi hoặc tinh chỉnh một mô hình sau khi nó ở định dạng GGUF nói chung là "không đơn giản".
Trong khi GGUF được thiết kế để tải nhanh và sử dụng VRAM hiệu quả, tốc độ suy luận thực tế (tốc độ mô hình tạo ra phản hồi) đôi khi có thể chậm hơn so với các mô hình không được lượng tử hóa. Điều này có thể xảy ra với các mức lượng tử hóa thấp hơn do công việc bổ sung cần thiết để giải lượng tử hóa các trọng số trong quá trình suy luận. Lợi ích hiệu suất chính của GGUF là nó cho phép các mô hình lớn chạy trên phần cứng tiêu dùng bằng cách tiết kiệm VRAM, chứ không nhất thiết làm cho chúng nhanh hơn.
Đặc điểm nổi bật của GGUF là sự tích hợp sâu với lượng tử hóa, cho phép các LLM mạnh mẽ chạy trên "phần cứng cấp tiêu dùng" với VRAM hạn chế. Điều này giúp dân chủ hóa quyền truy cập vào AI. Tuy nhiên, hiệu quả này đi kèm với sự đánh đổi. Trong khi lượng tử hóa làm cho các mô hình nhỏ hơn, các mức thấp hơn có thể làm giảm chất lượng mô hình một chút. Ngoài ra, tốc độ suy luận đôi khi có thể chậm hơn so với các mô hình không được lượng tử hóa, đặc biệt nếu phiên bản không được lượng tử hóa vừa vặn hoàn toàn trong VRAM.
Lợi ích về "tốc độ" của GGUF thường đề cập đến việc tải nhanh hơn và khả năng chạy một mô hình lớn hơn trên phần cứng hạn chế, thay vì hiệu suất thô. GGUF nắm bắt hoàn hảo xu hướng "dân chủ hóa AI" bằng cách làm cho các mô hình tiên tiến có thể tiếp cận được với nhiều người hơn. Điều này đòi hỏi người dùng phải cân bằng chất lượng mô hình với các giới hạn của phần cứng của họ. Sự sẵn có của nhiều mức lượng tử hóa cho phép người dùng điều chỉnh các mô hình theo nhu cầu cụ thể của họ, đây là chìa khóa cho sự phổ biến của định dạng trong cộng đồng AI cục bộ.
4. Phân tích So sánh các Định dạng
Việc lựa chọn một định dạng tuần tự hóa mô hình phù hợp là một quyết định chiến lược phụ thuộc vào việc cân bằng các yếu tố khác nhau, bao gồm bảo mật, hiệu suất, hiệu quả tài nguyên, khả năng tương tác và bối cảnh ứng dụng cụ thể. Bảng dưới đây cung cấp một cái nhìn tổng quan so sánh về Safetensors, CKPT, ONNX và GGUF trên các khía cạnh quan trọng này.
| Tính năng / Định dạng | Safetensors | CKPT (.pt/.pth) | ONNX | GGUF |
|---|---|---|---|---|
| Mục đích chính | Lưu trữ tenxơ an toàn, nhanh chóng cho các mô hình học sâu | Checkpoint huấn luyện, tham số mô hình, bảo toàn trạng thái | Khả năng tương tác đa framework, triển khai trên nhiều phần cứng đa dạng | Lưu trữ LLM hiệu quả, suy luận cục bộ được tối ưu hóa trên phần cứng tiêu dùng |
| Hồ sơ Bảo mật | Cao (không thực thi mã tùy ý theo thiết kế) | Thấp (thực thi mã tùy ý qua giải tuần tự hóa Pickle) | Trung bình (không thực thi mã tùy ý, nhưng có thể có cửa hậu kiến trúc) | Trung bình (lỗ hổng thư viện cơ bản, nhưng bản thân tệp không phải là mã Python thực thi) |
| Tốc độ Tải | Rất nhanh (sao chép tại chỗ, tải theo yêu cầu) | Thay đổi (có thể chậm hơn Safetensors do tải toàn bộ) | Nhanh (runtime được tối ưu hóa, tối ưu hóa đồ thị) | Nhanh (mmap, hiệu quả cho LLM) |
| Sử dụng Bộ nhớ | Hiệu quả (tải theo yêu cầu, tải một phần) | Có thể cao (tải toàn bộ đồ thị đối tượng) | Hiệu quả (tối ưu hóa runtime) | Rất hiệu quả (lượng tử hóa, tiết kiệm VRAM) |
| Dung lượng Đĩa | Hiệu quả (nén, chỉ chứa tenxơ) | Thay đổi (có thể lớn, bao gồm toàn bộ trạng thái) | Hiệu quả (định dạng Protobuf) | Rất hiệu quả (lượng tử hóa, nén tiên tiến) |
| Hỗ trợ Lượng tử hóa | Có, nhưng kém linh hoạt hơn GGUF (phụ thuộc vào PyTorch) | Có (phụ thuộc vào framework) | Hỗ trợ gốc hạn chế (phân rã tenxơ) | Mạnh mẽ (nhiều cấp độ, Q2-Q8, các biến thể chuyên biệt) |
| Tính di động | Cao (trên các ngôn ngữ lập trình khác nhau) | Thấp (gắn chặt với các framework cụ thể) | Rất cao (đa framework, đa nền tảng, phần cứng đa dạng) | Cao (đặc biệt cho hệ sinh thái llama.cpp) |
| Ứng dụng chính | Chia sẻ mô hình an toàn, mặc định của Hugging Face | Huấn luyện, tinh chỉnh, nghiên cứu, lưu mô hình | Triển khai sản xuất, di động/biên, khả năng tương tác | Suy luận LLM cục bộ, phần cứng tiêu dùng, ứng dụng trò chuyện |
| Lợi thế chính | Bảo mật theo thiết kế, tải nhanh, dấu chân bộ nhớ thấp | Bảo toàn trạng thái huấn luyện, khả năng tái tạo chi tiết | Triển khai phổ quát, tối ưu hóa runtime, không phụ thuộc framework | Hiệu quả LLM trên phần cứng tiêu dùng, lượng tử hóa linh hoạt |
| Nhược điểm chính | Cần trình phân tích cú pháp JSON cho siêu dữ liệu trong C++ | Rủi ro thực thi mã tùy ý, kích thước tệp lớn | Phức tạp đối với các lớp tùy chỉnh, hỗ trợ lượng tử hóa gốc hạn chế | Thường yêu cầu chuyển đổi, có thể làm chậm suy luận với các mức lượng tử hóa thấp hơn |
5. Kết luận
Thế giới các định dạng mô hình học máy không ngừng phát triển, được thúc đẩy bởi nhu cầu về bảo mật, hiệu suất và khả năng tương tác tốt hơn. Các định dạng truyền thống, như các tệp CKPT dựa trên pickle, linh hoạt cho nghiên cứu nhưng lại đưa ra những rủi ro bảo mật nghiêm trọng bằng cách cho phép thực thi mã tùy ý. Điều này đã dẫn đến việc phát triển và áp dụng các định dạng mới hơn, an toàn hơn.
Safetensors là một ví dụ hàng đầu của sự thay đổi này. Bằng cách tách dữ liệu khỏi mã và sử dụng các kỹ thuật tải hiệu quả, nó cung cấp một giải pháp thay thế an toàn và hiệu suất cao để chia sẻ các mô hình học sâu, đặc biệt là trong hệ sinh thái Hugging Face. Lợi ích kép về bảo mật và tốc độ đã khiến nó trở thành một lựa chọn phổ biến trong các quy trình làm việc AI hiện đại.
ONNX giải quyết vấn đề lớn về sự không tương thích của các framework. Bằng cách biểu diễn các mô hình dưới dạng các đồ thị tính toán trừu tượng, nó cho phép chúng được triển khai trên các phần cứng và phần mềm khác nhau. Mặc dù ONNX ngăn chặn việc thực thi mã tùy ý như trong pickle, nó có những lo ngại về bảo mật riêng, như các cửa hậu kiến trúc, đòi hỏi các biện pháp bảo vệ khác nhau.
GGUF là một giải pháp chuyên biệt để chạy các mô hình ngôn ngữ lớn trên phần cứng tiêu dùng. Các tính năng lượng tử hóa mạnh mẽ của nó làm giảm đáng kể kích thước mô hình và việc sử dụng bộ nhớ, giúp nhiều người có thể tiếp cận các LLM mạnh mẽ hơn. Tuy nhiên, hiệu quả này đôi khi có thể dẫn đến tốc độ suy luận chậm hơn, và các thư viện cơ bản của nó đã cho thấy các lỗ hổng đòi hỏi người dùng phải thận trọng.
Cuối cùng, định dạng tốt nhất phụ thuộc vào bối cảnh cụ thể.
- Safetensors là lựa chọn hàng đầu để chia sẻ các mô hình học sâu một cách an toàn và hiệu quả.
- ONNX là lý tưởng để triển khai các mô hình trên các framework và phần cứng khác nhau.
- GGUF cung cấp hiệu quả vô song để chạy các mô hình ngôn ngữ lớn trên các thiết bị cục bộ, có tài nguyên hạn chế.
Trong khi các định dạng CKPT truyền thống vẫn hữu ích để lưu tiến trình huấn luyện trong các môi trường được kiểm soát, chúng đang được thay thế bằng các giải pháp thay thế an toàn hơn để phân phối công khai. Khi lĩnh vực AI trưởng thành, sự phát triển liên tục của các định dạng chuyên biệt này sẽ là điều cần thiết để thúc đẩy sức mạnh và phạm vi tiếp cận của học máy.





