Auf AI-Modellen-Hubs wie Hugging Face begegnet man zunehmend Dateien mit der Endung .safetensors, anstelle der früher häufig gesehenen Dateien wie .bin oder .pth.

In diesem Beitrag werden wir aus technischer Perspektive detailliert untersuchen, was .safetensors ist, warum es entstanden ist und welche starken Vorteile es im Vergleich zu den bisherigen Methoden bietet.


1. Was ist .safetensors?



.safetensors ist ein neues Tensor-Speicherformat, das von Hugging Face entwickelt wurde.

Deep-Learning-Modelle bestehen aus Milliarden von Parametern (Gewichten), und dieses Format dient dazu, diese riesige Ansammlung von Zahlen in Dateien zu speichern und zu laden. Es wurde entwickelt, um die schwerwiegenden Nachteile der bisherigen Standardspeichermethoden, die auf dem Python pickle-Modul basieren (Sicherheit und Geschwindigkeit), zu beheben.

Einfach ausgedrückt ist es "eine sicherere und schnellere Methode zum Speichern von Modellen".


2. Warum wurde es eingeführt: Probleme mit der bestehenden Methode (Pickle)

Die bestehenden PyTorch-Modelle (.bin, .pth) verwenden intern das Python pickle-Modul zur Serialisierung von Daten. Allerdings hat pickle ein schwerwiegendes Problem.

Sicherheitsanfälligkeit (Arbitrary Code Execution)

pickle speichert nicht nur Daten, sondern auch Python-Objekte selbst. In diesem Prozess können Python-Codes enthalten sein, mit denen ein bösartiger Hacker Schadcode in die Modell-Datei einfügen kann, um Systeme zu beschädigen oder persönliche Informationen zu stehlen. Sobald der Benutzer das Modell load(), wird dieser schadhafter Code ausgeführt.

Beispiel eines Problems:

Der Benutzer lädt eine model.bin-Datei herunter -> verborgener Code wird ausgeführt -> der SSH-Schlüssel oder das Passwort des Benutzers wird an den Server des Hackers gesendet.

.safetensors wurde entwickelt, um solche Sicherheitsbedrohungen von Grund auf zu verhindern.


3. Hauptmerkmale von .safetensors



3.1. Sicherheit (Safety)

.safetensors ist, wie der Name schon sagt, sicher. Dieses Format speichert nur reine Tensor-Daten und Metadaten (im JSON-Format). Es gibt keinen Platz für ausführbaren Code, sodass selbst Dateien von unzuverlässigen Quellen bedenkenlos geladen werden können.

3.2. Zero-Copy und Geschwindigkeit

Beim Laden großer LLMs (Große Sprachmodelle) oder Stable-Diffusion-Modelle ist die Geschwindigkeit revolutionär schnell.

  • Bestehende Methode: Datei wird in den CPU-Speicher kopiert -> Deserialisierung -> Rückumwandlung in Tensorform -> Verschiebung zur GPU. (Unnötige Kopiervorgänge)

  • safetensors: Es nutzt die Memory Mapping (mmap)-Technologie. Das Betriebssystem mappt die Datei direkt an die Speicheradresse, sodass Daten ohne unnötige Kopiervorgänge sofort vom Speicher verwendet werden können. Dies wird als Zero-Copy bezeichnet.

3.3. Lazy Loading

Es ist möglich, nicht das gesamte Modell in den Speicher zu laden, sondern nur die benötigten Teile schnell zu lesen.

Wenn man beispielsweise nur die Gewichte einer bestimmten Schicht aus einer 100-GB-Modell-Datei überprüfen möchte, musste man bei der bisherigen Methode die ganze 100 GB lesen, während man bei .safetensors nur genau diesen Teil abrufen kann. Dies ist in verteilten Lernumgebungen oder zur Optimierung von Inferenzprozessen äußerst vorteilhaft.

3.4. Framework-Kompatibilität

Es ist nicht an ein bestimmtes Deep-Learning-Framework (z.B. PyTorch) gebunden.

  • PyTorch

  • TensorFlow

  • JAX

  • PaddlePaddle

Es wurde so entwickelt, dass es in verschiedenen Frameworks leicht gelesen und geschrieben werden kann.


4. Dateistruktur

Die .safetensors-Datei hat eine sehr einfache Struktur.

  1. Header: Befindet sich an der Vorderseite der Datei und folgt dem JSON-Format. Er enthält Informationen zu den Namen, Datentypen (dtype), Formen (shape) und dem Speicherort (offset) jeder Tensor.

  2. Daten: Ein Block von Binärdaten, der auf die Kopfzeile folgt. Die reinen Tensor-Werte sind dicht belegt.

Dank dieser Struktur ist es möglich, nur die Header zu lesen, um die Struktur des Modells zu verstehen, ohne die gesamte Datei lesen zu müssen.

4-1. Praktische Tipps: Header- und Metadaten im Terminal überprüfen

Es wäre ineffizient, ein Modell von mehreren Gigabyte zu laden, um zu überprüfen, ob die heruntergeladene .safetensors-Datei quantisiert ist oder welche Schichten enthalten sind.

Die safetensors-Bibliothek bietet eine Funktion, um nur die Header-Informationen schnell zu scannen, ohne die gesamte Datei zu lesen. Geben Sie den folgenden Python-Einzeiler im Terminal ein, um dies sofort zu überprüfen.

Natürlich können Sie auch die Seite besuchen, von der Sie das Modell von Hugging Face heruntergeladen haben, und auf die Schaltfläche „Dateiinformationen“ in der oberen rechten Ecke klicken, um dies zu überprüfen. Hier erkläre ich jedoch, wie man es direkt in meinem Terminal überprüfen kann.

Vorbereitung

Zuerst muss die Bibliothek installiert sein.

pip install safetensors

Befehle (Terminal-Eingabe)

Geben Sie anstelle von model.safetensors den tatsächlichen Dateipfad ein.

python -c "from safetensors import safe_open; \
with safe_open('model.safetensors', framework='pt', device='cpu') as f: \
    print('--- Metadata ---'); \
    print(f.metadata()); \
    print('\n--- Tensor Keys (Layers) ---'); \
    print(list(f.keys())[:5])" # Zu lang, also nur die obersten 5 ausgeben

Interpretation der Ausgabedaten

Wenn Sie diesen Befehl ausführen, erhalten Sie zwei wichtige Informationen.

  1. Metadata: Informationen, die vom Ersteller des Modells hinterlegt wurden. Wenn hier Informationen wie format: gptq oder quantization: int4 stehen, kann man sicher sein, dass es sich um ein quantisiertes Modell handelt, auch wenn es im Dateinamen nicht angegeben ist. (Wenn der Ersteller jedoch die Metadaten leer gelassen hat, kann None angezeigt werden.)

  2. Keys: Die Namen der Schichten, die das Modell bilden. Damit kann die Struktur des Modells verstanden werden.


5. Zusammenfassender Vergleich: .bin (Pickle) vs .safetensors

Merkmal .bin / .pth (auf Pickle basierend) .safetensors
Sicherheit Risiko (Bösartiger Code kann ausgeführt werden) Sicher (nur Daten werden gespeichert)
Ladegeschwindigkeit Langsam (CPU-Last) Sehr schnell (Zero-Copy)
Speichereffizienz Vollständiges Laden erforderlich Nur das Notwendige laden (Lazy Loading)
Kompatibilität Python/PyTorch abhängig Framework-unabhängig

6. Anwendungsbeispiel (Python)

Ein einfaches Beispiel zum Speichern und Laden von Tensoren mit der safetensors-Bibliothek.

import torch
from safetensors.torch import save_file, load_file

# 1. Tensor erstellen und speichern
tensors = {
    "embedding": torch.zeros((1024, 512)),
    "attention": torch.rand((512, 512))
}

# Tensor als Dictionary in einer Datei speichern
save_file(tensors, "model.safetensors")

# 2. Datei laden
loaded = load_file("model.safetensors")
print(loaded["embedding"].shape) 
# Ausgabe: torch.Size([1024, 512])

7. Fazit

.safetensors ist nicht nur eine einfache Änderung der Dateiendung, sondern eine notwendige Evolution für die Sicherheit und Effizienz von AI-Modellen. Sowohl Hugging Face als auch die wichtigsten Communities haben es bereits als Standardformat etabliert.

Ich empfehle, in Zukunft nach Möglichkeit .safetensors anstelle von .bin zu verwenden, wenn Sie Modelle herunterladen oder bereitstellen. Es wird Ihnen helfen, Sicherheitsbedrohungen zu vermeiden und die Ladezeiten der Modelle drastisch zu verkürzen.

Bild, das die Vorteile des safetensor-Formats symbolisiert