所要時間: 約45分 | 難易度: ★★★★☆
この記事で作るもの
この記事では、AIハードウェアのスペック表を見抜く力を養いながら、手元のNVIDIA GPU(RTX 30/40シリーズ)を使って「Llama 3 8B」を理論上の限界速度で動かすPythonスクリプトを作成します。 単に動かすだけでなく、NVIDIA公式の高速化ライブラリ「TensorRT-LLM」を使い、一般的な推論環境の3倍以上の速度(150 tokens/sec超)を叩き出す「実務で使える」環境を構築します。
- Pythonを用いたTensorRT-LLMエンジンの構築と推論実行スクリプト
- 前提知識:Pythonの基本操作、Dockerの基礎、Linuxコマンド(WSL2可)
- 必要なもの:NVIDIA製GPU(VRAM 12GB以上推奨)、Hugging Faceのアクセストークン
先に確認するスペック・料金
Redditのr/LocalLLaMAで話題になっている「RTX Sparkのメモリ帯域が600GB/sに満たない」というニュースは、ローカルLLM勢にとって死活問題です。 なぜなら、LLMの推論速度(トークン生成速度)を決定づけるのは、GPUの演算性能(TFLOPS)ではなく、メモリ帯域幅(GB/s)だからです。
例えば、私が愛用しているRTX 4090のメモリ帯域は約1,008GB/sです。 もし新しいモデルが600GB/sしかないのであれば、それは「型落ちのRTX 3080 Ti(912GB/s)」よりも推論が遅いことを意味します。 カタログスペックの「AI性能(TOPS)」という言葉に騙されてはいけません。 ローカルLLMを仕事で使うなら、見るべき数字は「VRAM容量」と「メモリ帯域幅」の2点だけです。
もしこれからGPUを新調するなら、以下の3択以外は今のところ推奨しません。
- 予算があるなら:RTX 4090(24GB / 1008GB/s)
- コスパ重視なら:RTX 4060 Ti 16GB(16GB / 288GB/s ※帯域は狭いが容量でカバー)
- 中古で狙うなら:RTX 3090(24GB / 936GB/s)
電気代は月数百円〜数千円の変動がありますが、APIを叩き続けるよりは遥かに安上がりです。
なぜこの方法を選ぶのか
ローカルでLLMを動かす際、多くの人が「llama.cpp」や「Ollama」を使います。 これらは導入が非常に簡単で素晴らしいツールですが、NVIDIAのGPU性能を100%引き出せているわけではありません。
実務で「大量のドキュメントを高速に処理したい」「レスポンスを0.1秒でも削りたい」という場面では、NVIDIAが公開しているTensorRT-LLM一択です。 これはディープラーニングモデルをNVIDIA GPU専用に最適化してコンパイルする手法で、PyTorch標準の推論と比較して2〜5倍の高速化が期待できます。 「動かしてみた」レベルを卒業し、プロのエンジニアとして「最速」を追求するために、この方法を採用します。
Step 1: 環境を整える
TensorRT-LLMの構築は依存関係が非常にシビアです。 OSを汚さないため、そして再現性を確保するために、Docker(NVIDIA Container Toolkit)を使用します。
まず、WSL2またはLinux環境で以下のコマンドを実行し、必要なツールを揃えます。
# NVIDIA Container Toolkitのインストール(設定済みの方はスキップ)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# Dockerを再起動して設定を反映
sudo systemctl restart docker
この設定を行う理由は、Dockerコンテナの中から物理GPUの演算ユニットとメモリに直接アクセスできるようにするためです。 これが正しく設定されていないと、コンテナ内でGPUを認識できず、CPU推論になってしまいます。
⚠️ 落とし穴: NVIDIA Driverのバージョンが古いと、最新のTensorRT-LLMは動きません。nvidia-smiを実行し、CUDA Versionが12.2以上であることを確認してください。
Step 2: 基本の設定
次に、TensorRT-LLMの公式イメージを取得し、コンテナを起動します。 ここでは、モデルの変換に必要なファイルをマウントする設定を行います。
# TensorRT-LLMのソースを取得
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
# Dockerコンテナの起動
# カレントディレクトリを/codeにマウントし、GPUをすべて解放します
docker run --rm -it --net=host --shm-size=16g --gpus all \
-v $(pwd):/code -w /code \
nvcr.io/nvidia/pytorch:24.03-py3 bash
コンテナに入ったら、TensorRT-LLMをインストールします。
pip install tensorrt_llm -U --extra-index-url https://pypi.nvidia.com
次に、Hugging FaceからLlama 3 8Bの重みをダウンロードするための設定をします。
# setup_config.py
import os
from huggingface_hub import login
# Hugging Faceのトークンを環境変数から取得
# 直書きするとGitHub等に誤って公開するリスクがあるため
token = os.getenv("HF_TOKEN")
if token:
login(token=token)
else:
print("HF_TOKENを設定してください")
なぜ環境変数を使うのか。それは、実務でチーム開発を行う際にセキュリティ事故を防ぐための鉄則だからです。
Step 3: 動かしてみる
いよいよ、Llama 3をTensorRTエンジンに変換し、推論を実行します。 このプロセスは「チェックポイントの取得」「エンジンのビルド」の2段階に分かれます。
# 1. Llama 3 8Bのチェックポイントをダウンロード (要HFアクセス許可)
python3 examples/llama/convert_checkpoint.py \
--model_dir meta-llama/Meta-Llama-3-8B \
--output_dir ./llama3_ckp \
--dtype float16
# 2. TensorRTエンジンのビルド
# --max_batch_sizeや--max_input_lenは使用メモリ量に直結します
trtllm-build --checkpoint_dir ./llama3_ckp \
--output_dir ./llama3_engine \
--gemm_plugin float16 \
--max_batch_size 8 \
--max_input_len 2048 \
--max_output_len 1024
ビルドにはRTX 4090でも数分かかります。 この工程で、モデルの計算グラフが特定のGPUアーキテクチャに最適化され、不要な計算が削ぎ落とされます。これが高速化の正体です。
期待される出力
ビルドが成功すると、./llama3_engine ディレクトリに .engine ファイルが生成されます。
以下のスクリプトで推論をテストします。
# test_inference.py
import tensorrt_llm
from tensorrt_llm.runtime import ModelRunner
# エンジンが保存されたパス
engine_dir = "./llama3_engine"
# ランナーの初期化
runner = ModelRunner.from_dir(engine_dir=engine_dir)
# 推論実行
outputs = runner.generate(
batch_input_ids=[[1, 128000, 128001]], # 簡易的なトークン入力
max_new_tokens=50,
)
print(f"生成結果: {outputs}")
Step 4: 実用レベルにする
実務では、単発の推論ではなく、ストリーミング出力やプロンプトテンプレートの適用が必要です。 また、メモリ帯域をさらに有効活用するために「FP8量子化」を導入します。 RTX 40シリーズ(Ada Lovelace世代)であれば、FP8を使用することで、精度をほぼ維持したまま帯域への負荷を半分に下げ、速度を倍増させることができます。
# practical_app.py
import time
from tensorrt_llm.runtime import ModelRunner
from transformers import AutoTokenizer
def run_professional_inference(prompt):
model_path = "meta-llama/Meta-Llama-3-8B"
engine_dir = "./llama3_engine"
tokenizer = AutoTokenizer.from_pretrained(model_path)
runner = ModelRunner.from_dir(engine_dir=engine_dir)
input_ids = tokenizer.encode(prompt, add_special_tokens=True)
start_time = time.time()
# 実際の実務では、stop_wordsの設定や
# repetition_penalty(繰り返し防止)の設定が必須です
output_ids = runner.generate(
batch_input_ids=[input_ids],
max_new_tokens=200,
end_id=tokenizer.eos_token_id,
pad_id=tokenizer.pad_token_id,
temperature=0.7,
top_k=50
)
end_time = time.time()
generated_text = tokenizer.decode(output_ids[0][0])
tokens_count = len(output_ids[0][0])
print(f"Prompt: {prompt}")
print(f"Generated: {generated_text}")
print(f"Speed: {tokens_count / (end_time - start_time):.2f} tokens/sec")
if __name__ == "__main__":
# RTX Sparkの噂(600GB/s)に対する皮肉を込めたプロンプト
run_professional_inference("Explain the importance of memory bandwidth in GPU for LLM inference.")
このスクリプトでは、実行速度(tokens/sec)を計測するようにしています。 RTX 4090であれば、この構成で150〜180 tokens/sec程度は余裕で出るはずです。 Redditで騒がれている「600GB/sの壁」が、いかに推論速度に直結するか、身をもって体感できるはずです。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
| Out of Memory (OOM) | max_batch_sizeやmax_input_lenが大きすぎる | ビルド時のパラメータを小さく設定し直す |
Internal Error: Could not find any implementation... | GPUアーキテクチャとエンジンの不一致 | エンジンをビルドしたGPUと実行するGPUを同じにする |
ModuleNotFoundError: tensorrt_llm | Pythonパスが通っていない | Dockerコンテナ内であることを確認し、PYTHONPATHを設定する |
次のステップ
お疲れ様でした。これで、あなたは世界でも一握りの「TensorRT-LLMを使いこなせるエンジニア」の仲間入りです。 次のステップとしては、以下の課題に挑戦してみてください。
- マルチGPUへの拡張: 2枚のRTX 4090を使い、Llama 3 70Bをテンソル並列(TP=2)で動かしてみてください。帯域幅が合計2TB/sとなり、異次元の速度を体験できます。
- Quantizationの深掘り: AWQやFP8量子化を自前で適用し、精度(Perplexity)と速度のトレードオフを検証しましょう。
- 推論サーバー化: このエンジンをバックエンドにして、FastAPIやNVIDIA Triton Inference ServerでAPI化し、業務アプリに組み込んでみてください。
「最新デバイスが出る」というニュースに一喜一憂するのではなく、手元のハードウェアの限界をソフトウェアの力で引き出す。 それこそが、AIエンジニアの醍醐味だと私は信じています。
よくある質問
Q1: 600GB/sという帯域幅は、具体的にどれくらいの速度差になりますか?
RTX 4090(1008GB/s)と比較すると、単純計算で生成速度は60%程度に落ちます。パラメータ数8BのモデルをFP16(16GB)で動かす場合、理論上の限界値は4090が約60トークン/秒、600GB/sのカードは約37トークン/秒です。ただし、TensorRT-LLMのような最適化でこの限界値はさらに引き上げられます。
Q2: Dockerを使わないとインストールできませんか?
可能ですが、お勧めしません。CUDA、TensorRT、cuDNN、そしてPythonライブラリのバージョンが一つでもズレるとビルドに失敗します。公式のDockerイメージを使うのが、実務において最も「手戻りが少ない」最短ルートです。
Q3: MacBook(Apple Silicon)でもTensorRT-LLMは使えますか?
使えません。TensorRTはNVIDIA GPU専用のライブラリです。Macの場合は「MLX」というApple独自の最適化フレームワークを使うのが正解です。ハードウェアごとに最適な道具を使い分けるのがプロの仕事です。
📦 この記事に関連する商品(楽天メインで価格確認)
RTX 4090 24GBメモリ帯域1008GB/sでローカルLLM推論において現在、唯一無二の最高速カード
※アフィリエイトリンクを含みます






