HuggingFaceが主導するsafetensors形式のファイルは、従来のckpt形式のファイルと比べてどのような利点があるのか、なぜ安全になるのかをわかりやすく解説します。
また、ckptファイルの危険性についても詳しく解説しています。
1,そもそもckpt形式のモデルファイルはどのようにデータを保存していたのか
safetensors形式はckpt形式の様々な欠点の改善を目的として作られたデータ保存方法であり、HuggingFaceが主導しています。
そのため、safetensorsの利点を説明するにはまず従来のckptで何がアカンかったのか、ckptのデータ保存方法から読み解く必要があります。
.ckpt拡張子とpickleの関係
画像生成AI関連のモデルでよく目にする.ckptという拡張子は、「pickle」というPythonのモジュールを用いて直列化して保存されたデータに用いられる拡張子です。
データを直列化(バイト列に変換する)ことを「pickle化」・「ピクル化」と呼びます。
逆に、バイト列からデータを復元することを「非pickle化」「非ピクル化」といいます。
ぶっちゃけ
このへんは「はえ~」程度に読み流してOK
後述するピクル化の欠点を説明するための前置きです
pickleモジュールを使って、例えば以下のようなPythonオブジェクトをpickle化できます。
pickleモジュールのドキュメント(https://docs.python.org/ja/3/library/pickle.html#what-can-be-pickled-and-unpickled)より
- ブール値(True/False)、None値、数値(整数、浮動小数点数など)
- 文字列、bytesオブジェクト、bytearrayオブジェクト
- モジュールのトップレベルで定義されている関数、クラス
- クラスのインスタンス
- pickle化できるものだけを含んだリスト、タプル、集合、辞書
つまり関数だってピクル化できてしまう!!のです。
pickle で直列化したデータの欠点
ピクル化されて保存されているデータを使用するためには、非ピクル化を行う必要がありますが、
もしもckptファイルが悪意をもって作成されていた場合、使用時に非ピクル化すると同時に任意コードが実行されるおそれがあります。
公式ドキュメントにも以下のように警告が書かれています。
非pickle化の過程で任意のコードを実行するような、悪意あるpickle オブジェクトを生成することが可能です。
信頼できない提供元からのデータや、改竄された可能性のあるデータの非pickle化は絶対に行わないでください。
https://docs.python.org/ja/3/library/pickle.html
つまり、悪意あるckptファイルを使用すると、PCが攻撃されうるということです。
2,safetensors形式とckpt(pickle形式の比較)
Format | Safe | Zero-copy | Lazy loading | No file size limit | Layout control | Flexibility | Bfloat16 |
pickle (PyTorch) | X | X | X | O | X | O | O |
H5 (Tensorflow) | O | X | O | O | ~ | ~ | X |
SavedModel (Tensorflow) | O | X | X | O | O | X | O |
MsgPack (flax) | O | O | X | O | X | X | O |
Protobuf (ONNX) | O | X | X | X | X | X | O |
Cap’n’Proto | O | O | ~ | O | O | ~ | X |
Arrow | ? | ? | ? | ? | ? | ? | X |
Numpy (npy,npz) | O | ? | ? | X | O | X | X |
SafeTensors | O | O | O | O | O | X | O |
この表は様々なデータの保存形式を比較したものです。
色々な観点で比較している表ですが、注目すべきは「Safe」と、SafeTensorsが唯一バツマークの「Flexibility」です。
この表の「Safe」とは、「Can I use a file randomly downloaded and expect not to run arbitrary code?」という観点です。
つまり、「テキトーにダウンロードしたファイルを使用しても、任意コードが実行されないことが期待されるか?」です。
また、「Flexibility」は、「Can I save custom code in the format and be able to use it later with zero extra code ? (~ means we can store more than pure tensors, but no custom code)」です。
ざっくり訳すと「純粋なテンソル以上のものを保存できるが、カスタムコードは保存できない」という意味です。
これを踏まえて表を意訳すると、
safetensors形式なら、ネットで拾ったよく分からんファイルを使用しても脅威にはならない
ということです。
また、同じモデルファイルをckpt形式からsafetensors形式に変換すると、無劣化で同じモデルを安全に使えるようになるというのも利点ですね。
映像や音声のはフォーマットを変換すると大抵劣化するのと比べてありがたいです。
そして変換するだけで画像生成時間が相当短縮される!!!のも嬉しいですね。
逆にsafetensors形式の欠点は特にありません。
そもそもpickleの危険性をなんとかするための代替手段がsafetensorsですから、pickle化ファイル(ckpt拡張子のファイル)に対して、safetensors形式のファイルが劣る点は一切ありません。
3,まとめ safetensors形式とは? ckptファイルより優れた点は
上記より、safetensorsもckptもデータの保存形式のひとつということがわかりました。
そして、safetensors形式は、ckptファイル(ピクル化ファイル)と違い、任意コード実行のおそれがないという利点があるといえます。
保存形式 | SafeTensors | Pickle |
任意コードが実行される恐れがあるか? | ない | ある |
関数やカスタムコードを保存できるか? | できない | できる |
拡張子(モデルファイルの例) | .safetensors | .ckpt |
つまりセキュリティ的には? | 安全 | 危険 |
画像生成速度は?(相対的に) | 早い | 遅い |
そのため、出自不明のAnything v3シリーズなどは特にckptでなくsafetensors形式の方を選んだというわけです。