Save and Share:
Safetensors 是一種卓越的模型格式,專為安全儲存 tensors 而設計,與該領域的許多替代方案相比,它具有令人印象深刻的速度和效能。Safetensors 不僅速度極快,而且在設計時將簡潔性和安全性作為核心,使其在機器學習中使用的許多傳統格式中脫穎而出。
為什麼選擇 Safetensors?
由於機器學習和資料儲存有大量的格式可供選擇,您可能想知道是什麼讓 Safetensors 與眾不同。那麼,讓我們花點時間比較一下這些格式,以了解 Safetensors 如何實現關鍵參數:
- 安全:隨機下載的檔案是否會隨機執行任意程式碼?
- 零複製:讀取檔案是否需要比原始檔案更多的記憶體?
- 延遲載入:是否可以在不載入所有內容的情況下檢查檔案?並且是否可以僅載入其中的一些 tensors,而無需掃描整個檔案(在分散式環境中很重要)?
- 佈局控制:是否可以控制 tensors 在檔案中的位置,以確保快速存取個別 tensors?
- 無檔案大小限制:檔案大小是否有上限?
- 靈活性:是否可以將自訂程式碼儲存在格式中,並在以後使用,而無需額外的程式碼?
- Bfloat16:該格式是否支援原生 bfloat16,而無需奇怪的變通方法?
每個符號 ✔ 代表存在,❌ 代表不存在,~ 代表部分存在,? 代表未知。
格式 | 安全 | 零複製 | 延遲載入 | 無檔案大小限制 | 佈局控制 | 靈活性 | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
從這個比較中,您可以看到 Safetensors 符合或超過了其他模型格式提供的功能。它尤其以其「零複製」資料操作和延遲載入功能而聞名,這可以顯著提高機器學習任務中資料處理的效率。
一些值得注意的比較
雖然所有格式都有其獨特的優勢,但讓我們來看看 Safetensors 如何與一些更常用的格式相比:
- Pickle (PyTorch):一種廣泛使用的格式,但 pickle 有一個重大的缺點——它不安全,因為它允許執行任意程式碼。
- H5 (Tensorflow):雖然安全,但它不支援零複製,這是高效資料操作不可或缺的功能。
- SavedModel (Tensorflow):此格式特定於 Tensorflow,並且缺乏其他應用程式的靈活性。
- Numpy (npz):雖然很流行,但此格式不支援 bfloat16,這在機器學習領域越來越重要。
Safetensors 的底層原理
深入研究 Safetensors,我們發現它不僅僅是一種資料格式,而且是深思熟慮的設計選擇的組合,可增強安全性、效率和實用性:
- 零複製:如果檔案已在快取中,Safetensors 的設計允許在 CPU 上實現真正的零複製。在 GPU 上,雖然由於缺少磁碟快取,始終需要複製,但該設計繞過了在任何給定時間在 CPU 上配置所有 tensors 的需要。
- 位元組順序:Safetensors 使用小端位元組順序,這是資料儲存中的常見選擇。
- 順序:它採用「C」或 row-major 順序。此選擇與資料儲存中的普遍標準一致。
- 步幅:不支援步幅。所有 tensors 都需要在序列化之前進行封裝。此設計決策是根據序列化格式中的當前使用模式做出的。
更進一步
除了僅僅是一種高效且安全的資料儲存格式之外,Safetensors 還帶來了一些額外的優勢:
- 防止 DOS 攻擊:Safetensors 的設計減輕了惡意檔案導致 DOS 攻擊的可能性。標頭大小有限制,以防止解析極大的 JSON,並且保證檔案中的位址不重疊,這意味著載入檔案永遠不應超過檔案在記憶體中的大小。
- 更快的載入速度:Safetensors 繞過了 PyTorch 中的額外 CPU 複製,與 pickle 相比,實現了極快的 CPU 載入時間。GPU 載入時間與 PyTorch 等效項一樣快或更快。
- 延遲載入:在分散式環境(多節點或多 GPU)中,Safetensors 能夠僅載入部分 tensors,從而顯著加快模型載入時間並改善開發回饋迴圈。
實際應用
Safetensors 已經在領先的 AI 企業中得到廣泛採用,例如 Hugging Face、EleutherAI 和 StabilityAI。幾個使用 Safetensors 的著名專案包括:
- huggingface/transformers
- AUTOMATIC1111/stable-diffusion-webui
- Llama-cpp
- microsoft/TaskMatrix
- hpcaitech/ColossalAI
- huggingface/pytorch-image-models
- CivitAI
- huggingface/diffusers
- coreylowman/dfdx
- invoke-ai/InvokeAI
- oobabooga/text-generation-webui
- Sanster/lama-cleaner
- PaddlePaddle/PaddleNLP
- AIGC-Audio/AudioGPT
- brycedrennan/imaginAIry
- comfyanonymous/ComfyUI
- LianjiaTech/BELLE
總之,Safetensors 憑藉其獨特的功能和優勢,已準備好成為機器學習和資料儲存領域的遊戲規則改變者。所以,繼續前進,試一試吧——模型格式的未來在等著您!