機械学習モデル(特にTransformer系)を触っていると、.safetensors ファイルをNetronで開いたときに、
「ノードが並んでいるだけで、配線(接続)が見えない」
という疑問にぶつかることがあります。
この記事ではこの現象の理由と、実際にブロックの接続(配線)がどこに記録されているのかを整理して解説します。
なぜNetronで配線が見えないのか?
結論から言うと:
safetensorsには「配線情報」が入っていないためです。
safetensorsの正体
safetensors は非常にシンプルな構造をしています。
パラメータ名 → 数値テンソル
例えば:
transformer_blocks.3.attn.add_k_proj.weight
のように、「名前」と「行列データ」が紐づいているだけです。
safetensorsに含まれていないもの
以下のような情報は 一切保存されていません:
- forward関数(計算手順)
- ノード間の接続関係
- データの流れ(計算グラフ)
- レイヤー間の依存関係
つまり:
そもそも配線図そのものが存在しない
のです。
Netronで何が表示されているのか?
Netronには2つのモードがあります。
| ファイル形式 | 表示内容 |
|---|---|
| ONNX / TorchScript | 実際の計算グラフ(配線あり) |
| safetensors | パラメータ一覧(配線なし) |
safetensors を開いた場合は:
- モジュール階層(名前構造)
- 重みの一覧
- テンソルの形状
だけが表示されます。
そのため、
transformer_blocks
├── 0
├── 1
├── 2
└── 3
└── attn
└── add_k_proj
のように「ノードが並ぶだけ」に見えるのは正常な挙動です。
では配線はどこにあるのか?
ここが最も重要なポイントです。
ブロックの接続(配線)は Pythonのモデルコードに書かれています。
モデルは3つの要素で構成される
実際のモデルは次の3つで成立しています。
① モデルコード(forward関数)
② config(構造パラメータ)
③ safetensors(重み)
| 要素 | 役割 |
|---|---|
| モデルコード | レイヤーの接続・処理順序 |
| config | 層数や次元数などの設定 |
| safetensors | 学習済みの数値 |
配線の正体:forward関数
Transformerの接続は、Pythonコードの中で定義されています。
例:
def forward(self, x):
for block in self.transformer_blocks:
x = block(x)
return x
これがそのまま:
Block0 → Block1 → Block2 → Block3
という接続になります。
ブロック内部の接続
さらにブロックの中も同様です。
def forward(self, x):
x = x + self.attn(self.norm1(x))
x = x + self.mlp(self.norm2(x))
return x
ここには:
- 正規化(LayerNorm)
- Attention
- 残差接続(Residual)
- MLP
といった処理の「流れ」が明示的に書かれています。
なぜこういう設計なのか?
PyTorchは「define-by-run」という仕組みを採用しています。
これは:
実行時に計算グラフを生成する方式
です。
そのため:
- モデル構造はファイルに保存されない
- forward実行時に初めて配線が確定する
という特徴があります。
全体の流れ
推論時には次のように処理されます:
① モデルコード読み込み
② モデル構造を生成
③ safetensorsを読み込んで重みをセット
④ forward() を実行
⑤ 計算グラフがその場で構築される
配線を可視化したい場合は?
safetensors 単体では配線は見えません。
代わりに以下の方法を使います:
1. ONNXに変換する
torch.onnx.export(...)
→ Netronで開くと完全な配線が表示される
2. モデルコードを読む
最も本質的な方法です。
3. 実行時に解析する(hookなど)
forwardの流れを追跡できます。
まとめ
- safetensorsは「重みの保存形式」であり、構造は含まない
- Netronで配線が見えないのは仕様
- モデルの接続はすべて forward関数(Pythonコード)に記述されている
一言でまとめると
safetensorsは部品、配線はコードにある。
この仕組みを理解すると、モデル解析・改造・LoRA適用などの理解が一気に進みます。



