機械学習モデル(特に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適用などの理解が一気に進みます。