Robocikowo>ROBOCIKOWO
Infrastruktura

Safetensors

2022AktywnyOpublikowano: 20 marca 2026Aktualizacja: 20 marca 2026Opublikowany
Safetensors to bezpieczny i szybki format serializacji tensorów używany do przechowywania oraz dystrybucji wag modeli AI bez ryzyka wykonywania złośliwego kodu.
Kluczowa innowacja
Binarny format serializacji tensorów oparty na nagłówku JSON i surowych danych liczbowych bez mechanizmu deserializacji kodu wykonywalnego, eliminujący ryzyko wykonania złośliwego kodu obecne w formatach opartych na pickle (np. PyTorch .pt/.bin), przy jednoczesnym umożliwieniu memory-mapped I/O i selektywnego ładowania tensorów.
Kategoria
Infrastruktura
Poziom abstrakcji
Pattern
Poziom operacji
UdostępnianieWdrożenie
Zastosowania
Przechowywanie wag modeli AI i checkpointówBezpieczna dystrybucja modeli w hubach i repozytoriachŁadowanie modeli w środowiskach produkcyjnych o podwyższonych wymaganiach bezpieczeństwaPublikowanie modeli open-weight bez użycia pickleObsługa szybkiego inferencingu i serwowania modeliKonwersja starszych checkpointów do bezpieczniejszego formatuIntegracja z narzędziami do deploymentu i inference

Jak działa

Safetensors zapisuje tensory w prostym binarnym formacie z nagłówkiem metadanych opisującym nazwy tensorów, ich typy danych, kształty oraz offsety w pliku. Dzięki temu biblioteka może odczytywać zawartość bez potrzeby wykonywania kodu zawartego w pliku. Format został zaprojektowany tak, aby umożliwiać szybki dostęp do danych i wspierać scenariusze zero-copy lub częściowego mapowania pliku do pamięci, zależnie od używanego frameworka i środowiska. Implementacje istnieją dla popularnych ekosystemów, takich jak PyTorch, TensorFlow, JAX, PaddlePaddle i NumPy.

Rozwiązany problem

Safetensors rozwiązuje problem niebezpiecznej deserializacji wag modeli w formatach takich jak pickle oraz powiązanych z tym ryzyk bezpieczeństwa. Tradycyjne formaty checkpointów mogą wykonywać kod przy ładowaniu, co stwarza zagrożenie podczas pobierania modeli z zewnętrznych źródeł. Dodatkowo wiele starszych formatów nie było projektowanych z myślą o szybkim, prostym i przewidywalnym dostępie do tensorów na dużą skalę. Safetensors ogranicza te ryzyka, oferując bezpieczny, prosty i wydajny format do przechowywania tensorów.

Komponenty

Pole rozmiaru nagłówkaLokalizacja nagłówka JSON i walidacja granic pliku przed parsowaniem.

Pierwsze 8 bajtów pliku safetensors. Przechowuje rozmiar nagłówka JSON jako 64-bitową liczbę całkowitą bez znaku (uint64) w kolejności little-endian. Umożliwia natychmiastową lokalizację nagłówka JSON bez parsowania danych tensorów.

Nagłówek JSONPrzechowywanie metadanych tensorów (nazwy, typy, kształty, przesunięcia) umożliwiających selektywne ładowanie bez dostępu do danych surowych.

Zmienna długościowo sekcja UTF-8 JSON bezpośrednio po polu rozmiaru nagłówka. Zawiera słownik mapujący nazwy tensorów na ich dtype (np. F16, BF16, F32), shape (tablica wymiarów) i data_offsets ([BEGIN, END] względem początku obszaru danych). Opcjonalny klucz __metadata__ przechowuje dowolne pary string–string. Rozmiar ograniczony do 100 MB przez MAX_HEADER_SIZE.

Bufor danych tensorówPrzechowywanie surowych danych numerycznych tensorów w formacie możliwym do memory-mapped I/O.

Ciągły blok surowych bajtów przechowujący dane wszystkich tensorów w kolejności C (row-major), bez kompresji, bez paddingu między tensorami. Offsety z nagłówka JSON są relative do początku tego bufora (nie do początku pliku). Tensory muszą być upakowane (packed) przed serializacją — striding nie jest obsługiwany.

Implementacja

Pułapki implementacyjne
Shared tensors (tensory współdzielące pamięć) w PyTorchŚrednia

PyTorch pozwala na tensory współdzielące tę samą pamięć (storage). Adapter safetensors dla PyTorch zawiera specjalną logikę wykrywania i obsługi takich tensorów. Serializacja modeli z shared tensors bez tej obsługi może prowadzić do zduplikowania danych lub błędów. Po deserializacji współdzielenie pamięci jest tracone — każdy tensor jest niezależny.

Rozwiązanie:Używać oficjalnego adaptera safetensors.torch który obsługuje shared tensors. Weryfikować integralność modelu po konwersji z .pt do .safetensors przez porównanie parametrów.
Brak kompresji – duże rozmiary plików dla modeli o niskiej entropiiNiska

Format safetensors nie stosuje kompresji. Dane tensorów są przechowywane jako surowe bajty. Dla modeli o niskiej entropii (np. bardzo rzadkich wag lub kwantyzowanych modeli z wieloma zerami) rozmiar pliku może być znacznie większy niż przy formatach ze skompresowaną serializacją. Nie ma mechanizmu selektywnej kompresji.

Rozwiązanie:Jeśli rozmiar pliku jest krytyczny, rozważyć kompresję na poziomie systemu plików lub archiwa (np. .tar.zst). Format safetensors nie obsługuje wbudowanej kompresji zgodnie ze specyfikacją.
Zduplikowane klucze w nagłówku JSON – różne wyniki w różnych parserachŚrednia

Specyfikacja JSON formalnie nie definiuje zachowania przy zduplikowanych kluczach. Audit Trail of Bits wykazał, że referencyjna implementacja Hugging Face odrzuca pliki ze zduplikowanymi kluczami, ale niektóre parsery JSON firm trzecich akceptują je i przetwarzają w sposób niezdefiniowany. Złośliwy plik może zatem zachowywać się inaczej w różnych implementacjach.

Rozwiązanie:Używać wyłącznie oficjalnej biblioteki safetensors do parsowania. Przy implementacji własnych parserów: odrzucać pliki z zduplikowanymi kluczami JSON na etapie walidacji.
Brak wbudowanej integralności danych (checksum/hash)Niska

Format safetensors nie zawiera wbudowanego mechanizmu integralności danych (np. SHA-256 hash tensorów). Uszkodzenie pliku podczas transmisji lub przechowywania może nie zostać wykryte na etapie ładowania — format weryfikuje strukturę i offsety, ale nie sumy kontrolne danych.

Rozwiązanie:Używać zewnętrznych mechanizmów integralności (np. SHA-256 hash pliku dostarczanego razem z modelem) przy dystrybucji. Hugging Face Hub dostarcza hash pliku dla każdego pliku modelu.

Ewolucja

2022
Pierwsze publiczne wydanie safetensors v0.0.1 (22 września 2022, PyPI)
Punkt przełomowy

Nicolas Patry z Hugging Face opublikował pierwszą wersję biblioteki i specyfikacji formatu safetensors. Rdzeń w Rust, bindingi Python przez PyO3, obsługa PyTorch i NumPy. Format zaprojektowany jako bezpieczna i szybka alternatywa dla pickle.

2023
Audit bezpieczeństwa Trail of Bits (maj 2023) i adopcja przez Hugging Face Hub jako domyślny format
Punkt przełomowy

Niezależny audit bezpieczeństwa przeprowadzony przez Trail of Bits na zlecenie Hugging Face, EleutherAI i Stability AI. Nie znaleziono krytycznych podatności prowadzących do wykonania kodu. Hugging Face Hub zaczął wyświetlać ostrzeżenia dla modeli w formacie pickle i przyjął safetensors jako preferowany format.

2025
Integracja safetensors z rdzeniem PyTorch jako natywna opcja serializacji
Punkt przełomowy

PyTorch scalił natywne wsparcie dla safetensors w swoim głównym API serializacji (parametr weights_only i opcja formatu safetensors w API zapisu). Oznacza to instytucjonalną aprobatę formatu przez wiodący framework deep learning, przekształcając pickle do statusu formatu legacy.

Złożoność obliczeniowa

Złożoność czasowa: O(n). Złożoność przestrzenna: O(n).

Równoległość

Poziom równoległości
fully_parallel

Tensory w bufore danych są niezależne — mogą być ładowane równolegle przez wiele wątków lub procesów. Parsowanie nagłówka JSON jest sekwencyjne, ale zajmuje << czasu ładowania danych. Format obsługuje distributed loading: każdy węzeł może załadować inny podzbiór tensorów (tensor parallelism sharding, stosowany w TGI).

Zakres
servinginference

Wymagania sprzętowe

Podstawowe

Safetensors to format pliku, nie algorytm obliczeniowy. Operacja ładowania (parsowanie nagłówka JSON, memory-mapping) jest agnostyczna sprzętowo i efektywna zarówno na CPU jak i jako etap wstępny przed transferem danych na GPU/TPU. Format obsługuje framework-agnostyczne załadowanie tych samych tensorów do PyTorch, TensorFlow, JAX, MLX.