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

この記事で作るもの

自分のPCのVRAM(ビデオメモリ)容量を入力するだけで、Hugging Faceのベンチマークデータから「自分の環境で動く、今最も性能が高いモデル」を自動でリストアップするPythonスクリプトを作ります。

  • Hugging Face Hubの最新ベンチマーク(Open LLM Leaderboard v2)のデータセットを活用します
  • パラメータ数(B)に基づいて、指定したVRAMに収まるモデルだけを抽出します
  • 実行すると、モデル名、スコア、推定必要VRAMがテーブル形式で出力されます

前提知識として、Pythonの基本的な文法と、ターミナルでのライブラリインストールができる必要があります。

先に確認するスペック・料金

このスクリプト自体は、ごく普通のノートPCで動作します。API利用も無料の範囲内です。

ただし、抽出されたモデルを実際に動かす段階では、以下のハードウェアスペックが判断基準になります。

  • GPU: NVIDIA製(RTX 3060 12GB以上)が事実上の標準です。VRAM 8GB以下だと、現在主流の高性能モデル(Llama 3.1 8B等)を動かす際にコンテキスト長(一度に処理できる文字数)を削る必要があり、実用性が著しく低下します。
  • メモリ(RAM): 最低16GB、できれば32GB以上。ローカルLLMを動かす際、モデルのロード時にシステムメモリを大量に消費するため、16GBだとブラウザを開きながらの作業で詰まります。
  • Mac: Apple Silicon(M1/M2/M3/M4)搭載モデルであれば、ユニファイドメモリをVRAMとして活用できるため、16GB以上のメモリを積んだMacBook AirやProが最低ラインです。

もし「これからAI用PCを組みたい」という方がいれば、RTX 4060 Tiの16GB版を検討してください。速度はそこそこですが、VRAM 16GBという「土俵」に乗れる最安の選択肢です。

なぜこの方法を選ぶのか

Hugging Faceの「Open LLM Leaderboard」をブラウザで眺めて、「このモデルいいな」と思っても、それが自分のPCで動くかどうかを判断するには、モデルカードを読み、パラメータ数を確認し、VRAM計算をするという手間が発生していました。

Redditで話題になった「ベンチマークデータセットのサイズフィルタリング機能」を活用すれば、この工程をすべてコードで自動化できます。

巷には「おすすめモデル5選」のような記事があふれていますが、AIの世界は1週間で王座が入れ替わります。固定の紹介記事を信じるのではなく、常に「今、自分のマシンで動く最強はどれか」を最新のベンチマークデータから動的に取得するアプローチが、実務においては最も合理的です。

Step 1: 環境を整える

まずは、Hugging Faceのデータセットを扱うためのライブラリをインストールします。

pip install -U huggingface_hub datasets pandas tabulate
  • huggingface_hub: モデル情報の取得に使用します。
  • datasets: ベンチマーク(Leaderboard)のデータをダウンロードするために必要です。
  • pandas: 取得したデータを表形式でフィルタリング・ソートするために使います。
  • tabulate: コンソール上で結果を綺麗に表示するためのツールです。

⚠️ 落とし穴: datasetsライブラリは、デフォルトでCドライブ(Windowsの場合)のユーザーディレクトリ以下にキャッシュを溜め込みます。Hugging Faceのデータセットは数GB単位になることもあるため、システムドライブの空き容量が少ない人は、環境変数 HF_HOME を設定して外付けSSDなどに逃がしておくのが無難です。

Step 2: 基本の設定

Hugging FaceのAPIを叩くための初期設定を行います。読み取り専用のトークン(HF_TOKEN)を用意してください。

import os
from datasets import load_dataset
import pandas as pd
from huggingface_hub import login

# Hugging Faceの「Settings -> Access Tokens」から取得したトークンを設定
# 実務では環境変数に入れてください。直書きは避けるのが鉄則です。
hf_token = os.environ.get("HUGGINGFACE_TOKEN")
if hf_token:
    login(token=hf_token)
else:
    print("Warning: HF_TOKEN is not set. Public datasets only.")

# 表示する列の制限を解除(Pandas用)
pd.set_option('display.max_colwidth', None)

ここでは、環境変数からトークンを読み込む形にしています。APIトークンをコードに直書きしたままGitHubにプッシュして、数分後にトークンが無効化される(あるいは悪用される)のは新人が必ず通る道ですが、私はプロとしてお勧めしません。

Step 3: 動かしてみる

まずは、Open LLM Leaderboardの最新データを取得してみましょう。Redditで議論されていた「サイズフィルタ」をプログラム的に適用します。

def get_leaderboard_data():
    # Open LLM Leaderboard v2のデータを取得
    # このデータセットは非常に巨大なので、必要な部分だけをストリーミングするか、
    # フィルタリング済みの小さなサブセットを指定するのが効率的です。
    dataset_name = "open-llm-leaderboard/contents"

    # 最新のベンチマーク結果をロード
    print("最新のベンチマークデータを読み込んでいます...")
    ds = load_dataset(dataset_name, split="train")

    # PandasのDataFrameに変換
    df = pd.DataFrame(ds)
    return df

# テスト実行
try:
    df_raw = get_leaderboard_data()
    print(f"取得完了: {len(df_raw)} 件のモデルが見つかりました")
    print(df_raw.columns)
except Exception as e:
    print(f"エラーが発生しました: {e}")

期待される出力

最新のベンチマークデータを読み込んでいます...
取得完了: 5420 件のモデルが見つかりました
Index(['model', 'average', 'architecture', 'params', 'license', ...], dtype='object')

ここで重要なのは、params(パラメータ数)というカラムが含まれていることです。これが今回、Redditで「フィルタリングしやすくなった」と話題になった核心部分です。以前はモデル名から推測するか、個別のモデルカードをスクレイピングする必要がありました。

Step 4: 実用レベルにする

単にリストを出すだけでは不十分です。実務では「4bit量子化(GGUFなど)したときにVRAMに収まるか」を計算する必要があります。

「モデルサイズ(B)× 0.7 ≒ 4bit量子化時のVRAM消費量(GB)」という私の経験則に基づいた計算式を組み込み、指定したVRAM容量に最適なモデルをランキング形式で表示するスクリプトに仕上げます。

def find_best_models(vram_gb, top_n=10):
    df = get_leaderboard_data()

    # 1. 数値変換(paramsが文字列やNoneの場合の処理)
    df['params'] = pd.to_numeric(df['params'], errors='coerce')
    df = df.dropna(subset=['params', 'average'])

    # 2. VRAM使用量の推定 (4-bit量子化を想定)
    # 計算根拠: 4bitの場合は1パラメータあたり約0.5バイト強だが、
    # KVキャッシュやシステム余裕分を含めて「params * 0.7」を安全圏とする
    df['estimated_vram_gb'] = df['params'] * 0.7

    # 3. 指定したVRAMに収まるモデルにフィルタ
    filtered_df = df[df['estimated_vram_gb'] <= vram_gb].copy()

    # 4. スコア(average)順にソート
    result = filtered_df.sort_values(by='average', ascending=False).head(top_n)

    # 5. 表示用に整形
    display_df = result[['model', 'average', 'params', 'estimated_vram_gb']]
    display_df.columns = ['モデル名', '平均スコア', 'サイズ(B)', '推定VRAM(GB)']

    return display_df

# 実行例: RTX 3060 / 4070 等の「12GB VRAM」で動く最強モデルを探す
my_vram = 12
best_models = find_best_models(my_vram)

print(f"\n--- VRAM {my_vram}GB で動作する高性能モデル TOP10 ---")
print(best_models.to_markdown(index=False))

なぜ「0.7」を掛けるのか

理論上、4bit量子化されたモデルは「1Bパラメータあたり約0.5GB」の容量になります(例:7Bモデルなら約3.5GB)。

しかし、実際にローカルで動かす場合、入力テキストを保持する「KVキャッシュ」がVRAMを占有します。特に最近のLlama 3系はコンテキスト長が長いため、ここをケチるとすぐに「Out of Memory」で落ちます。

「0.7」という係数は、私がRTX 3090と4090で数百件の検証を行った結果導き出した、「実務で安定して動かせるバッファを含んだ数字」です。

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

エラー内容原因解決策
DatasetNotFoundErrorデータセット名が変更されたopen-llm-leaderboard/results など別のサブセットを試す
MemoryErrorPandasで巨大データを一括処理したload_dataset(streaming=True) を使うか、メモリ32GB以上の環境で実行
推定VRAM内で動かないKVキャッシュの設定が大きすぎるn_ctx(コンテキスト長)を2048〜4096に制限して試す

次のステップ

このスクリプトを使えば、もう「どのモデルがいいですか?」とSNSで聞く必要はありません。

次にやるべきことは、ここで見つけたモデルを実際に「Ollama」や「LM Studio」で動かしてみることです。特に最近は、パラメータ数が少なくてもスコアが高い「高密度(High-density)」なモデルが増えています。

また、今回のスクリプトを拡張して、SlackやDiscordのボットに組み込むのも面白いでしょう。「!recommend 16GB」と打てば、その瞬間の最新最強モデルを返してくれるエージェントは、社内のAIエンジニア仲間にも喜ばれるはずです。

ローカルLLMの世界は「自分の手元で動く」という事実にこそ価値があります。このスクリプトを土台に、自分だけの「最強の検証環境」を構築してください。

よくある質問

Q1: パラメータ数が「unknown」になっているモデルがあるのはなぜですか?

Hugging Faceにアップロードされた際のメタデータ(config.json)が不完全な場合に起こります。今回のスクリプトでは dropna で除外していますが、手動で確認したい場合はモデルカードを直接見に行くしかありません。

Q2: 4bit以外の量子化(8bitやQ8_0)の場合は係数をどうすべきですか?

8bitなら係数を「1.2」程度に設定してください。8bitは精度劣化がほぼありませんが、VRAM消費は激しいため、24GB以上のVRAMを持つカード(RTX 3090/4090)でないと14B以上のモデルは厳しくなります。

Q3: MacのM2 16GBメモリですが、16GBと入力して良いですか?

Macの場合はOSや他のソフトも同じメモリを共有するため、入力値は「実メモリの70%」程度(16GBなら11GB)にするのが安全です。これを「16」と入れると、スワップが発生して動作が極端に重くなります。

📦 この記事に関連する商品(楽天メインで価格確認)

RTX 4060 Ti 16GB

VRAM 16GBでローカルLLM入門に現実的

楽天で価格を見る Amazonでも確認

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


あわせて読みたい