Hugging FaceのようなAIモデルハブを利用していると、過去によく見られた .bin.pth ファイルの代わりに .safetensors という拡張子のファイルが徐々に増えてきました。

この投稿では .safetensors が一体何なのか、なぜ登場したのか、そして従来の方式と比べてどのような強力な利点があるのかを技術的な観点から詳細に見ていきます。


1. .safetensorsとは何か?

.safetensorsHugging Face が開発した新しい テンソル(Tensor)保存フォーマット です。

ディープラーニングモデルは数十億のパラメータ(重み、Weights)で構成されており、これらの巨大な数字の塊をファイルとして保存・読み込みの役割を果たします。従来、事実上の標準として使われていたPythonの pickle モジュールをベースとした保存方式が抱えていた致命的な欠点(セキュリティと速度)を解決するために開発されました。

簡単に言えば、 「より安全で、より速いモデル保存ファイル」 です。


2. なぜ登場したのか:従来の方式(Pickle)の問題点

従来のPyTorchモデル(.bin, .pth)は内部的にPythonの pickle モジュールを使用してデータをシリアライズ(Serialization)します。しかし、 pickle には致命的な問題があります。

セキュリティの脆弱性(Arbitrary Code Execution)

pickle は単にデータを保存するのではなく、 Pythonオブジェクトそのものを保存 します。この過程でPythonコードが埋め込まれる可能性があるため、悪意のあるハッカーがモデルファイルの内部にシステムを破壊したり、個人情報を盗んだりするコードを埋め込むことができます。ユーザーが意識せずにモデルを load() した瞬間に、その悪性コードが実行されてしまいます。

問題事例(例):

ユーザーがインターネットからダウンロードした model.bin をロードすると、ファイル内部に隠されたコードが実行され、ユーザーのSSHキーやパスワードがハッカーのサーバーに送信されてしまいます。

.safetensors はこのようなセキュリティの脅威を根本から阻止するために登場しました。


3. .safetensorsの核心的特徴

3.1. 安全性(Safety)

.safetensors はその名の通り 安全 です。このフォーマットは純粋なテンソルデータとメタデータ(JSON形式)のみを保存します。実行可能なコードが含まれる余地が一切ないため、信頼できないソースからダウンロードしたファイルでも安心してロードできます。

3.2. ゼロコピー(Zero-Copy)および速度

大容量LLM(大規模言語モデル)やStable Diffusionモデルを読み込む際の速度が劇的に向上します。

  • 従来方式: ファイルをCPUメモリにコピーし、逆シリアライズ(Unpickling)を行い、再びテンソル形式に変換してからGPUに移動します。(不必要なコピー処理が発生します)
  • safetensors: メモリマッピング(Memory Mapping, mmap) 技術を活用します。オペレーティングシステムがファイル自体をメモリアドレスに直接マッピングするため、不必要なコピー処理なしに、ディスクからデータを即座に利用できます。これを ゼロコピー(Zero-Copy) と呼びます。

3.3. レイジーローディング(Lazy Loading)

全モデルをメモリに完全に読み込まず、必要な部分だけを選択的に素早く読み込むことができます。

例えば、100GBのモデルファイルから特定のレイヤーの重みだけを確認したい場合、従来方式では100GB全体を読み込む必要がありましたが、.safetensorsを使用すればその部分だけを抜き出して読み込むことができます。分散学習環境や推論の最適化において非常に有利です。

3.4. フレームワーク互換性

特定のディープラーニングフレームワーク(PyTorchなど)に依存しません。

  • PyTorch
  • TensorFlow
  • JAX
  • PaddlePaddle

これらの多様なフレームワークで簡単に読み書きできるように設計されています。


4. ファイル構造

.safetensors ファイルは非常にシンプルな構造を持っています。

  1. ヘッダー(Header): ファイルの先頭に位置し、JSON形式です。各テンソルの名前、データタイプ(dtype)、形状(shape)、およびデータが保存されている位置(オフセット)情報を含みます。
  2. データ(Data): ヘッダーの後に続くバイナリデータの塊です。純粋なテンソル値がぎっしり詰まっています。

このような構造のおかげでファイルをすべて読み込むことなく、ヘッダー情報だけを読むことでモデルの構造を把握することも可能です。

4-1. 実践的なヒント:ターミナルでヘッダーおよびメタデータを確認する

ダウンロードした .safetensors ファイルが量子化モデルであるか、あるいはどのようなレイヤーが含まれているかを確認するために数GBを超えるモデルをすべてロードするのは非効率的です。

safetensors ライブラリはファイル全体を読み込むことなく、ヘッダー情報だけを素早くスキャンできる機能を提供します。ターミナルで次のような Pythonのワンライナー(一行コマンド) を入力すると、即座に確認できます。

もちろん、Hugging Faceのモデルをダウンロードしたページに行き、右上の「File Info」をクリックすれば確認することもできます。しかし、ここでは自身のターミナルで直接確認する方法を説明します。

事前準備

最初にライブラリがインストールされている必要があります。

pip install safetensors

コマンド(ターミナル入力)

model.safetensors の部分に実際のファイルパスを入力してください。

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])" # あまりにも長いので上位5個のみ出力

出力結果の解釈

このコマンドを実行すると二つの重要な情報が得られます。

  1. Metadata: モデル制作者が埋め込んだ情報です。ここに format: gptqquantization: int4 などの情報が書かれている場合、ファイル名に記載されていなくても量子化モデルであることが判明します。(ただし、制作者がメタデータを空にしている場合は None と表示されることがあります。)
  2. Keys: モデルを構成するレイヤーの名前です。これによりモデルの構造を把握することができます。

5. 比較要約: .bin (Pickle) vs .safetensors

特徴 .bin / .pth (Pickleベース) .safetensors
セキュリティ 危険 (悪性コードの実行可能) 安全 (データのみ保存)
ロード速度 遅い (CPU負荷発生) 非常に速い (ゼロコピー)
メモリ効率 全体ロード必要 必要な分だけロード(レイジーローディング)
互換性 Python/PyTorch依存的 フレームワーク非依存的

6. 使用例(Python)

safetensors ライブラリを使用してテンソルを保存し読み込む簡単な例です。

import torch
from safetensors.torch import save_file, load_file
# 1. テンソル生成および保存
tensors = {
    "embedding": torch.zeros((1024, 512)),
    "attention": torch.rand((512, 512))
}
# 辞書形式のテンソルをファイルに保存
save_file(tensors, "model.safetensors")
# 2. ファイル読み込み
loaded = load_file("model.safetensors")
print(loaded["embedding"].shape) 
# 出力:torch.Size([1024, 512])

7. 結論

.safetensors は単にファイル拡張子の変化ではなく、AIモデルの セキュリティ効率性 のための不可欠な進化です。Hugging Faceをはじめとする主要なコミュニティではすでに主要なフォーマットとして定着しています。

今後モデルをダウンロードまたは配布する際には、可能な限り .bin の代わりに .safetensors を使用することをお勧めします。セキュリティの脅威から保護され、モデルの読み込み時間も劇的に短縮されるでしょう。

safetensorフォーマットの利点を象徴する画像