Safetensors is een bestandsformaat voor de geleerde getallen van een AI-model, de gewichten. Download je een open AI-model om op je eigen computer te draaien, dan komen die gewichten binnen als een of meer bestanden. Het oudere, gangbare formaat kon een programma verbergen dat start zodra je het bestand opent. Een Safetensors-bestand bevat alleen getallen en een beschrijving ervan, dus openen voert geen code uit.
Waarom bestaat het?
PyTorch slaat modellen standaard op met pickle van Python, en pickle kan tijdens het laden code uitvoeren. De documentatie van Python waarschuwt dat de pickle-module niet veilig is en dat je alleen gegevens moet inlezen die je vertrouwt. Hugging Face bouwde Safetensors zodat je een modelbestand van een onbekende veilig kunt openen. De README omschrijft veilig zo: je kunt een bestand dat je ergens hebt gedownload gebruiken zonder dat er onbekende code draait.
In mei 2023 lieten Hugging Face, EleutherAI en Stability AI de bibliotheek doorlichten door Trail of Bits. Die vond geen kritieke fout die tot het uitvoeren van willekeurige code leidt. Enkele onnauwkeurigheden in de specificatie en een gat dat polyglotbestanden toeliet (bestanden die tegelijk in twee formaten geldig zijn) werden gedicht.
PyTorch heeft het risico ook verkleind: sinds versie 2.6 van januari 2025 gebruikt torch.load standaard weights_only=True. De documentatie zegt dat dit het aanvalsoppervlak verkleint zonder het te sluiten, en in versies vóór 2.6 kon er met die instelling toch code draaien (CVE-2025-32434).
Hoe werkt het?
De README beschrijft drie delen:
- 8 bytes met de grootte van de header.
- Een JSON-header die elke tensor noemt met zijn datatype, vorm (shape) en byte-offsets, plus een optionele
__metadata__-lijst met tekstwaarden. De header mag hoogstens 100 MB zijn. - De ruwe tensordata, zonder gaten.
Omdat de header zegt waar elke tensor staat, kan een programma één tensor lezen zonder de rest te laden (lazy loading) en het bestand direct in het geheugen mappen in plaats van het te kopiëren. De README geeft een voorbeeld: het BLOOM-model laden op 8 GPU's duurde 10 minuten met gewone PyTorch-gewichten en 45 seconden met Safetensors. De bibliotheek is geschreven in Rust en werkt met PyTorch, TensorFlow, JAX, PaddlePaddle en NumPy.
Wie beheert het?
Op 8 april 2026 bracht Hugging Face Safetensors onder bij de PyTorch Foundation. Het handelsmerk, de repository en het bestuur liggen nu bij de Linux Foundation, en de twee kernbeheerders van Hugging Face blijven in het technische stuurcomité. Voor gebruikers veranderde er niets: hetzelfde formaat, dezelfde API's. Hugging Face noemt het het standaardformaat voor het verspreiden van modellen op zijn Hub, gebruikt door tienduizenden modellen, en PEFT slaat LoRA-adapters er standaard in op. De roadmap in de aankondiging noemt laden rechtstreeks op GPU's en formele ondersteuning voor FP8 en gekwantiseerde formaten zoals GPTQ en AWQ. Hugging Face werkt daarnaast met het PyTorch-team aan de mogelijkheid om Safetensors binnen de kern van PyTorch te gebruiken.
Waar gaat het mis?
- Een veilig bestand is nog geen veilig model. Safetensors voorkomt dat er bij het laden van gewichten code draait, en zegt niets over wat het model doet. Code die met een model meekomt, is een apart risico: de optie
trust_remote_codein Transformers voert code van de Hub uit op je eigen machine, en de documentatie zegt die alleen aan te zetten voor repository's die je vertrouwt en waarvan je de code hebt gelezen. - Alleen tensoren. Het formaat kan geen eigen code of andere Python-objecten opslaan, dus de opbouw en instellingen van een model staan in andere bestanden. De README meldt ook dat tensorwaarden niet worden gecontroleerd: een bestand kan NaN- of oneindige waarden bevatten.
- Oude bestanden. De Hugging Face Hub accepteert nog steeds bestanden op basis van pickle, zoals
pytorch_model.bin, en scant elke upload op verdachte imports. Zulke bestanden laden blijft de riskante stap.
Voorbeeld
Eén tensor uit een bestand lezen zonder de rest te laden, zoals in de README:
1 from safetensors import safe_open 2 3 with safe_open("model.safetensors", framework="pt", device="cpu") as f: 4 print(list(f.keys())) # namen van de tensoren, uit de header 5 weight = f.get_tensor("weight1") # laadt alleen deze tensor
Dezelfde gewichten laden uit een model.pt op basis van pickle gaat via torch.load, en de documentatie van PyTorch waarschuwt je nooit gegevens uit een onbetrouwbare bron te laden.
Bronnen
- Safetensors: README and format specification (GitHub)GitHub
- Hugging Face: Safetensors is joining the PyTorch FoundationRSS
- Hugging Face: Safetensors audited as really safe and becoming the defaultRSS
- PyTorch: Serialization semantics (torch.load with weights_only=True)Web
- Python: pickle, Python object serializationWeb
- PyTorch: torch.load with weights_only=True RCE (CVE-2025-32434)GitHub
