AIモデルのsafetensors形式とは何者か?ckptと比較しつつ解説する

safetensors形式とは何か?ckptと比較しつつ解説する ソフトウェア

HuggingFaceが主導するsafetensors形式のファイルは、従来のckpt形式のファイルと比べてどのような利点があるのか、なぜ安全になるのかをわかりやすく解説します。

また、ckptファイルの危険性についても詳しく解説しています。

チェック!!
さくいん! 本サイトのAI関連記事まとめ どれから見れば良いのか?!


数十記事ある本サイトのAI関連記事を体系的にまとめました。

目的別にどれから見れば良いのかわかります!!

AI記事索引ページはコチラ

1,そもそもckpt形式のモデルファイルはどのようにデータを保存していたのか

safetensors形式はckpt形式の様々な欠点の改善を目的として作られたデータ保存方法であり、HuggingFaceが主導しています。

そのため、safetensors利点を説明するにはまず従来のckptで何がアカンかったのか、ckptのデータ保存方法から読み解く必要があります。

.ckpt拡張子とpickleの関係

画像生成AI関連のモデルでよく目にする.ckptという拡張子は、「pickle」というPythonのモジュールを用いて直列化して保存されたデータに用いられる拡張子です。

データを直列化(バイト列に変換する)ことを「pickle化」・「ピクル化」と呼びます。
逆に、バイト列からデータを復元することを「非pickle化」「非ピクル化」といいます。

ぶっちゃけ
このへんは「はえ~」程度に読み流してOK

後述するピクル化の欠点を説明するための前置きです

pickleモジュールを使って、例えば以下のようなPythonオブジェクトをpickle化できます。

  • ブール値(True/False)、None値、数値(整数、浮動小数点数など)
  • 文字列、bytesオブジェクト、bytearrayオブジェクト
  • モジュールのトップレベルで定義されている関数、クラス
  • クラスのインスタンス
  • pickle化できるものだけを含んだリスト、タプル、集合、辞書
pickleモジュールのドキュメント(https://docs.python.org/ja/3/library/pickle.html#what-can-be-pickled-and-unpickled)より

つまり関数だってピクル化できてしまう!!のです。

pickle で直列化したデータの欠点

ピクル化されて保存されているデータを使用するためには、非ピクル化を行う必要がありますが、
もしもckptファイルが悪意をもって作成されていた場合、使用時に非ピクル化すると同時に任意コードが実行されるおそれがあります。

公式ドキュメントにも以下のように警告が書かれています。

非pickle化の過程で任意のコードを実行するような、悪意あるpickle オブジェクトを生成することが可能です。

信頼できない提供元からのデータや、改竄された可能性のあるデータの非pickle化は絶対に行わないでください。

https://docs.python.org/ja/3/library/pickle.html

つまり、悪意あるckptファイルを使用すると、PCが攻撃されうるということです。

2,safetensors形式とckpt(pickle形式の比較)

FormatSafeZero-copyLazy loadingNo file size limitLayout controlFlexibilityBfloat16
pickle (PyTorch)XXXOXOO
H5 (Tensorflow)OXOO~~X
SavedModel (Tensorflow)OXXOOXO
MsgPack (flax)OOXOXXO
Protobuf (ONNX)OXXXXXO
Cap’n’ProtoOO~OO~X
Arrow??????X
Numpy (npy,npz)O??XOXX
SafeTensorsOOOOOXO
https://github.com/huggingface/safetensors

この表は様々なデータの保存形式を比較したものです。

色々な観点で比較している表ですが、注目すべきは「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ファイル(ピクル化ファイル)と違い任意コード実行のおそれがないという利点があるといえます。

保存形式SafeTensorsPickle
任意コードが実行される恐れがあるか?ないある
関数やカスタムコードを保存できるか?できないできる
拡張子(モデルファイルの例).safetensors.ckpt
つまりセキュリティ的には?安全危険
画像生成速度は?(相対的に)早い遅い

そのため、出自不明のAnything v3シリーズなどは特にckptでなくsafetensors形式の方を選んだというわけです。

チェック!!
さくいん! 本サイトのAI関連記事まとめ どれから見れば良いのか?!


数十記事ある本サイトのAI関連記事を体系的にまとめました。

目的別にどれから見れば良いのかわかります!!

AI記事索引ページはコチラ

タイトルとURLをコピーしました