所要時間: 約25分 | 難易度: ★★☆☆☆

この記事で作るもの

  • 指定したHugging FaceのモデルIDから、そのアーキテクチャ(レイヤー構造やパラメータ詳細)を自動で可視化URLに変換し、ブラウザで即座に確認できるPythonスクリプト
  • モデルのconfig.jsonを解析し、VRAM消費量の目安やテンソルサイズを把握するワークフローの構築
  • 前提知識:Pythonの基本的な構文がわかること、Hugging Faceのアカウント(トークン)を持っていること
  • 必要なもの:Python環境、Hugging Face Hubライブラリ

📦 この記事に関連する商品

GeForce RTX 4090

ローカルLLMのフルパラメータ推論や高速な微調整には24GB VRAMが必須です

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

なぜこの方法を選ぶのか

Hugging Faceで新しいモデルを見つけたとき、多くの人はREADMEの「なんとなくの説明」だけで判断しがちです。 しかし、実務で微調整(Fine-tuning)や量子化を行う場合、アテンションヘッド数や隠れ層の次元数、活性化関数の種類といった「正確な構造」の把握が欠かせません。 これまでは数千行あるconfig.jsonを気合で読み解くか、わざわざPyTorchでモデルをロードして print(model) するしかありませんでした。

RTX 4090を2枚挿してローカルLLMを動かしている私からすれば、巨大なモデルを構造確認のためだけにVRAMに載せるのは時間の無駄です。 今回紹介する「hfviewer.com」を利用したアプローチなら、モデルをダウンロードすることなく、Web上で一瞬にしてニューラルネットワークの接続図を確認できます。 Netronなどの既存ツールよりもLLMの構成(Transformerブロックなど)に特化しており、何より「URLを叩くだけ」という手軽さが、開発スピードを圧倒的に引き上げます。

Step 1: 環境を整える

まずはHugging Faceの情報を操作するためのライブラリをインストールします。 今回はモデルのメタデータを取得するために huggingface_hub を使用します。

pip install huggingface_hub

huggingface_hub は、Hugging Face CLIの機能 Pythonから利用するための公式ライブラリです。 これを使うことで、ローカルに数GBの重みを落とすことなく、数KBの config.json だけをピンポイントで参照できます。 バージョンは0.20.0以上を推奨します。

⚠️ 落とし穴: プライベートリポジトリや、Gate付きモデル(Llama 3など承認が必要なもの)を可視化したい場合は、huggingface-cli login であらかじめ認証を済ませておく必要があります。認証がないと、スクリプト実行時に「401 Client Error: Unauthorized」で止まります。

Step 2: 可視化URL生成スクリプトの作成

次に、モデルIDを入力すると hfviewer.com で閲覧可能なURLを出力し、ついでに基本的なパラメータを表示するスクリプトを書きます。

import os
from huggingface_hub import HfApi, model_info

def generate_model_viz_report(model_id):
    # Hugging Face APIのクライアント初期化
    api = HfApi()

    try:
        # モデルの基本情報を取得(重みはダウンロードしない)
        info = model_info(model_id)

        # hfviewer.com のURL形式に整形
        # 構造: https://hfviewer.com/model/[モデルID]
        viz_url = f"https://hfviewer.com/model/{model_id}"

        print("-" * 30)
        print(f"モデル名: {model_id}")
        print(f"可視化URL: {viz_url}")
        print(f"公開設定: {'Public' if not info.private else 'Private'}")
        if hasattr(info, 'safetensors'):
            print(f"総パラメータ数推計: {info.safetensors.total / 1e9:.2f} B")
        print("-" * 30)

        return viz_url

    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return None

# 試したいモデルを指定
target_model = "meta-llama/Llama-3.1-8B-Instruct"
report_url = generate_model_viz_report(target_model)

if report_url:
    print(f"\n上記URLをブラウザで開いて、アーキテクチャを確認してください。")

このコードで model_info を使っているのは、そのモデルが実際に存在するか、また safetensors 形式でパラメータ数が取得可能かを確認するためです。 hfviewer.com は非常に優秀で、Hugging Faceのパス構造をそのままURLの末尾に付けるだけでレンダリングを開始してくれます。

Step 3: 動かしてみる

スクリプトを実行すると、以下のような出力が得られます。

期待される出力

------------------------------
モデル名: meta-llama/Llama-3.1-8B-Instruct
可視化URL: https://hfviewer.com/model/meta-llama/Llama-3.1-8B-Instruct
公開設定: Public
総パラメータ数推計: 8.03 B
------------------------------

上記URLをブラウザで開いて、アーキテクチャを確認してください。

出力されたURLをブラウザで開くと、Llama 3.1の内部構造がノード図として表示されます。 左側のサイドバーには config.json の中身が整理されて表示され、中央のメイン画面では RMSNormAttentionMLP などの各ブロックがどう接続されているかが一目でわかります。

各ノードをクリックしてみてください。 例えば Attention ブロックをクリックすると、num_heads(ヘッド数)が32であることや、head_dim(各ヘッドの次元)が128であることなどがプロパティとして表示されます。 これをソースコードのドキュメントから探すのは苦労しますが、視覚化されていればミスは起きません。

Step 4: 実用レベルにする

実務では、一つのモデルだけでなく、複数の候補モデルを比較検討することが多いはずです。 また、特定のレイヤーがどこにあるかを探す手間を省くため、指定したキーワードが含まれるレイヤーを抽出する機能を追加します。

import webbrowser

def explore_models(model_list):
    for model_id in model_list:
        url = f"https://hfviewer.com/model/{model_id}"
        print(f"Processing: {model_id}")
        # 実際にブラウザでタブを開く(実務で一気に比較する際に便利)
        webbrowser.open(url)

# 比較したいモデルのリスト
candidates = [
    "microsoft/Phi-3-mini-4k-instruct",
    "google/gemma-2-2b-it",
    "Qwen/Qwen2.5-7B-Instruct"
]

explore_models(candidates)

このスクリプトを使えば、新着モデルのベンチマーク記事を書く際や、自分のプロジェクトに最適な軽量モデルを探す際に、一気にアーキテクチャを比較できます。

私は以前、特定のモデルでLoRA(Low-Rank Adaptation)を適用する際、ターゲットとなるレイヤー名(q_proj, v_proj など)が標準と異なっていて学習が回らなかった経験があります。 hfviewerで事前にレイヤー名を確認するクセをつけてからは、こうした「実装上の初歩的なハマり」で数時間を溶かすことがなくなりました。 特にQwenやGemmaなど、アーキテクチャに独自の工夫があるモデルほど、この可視化は威力を発揮します。

よくあるトラブルと解決法

エラー内容原因解決策
モデルが表示されない(真っ白)config.json がリポジトリに存在しないか、形式が特殊Hugging Faceのページで config.json の有無を確認する。独自アーキテクチャすぎる場合は対応外。
Privateモデルが見られないブラウザ側でHugging Faceにログインしていないhfviewerはブラウザのセッションを利用する場合があるため、同じブラウザでHFにログインしておく。
パラメータ数が0と表示されるsafetensors ではない古い形式のモデルpytorch_model.bin しかない場合はメタデータから自動取得できないことがある。

次のステップ

このツールでモデルの「骨格」が見えるようになったら、次は「肉付け」の部分、つまり重みの分布(Weights Distribution)の確認に挑戦してみてください。 hfviewerは構造の可視化には優れていますが、個別の重みの値(例えば、あるレイヤーの重みがどれくらい外れ値を持っているか)までは見えません。

今回の手法でアーキテクチャを特定し、ターゲットとするレイヤーを決めたら、次は bitsandbytesAutoGPTQ を使って、特定のレイヤーだけを異なるビット数で量子化する「混合精度量子化」のシミュレーションをしてみるのが面白いでしょう。 RTX 4090のようなハイエンドGPUを使っていると、つい「全部16bitでいいか」となりがちですが、構造を理解して最適化を行うことで、推論速度はさらに1.5倍から2倍は速くなります。 まずは自分が普段使っているモデルをhfviewerに放り込み、意外なレイヤー接続がないか探すところから始めてみてください。

よくある質問

Q1: 自作のモデルやローカルにあるモデルも可視化できますか?

基本的にはHugging FaceにPushされている必要があります。自分だけが見たい場合は、プライベートリポジトリとしてアップロードすれば、自分だけがhfviewer経由で確認可能です。ローカルファイルを直接読み込む機能は現時点では限定的です。

Q2: Netronと何が違うのでしょうか?

NetronはONNXやTensorFlowなどの「書き出し済みグラフ」の可視化に強いですが、Hugging Faceのモデル構造(config.jsonベース)を直接読むのには向きません。hfviewerはLLMのTransformerブロックなどを理解した単位で表示してくれるため、LLM開発者には圧倒的に見やすいです。

Q3: 動作が重いモデルがあるのですが解決策はありますか?

パラメータ数が多いモデル(Llama-3-70Bなど)は、ブラウザのメモリを消費します。これは構造を描画するノード数が多いためです。不要なタブを閉じるか、スペックの高いPCのブラウザで閲覧することをお勧めします。RTX 4090搭載機ならブラウザのハードウェア加速が効くので快適です。


あわせて読みたい