Chuyển đến nội dung chính

Định dạng SafeTensors: Hướng dẫn tuần tự hóa mô hình ML an toàn

SafeTensors đã gia nhập PyTorch Foundation vào tháng 4/2026 với vai trò định dạng checkpoint mặc định trên Hugging Face Hub. Đây là cách cấu trúc header - data giúp việc tải mô hình an toàn.
Đã cập nhật 15 thg 6, 2026  · 10 phút đọc

Nếu gần đây bạn tải xuống một mô hình từ Hugging Face, có lẽ bạn đã thấy một tệp .safetensors thay vì .bin hoặc .pkl. Sự thay đổi này lớn hơn vẻ bề ngoài.

Trong nhiều năm, hầu hết các framework ML dựa vào tuần tự hóa bằng pickle để lưu checkpoint mô hình. Cách đó đủ dùng, nhưng đi kèm một cái giá ẩn: tải một checkpoint có thể thực thi mã Python tùy ý trong quá trình giải tuần tự, mở ra nguy cơ tấn công chuỗi cung ứng và các payload độc hại ẩn trong những tệp mô hình có vẻ vô hại.

SafeTensors được xây dựng để khép lại khoảng trống đó. Nó chỉ lưu các trọng số tensor thô và không thực thi mã khi tải, khiến nó trở thành định dạng mặc định trên Hugging Face Hub. Vào tháng 4 năm 2026, dự án chính thức gia nhập PyTorch Foundation dưới Linux Foundation cùng với các dự án như PyTorch, vLLM, DeepSpeed và Ray. 

Hãy đọc tiếp để hiểu cách định dạng này hoạt động bên dưới và so sánh với các định dạng khác.

SafeTensors là gì?

SafeTensors là một định dạng tệp được thiết kế riêng để lưu trữ trọng số mô hình một cách an toàn. 

Định dạng này tách dữ liệu tensor số thô khỏi mã thực thi và chỉ lưu các trọng số. Đây là điểm khác biệt giữa SafeTensors và các định dạng dựa trên pickle.

Định dạng này cũng phù hợp tự nhiên với các pipeline ML hiện đại vì nó tập trung vào những gì hầu hết checkpoint đã chứa sẵn: 

  • Tensor
  • Kích thước (shape)
  • Kiểu dữ liệu (datatype)
  • Giá trị trọng số

Thay vì hoạt động như một hệ thống tuần tự hóa Python đa dụng, SafeTensors hoạt động như một lớp lưu trữ dành riêng cho tham số mô hình.

Mặc dù Hugging Face ban đầu phát triển SafeTensors cho hệ sinh thái của mình, bản thân định dạng này không phụ thuộc framework. Nó mới gia nhập PyTorch Foundation (vào tháng 4 năm 2026) và hỗ trợ PyTorch, TensorFlow, JAX, Flax, NumPy và các framework ML khác.

Vấn đề với Pickle: Vì sao cần một định dạng mới

Định dạng Pickle của Python được xây dựng cho các ứng dụng Python nói chung, nơi lập trình viên thường cần lưu và khôi phục toàn bộ đối tượng Python cùng trạng thái nội tại, phương thức và logic tái tạo của chúng.

Checkpoint machine learning thường không cần mức lưu trữ đó. Hầu hết tệp mô hình chủ yếu lưu tensor: ma trận trọng số, embedding, bias và các tham số số khác. Trên thực tế, điều đó có nghĩa checkpoint phần lớn chỉ là dữ liệu số có cấu trúc.

Nhưng một tệp .pkl làm nhiều hơn việc chỉ lưu dữ liệu. Nó cũng có thể chứa hướng dẫn cho Python về cách dựng lại đối tượng khi tải. Nghĩa là giải tuần tự không chỉ là thao tác đọc thụ động; nó có thể thực thi mã. Và nếu mã đó độc hại, đây sẽ là vấn đề bảo mật nghiêm trọng. 

Cách pickle cho phép thực thi mã tùy ý

Python dựng lại đối tượng trong quá trình giải tuần tự pickle bằng các phương thức đặc biệt như __reduce__(). Các lớp có thể định nghĩa phương thức này để chỉ cho pickle biết chính xác cách đối tượng nên được tái tạo khi ai đó tải nó vào bộ nhớ.

Ví dụ, __reduce__() có thể trả về một hàm có thể gọi kèm đối số cho hàm đó. Trong quá trình giải tuần tự, Python thực thi hàm đó để tái tạo đối tượng. Ví dụ mã:

import pickle
import os

class Demo:
    def __reduce__(self):
        return (os.system, ("echo 'Code executed during deserialization'",))

payload = pickle.dumps(Demo())

pickle.loads(payload)

Khi pickle.loads() chạy, Python thực thi hàm được trả về bởi __reduce__(). Trong ví dụ này, việc giải tuần tự kích hoạt một lệnh shell thông qua os.system().

Vấn đề không nằm ở chính lệnh shell. __reduce__() có thể trả về bất kỳ callable nào cùng các đối số tùy ý dựa trên logic. Điều đó có nghĩa tệp Pickle có thể gọi các hàm khác, tải xuống tệp, sửa đổi môi trường hoặc thực thi mã độc hại trong quá trình tải. Đó là lý do tài liệu Python cảnh báo rõ ràng về việc tải dữ liệu pickle từ nguồn không tin cậy.

Rủi ro trong thời đại chia sẻ mô hình

Các nền tảng như Hugging Face Hub hiện lưu trữ hơn một triệu mô hình do nhà nghiên cứu, startup, người đam mê và cộng tác viên ẩn danh chia sẻ. Hệ sinh thái phát triển nhanh vì nhà phát triển có thể tải xuống và thử nghiệm mô hình ngay lập tức. Nhưng hầu hết các checkpoint được tải lên không được kiểm toán riêng trước khi phân phối.

Nhiều checkpoint PyTorch vẫn dựa vào tuần tự hóa bằng pickle thông qua các định dạng như .pt hoặc .bin. Khi ai đó tải một trong những tệp đó, Python có thể thực thi logic giải tuần tự được nhúng trong checkpoint. Nếu checkpoint độc hại, logic đó có thể đánh cắp thông tin xác thực, đọc biến môi trường, tải payload hoặc thực thi mã từ xa trong quá trình tải.

Pickle vs SafeTensors

Đây chính là vấn đề mà SafeTensors được xây dựng để giải quyết. Thay vì tuần tự hóa các đối tượng Python tùy ý, nó chỉ lưu dữ liệu tensor và metadata cần thiết để tải các tensor đó một cách chính xác. Tải một tệp .safetensors không cần thực thi logic tái tạo của Python, nhờ đó giảm đáng kể bề mặt tấn công.

Cách định dạng SafeTensors hoạt động

Giờ chúng ta đã biết SafeTensors là gì và vì sao nó tồn tại, hãy xem cấu trúc và cách nó vận hành.

Cấu trúc header - data

Một tệp SafeTensors có hai phần: một header JSON theo sau là dữ liệu tensor thô.

Phần header lưu metadata cho mỗi tensor, bao gồm 

  • Tên tensor
  • Kích thước (shape)
  • Kiểu dữ liệu
  • Vị trí byte (byte offset)

Sau phần header, tệp lưu các byte tensor thô liên tục.

Header hoạt động như một mục lục. Nó cho bộ nạp biết những tensor nào tồn tại và chúng nằm ở đâu trong tệp, tương tự cách chỉ mục cơ sở dữ liệu trỏ đến bản ghi đã lưu. SafeTensors giới hạn kích thước header ở mức 100MB để ngăn metadata quá khổ.

SafeTensors File Anatomy

Tải kiểu zero-copy và memory-mapped

SafeTensors cải thiện tốc độ tải thông qua cơ chế memory-mapped. Thay vì dựng lại đối tượng Python khi giải tuần tự, các framework có thể ánh xạ dữ liệu tensor trực tiếp từ đĩa vào bộ nhớ. Điều đó giảm các bản sao dữ liệu không cần thiết và hạ thấp chi phí CPU khi tải.

Theo so sánh chuẩn của Hugging Face, SafeTensors tải trọng số nhanh hơn khoảng 76 lần so với PyTorch trên CPU và khoảng 2 lần trên khối lượng công việc GPU. Tất nhiên, mức tăng tốc chính xác còn phụ thuộc phần cứng và kích thước checkpoint, nhưng việc tránh giải tuần tự Python luôn cải thiện hiệu năng tải.

Tải lười (lazy) và giải tuần tự một phần

SafeTensors tải các tensor cụ thể theo tên thay vì đọc toàn bộ checkpoint vào bộ nhớ cùng lúc.

Điều đó hữu ích với các mô hình phân tán lớn chạy trên nhiều GPU. Lấy ví dụ mô hình BLOOM 176B tham số. Với các checkpoint PyTorch tiêu chuẩn, hệ thống trước tiên phải giải tuần tự đầy đủ trọng số mô hình rồi mới chia chúng lên các thiết bị, mất khoảng 10 phút. 

Với SafeTensors, mỗi GPU chỉ tải các mảnh tensor mà nó thực sự cần. Cách này giảm thời gian khởi động mô hình xuống còn khoảng 45 giây trên 8 GPU.

SafeTensors so với các định dạng tuần tự hóa khác

SafeTensors hoạt động hiệu quả để lưu trữ và tải trọng số mô hình một cách an toàn và hiệu quả, nhưng không vì thế mà nó thay thế được mọi định dạng. Lựa chọn đúng phụ thuộc vào bạn đang lưu gì và mô hình nằm ở đâu trong pipeline.

Chúng ta đã nói khá nhiều về pickle, nên tôi sẽ tập trung vào các định dạng khác.

SafeTensors so với GGUF

SafeTensors và GGUF giải quyết các bài toán khác nhau. 

GGUF, viết tắt của GGML Unified Format, được xây dựng cho khối lượng công việc suy luận đã lượng tử hóa trong các runtime như llama.cpp. Định dạng này tập trung vào triển khai hiệu quả các mô hình nén, đặc biệt cho suy luận CPU và thiết bị biên. 

SafeTensors nằm sớm hơn trong pipeline. Hầu hết checkpoint SafeTensors lưu trữ tensor độ chính xác đầy đủ hoặc sẵn sàng cho huấn luyện, dùng cho huấn luyện, fine-tune, trộn mô hình, hoặc các quy trình suy luận phân tán. Định dạng này ưu tiên tải an toàn, tương thích với các framework như PyTorch, và truy cập tensor hiệu quả trong quá trình huấn luyện và phục vụ.

Chúng có thể bổ trợ cho nhau thay vì cạnh tranh trực tiếp. Quy trình ví dụ: 

  • Huấn luyện hoặc fine-tune mô hình bằng PyTorch và checkpoint SafeTensors
  • Lượng tử hóa mô hình cuối cùng
  • Xuất ra GGUF để triển khai trong llama.cpp hoặc các runtime suy luận trên thiết bị biên

SafeTensors so với ONNX

SafeTensors tập trung vào lưu trữ trọng số mô hình an toàn và tải chúng hiệu quả trong các framework như PyTorch. Nó chỉ lưu tensor và metadata, giúp gọn nhẹ và nhanh cho việc chia sẻ checkpoint, fine-tune và quy trình huấn luyện.

ONNX có cách tiếp cận rộng hơn. Nó lưu toàn bộ đồ thị tính toán cùng tham số mô hình. Điều đó khiến ONNX hữu ích khi bạn muốn xuất mô hình từ một framework và chạy nó ở một môi trường hoàn toàn khác.

Ví dụ, các nhóm huấn luyện và fine-tune LLM bằng PyTorch thường sẽ ưa thích checkpoint SafeTensors vì chúng tải nhanh và tích hợp trực tiếp vào quy trình sẵn có. Nhưng nếu cùng nhóm đó cần triển khai mô hình vào TensorRT, ONNX Runtime, hoặc một engine suy luận biên, xuất mô hình sang ONNX sẽ hợp lý hơn.

Sử dụng SafeTensors trong thực tế

Một lý do SafeTensors lan rộng nhanh trong hệ sinh thái PyTorch là API của nó rất quen thuộc. Bạn vẫn làm việc với state dictionary và tensor như thường lệ.

Lưu và tải tensor

Quy trình cơ bản trông giống hệt cách xử lý checkpoint PyTorch tiêu chuẩn. Ví dụ như sau:

import torch
from safetensors.torch import save_file, load_file

tensors = {
    "weights": torch.randn(2, 2),
    "bias": torch.zeros(2)
}

save_file(tensors, "model.safetensors")

loaded_tensors = load_file("model.safetensors")

print(loaded_tensors["weights"])

save_file() ghi các tensor vào định dạng .safetensors, còn load_file() tải chúng trở lại vào bộ nhớ.

SafeTensors cũng hỗ trợ tải chọn lọc thông qua safe_open(), hữu ích với các checkpoint lớn khi bạn chỉ cần một vài tensor.

from safetensors import safe_open

with safe_open("model.safetensors", framework="pt") as f:
    weights = f.get_tensor("weights")

print(weights)

Thay vì tải toàn bộ checkpoint, get_tensor() chỉ đọc tensor bạn yêu cầu.

Chuyển đổi các mô hình hiện có sang safetensors

Mẫu chuẩn là:

  1. Tải mô hình hiện có
  2. Trích xuất state dictionary
  3. Lưu bằng save_file()
from transformers import AutoModel
from safetensors.torch import save_file

model = AutoModel.from_pretrained("bert-base-uncased")

save_file(model.state_dict(), "model.safetensors")

state_dict() trả về trọng số mô hình dưới dạng tensor, thứ mà SafeTensors có thể lưu trực tiếp. 

Nếu mô hình đã có trên Hugging Face Hub, bạn thậm chí có thể không cần mã chuyển đổi cục bộ. Hugging Face cung cấp hỗ trợ chuyển đổi checkpoint tích hợp cho nhiều mô hình được lưu trữ thông qua giao diện Hub.

Định dạng tuần tự hóa: Bảng so sánh

Tính năng SafeTensors Pickle (.pkl/.bin/.pt) GGUF ONNX
Thực thi mã tùy ý Không Không Không
Trường hợp sử dụng chính Huấn luyện, fine-tune, chia sẻ checkpoint Tuần tự hóa Python tổng quát Suy luận lượng tử hóa trên thiết bị biên/CPU Triển khai xuyên framework
Lưu đồ thị tính toán Không Không Không
Tải memory-mapped Không Không
Tải tensor lười/một phần Không Không
Hỗ trợ framework PyTorch, TF, JAX, Flax, NumPy Python (mọi framework) llama.cpp, runtime biên ONNX Runtime, TensorRT, biên
Hỗ trợ lượng tử hóa Đang mở rộng (FP8, GPTQ, AWQ) Không Có (gốc)
Mặc định trên Hugging Face Hub Không Không Không

SafeTensors năm 2026: PyTorch Foundation và bước tiếp theo

Vào tháng 4 năm 2026, Hugging Face đã đóng góp SafeTensors cho PyTorch Foundation dưới Linux Foundation. Dự án giờ đây nằm cạnh PyTorch, vLLM, DeepSpeed và Ray dưới sự quản trị của quỹ.

Động thái đó cho thấy SafeTensors không còn chỉ là dự án của Hugging Face. Nó đang trở thành hạ tầng dùng chung cho hệ sinh thái ML. 

Thông báo cũng đề cập đến hướng phát triển tiếp theo của định dạng.

Tải theo thiết bị (device-aware)

Một trọng tâm lớn là tải theo thiết bị. Hiện nay, nhiều quy trình vẫn tải tensor vào bộ nhớ CPU trước khi chuyển chúng sang thiết bị CUDA hoặc ROCm. Bước trung gian đó làm tăng độ trễ khởi động, đặc biệt với hệ thống phân tán lớn. 

Nhóm duy trì SafeTensors đang phát triển các đường tải trực tiếp lên thiết bị để giảm các bản sao qua CPU không cần thiết và chuyển tensor thẳng lên bộ tăng tốc. 

Tải phân tán

Hỗ trợ tải phân tán cũng đang phát triển. Các hệ thống suy luận hiện đại hiếm khi chạy mô hình trên một GPU duy nhất. Song song tensor và song song pipeline nay là các mô hình triển khai tiêu chuẩn cho mô hình lớn, nhưng API tải checkpoint trên các framework vẫn phân mảnh. 

SafeTensors đang mở rộng hỗ trợ tải nhận biết shard và bố cục tensor phân tán, để các framework có thể phối hợp tải checkpoint hiệu quả hơn trên nhiều thiết bị. 

Quy trình lượng tử hóa hiện đại

Định dạng này cũng đang thích ứng với các quy trình lượng tử hóa mới. Hệ thống suy luận ngày càng dựa vào các định dạng FP8, GPTQ và AWQ để giảm sử dụng bộ nhớ và chi phí phục vụ. 

Thay vì buộc các framework xử lý chúng qua logic tuần tự hóa tùy chỉnh, SafeTensors đang bổ sung hỗ trợ chính thức cho các định dạng tensor độ chính xác thấp và lượng tử hóa theo khối ngay trong chính định dạng. 

Hiện tại, nhà phát triển vẫn phải chủ động dùng SafeTensors bằng cách chuyển đổi giữa các quy trình lưu và tải. Nhưng đang có nỗ lực tích hợp sâu hơn với hệ thống tuần tự hóa gốc của PyTorch. Nếu điều đó thành công, SafeTensors có thể thôi là một định dạng checkpoint thay thế và trở thành cách mặc định để PyTorch lưu trữ mô hình.

Kết luận

Trong nhiều năm, nhà phát triển chia sẻ checkpoint mô hình bằng các hệ thống tuần tự hóa có thể thực thi mã Python tùy ý khi tải. Khi các hub mô hình công khai bắt đầu lưu trữ hàng triệu checkpoint, rủi ro bảo mật trở nên khó phớt lờ hơn nhiều.

SafeTensors đã thay đổi điều đó bằng cách thu hẹp phạm vi của định dạng. Thay vì cố gắng tuần tự hóa toàn bộ đối tượng Python, nó chỉ tập trung lưu trữ các tensor và metadata cần để tải chúng. Thiết kế đơn giản hơn này loại bỏ rủi ro giải tuần tự đi kèm các checkpoint dựa trên pickle, đồng thời cải thiện tốc độ tải và hiệu quả bộ nhớ.

Vì vậy, khi bạn chỉ cần trọng số mô hình, thì không có lý do gì để thực thi mã tùy ý trong quá trình giải tuần tự; tốt hơn là sử dụng SafeTensors trong những trường hợp đó.

Nếu bạn muốn làm việc sâu hơn với công cụ ML hiện đại, định dạng mô hình và quy trình Hugging Face, các khóa học Deep Learning in PythonWorking with Hugging Face của chúng tôi là bước tiếp theo phù hợp. Chúng bao quát quy trình thực tiễn để huấn luyện, fine-tune và triển khai mô hình với các công cụ được sử dụng rộng rãi trong hệ sinh thái AI hiện nay.

Câu hỏi thường gặp về SafeTensors

Tôi có thể chuyển đổi các mô hình .bin hoặc .pt hiện có sang SafeTensors không?

Có. Bạn có thể tải mô hình như bình thường trong PyTorch hoặc Transformers, trích xuất state_dict() và lưu nó bằng save_file() từ thư viện safetensors. Hugging Face Hub cũng hỗ trợ chuyển đổi tự động cho nhiều mô hình được lưu trữ.

SafeTensors có thể lưu trữ các mô hình đã lượng tử hóa không?

Có. SafeTensors đã hỗ trợ một số kiểu tensor độ chính xác thấp và hỗ trợ cho các định dạng như FP8, GPTQ và AWQ đang được mở rộng khi suy luận lượng tử hóa ngày càng phổ biến.

Tôi có thể kiểm tra nội dung một tệp SafeTensors mà không cần tải toàn bộ mô hình không?

Có. Định dạng này lưu metadata của tensor riêng trong phần header, vì vậy bạn có thể kiểm tra tên tensor, kích thước và kiểu dữ liệu mà không cần tải toàn bộ checkpoint vào bộ nhớ.

Việc sử dụng SafeTensors có ảnh hưởng đến độ chính xác của mô hình không?

Không. SafeTensors chỉ thay đổi cách lưu và tải trọng số, không thay đổi chính các giá trị số. Mô hình sẽ hoạt động như cũ sau khi tải.

SafeTensors chỉ hữu ích cho khối lượng công việc suy luận thôi sao?

Nhà phát triển sử dụng nó trong quá trình huấn luyện, fine-tune, chia sẻ checkpoint và cả các quy trình tải phân tán.


Srujana Maddula's photo
Author
Srujana Maddula
LinkedIn

Srujana là một cây bút công nghệ tự do với bằng Cử nhân Khoa học Máy tính. Việc viết về nhiều chủ đề như khoa học dữ liệu, điện toán đám mây, phát triển, lập trình, bảo mật và nhiều lĩnh vực khác đến với cô một cách tự nhiên. Cô yêu thích văn học kinh điển và khám phá những điểm đến mới.

Chủ đề

Các khóa học Machine Learning hàng đầu

Tracks

Cơ bản về Học máy trong Python

16 giờ
Học nghệ thuật của Học máy và trở thành chuyên gia trong dự đoán, nhận dạng mẫu, cũng như những bước đầu tiên của Học sâu và Học tăng cường.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow