GPU推論性能のボトルネック
大規模モデルの推論性能のボトルネックは主に3つの側面から来ます:計算ボトルネック—行列乗算の浮動小数点演算;メモリ帯域幅ボトルネック—GPUメモリからのデータ読み取り速度;通信ボトルネック—複数GPU間のデータ転送。異なる最適化技術は異なるボトルネックを対象としています。
FlashAttention:アテンション機構の革命
FlashAttentionは近年最も重要な推論最適化技術の1つです。ブロック計算と再計算により、アテンション機構のメモリアクセスをO(N²)からO(N)に削減し、メモリの読み書きを大幅に減らします:
# FlashAttentionの使用(現代のフレームワークではデフォルトで有効)
from vllm import LLM
llm = LLM(
model="deepseek-ai/deepseek-llm-7b-chat",
enforce_eager=False, # CUDA Graphを有効化
enable_flash_attention=True # FlashAttentionを有効化
)
# FlashAttentionの効果:
# - メモリ使用量が30-50%削減
# - 推論速度が2-4倍向上(長いシーケンスの場合)
# - より長いコンテキストをサポート量子化推論:INT8/INT4高速化
量子化はモデルの重みをFP16からINT8またはINT4に削減し、精度をほとんど損なわずに推論速度を大幅に向上させます:
# AWQ量子化(推奨)
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "deepseek-ai/deepseek-llm-7b-chat"
quant_path = "./deepseek-7b-awq"
# モデルを量子化
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.quantize(
tokenizer,
quant_config={
"zero_point": True,
"q_group_size": 128,
"w_bit": 4
}
)
model.save_quantized(quant_path)
# INT4推論:速度が3-4倍向上、メモリが75%削減TensorRT-LLM高速化
NVIDIA TensorRT-LLMは最高性能の推論ソリューションの1つです:
# TensorRTエンジンの構築
python TensorRT-LLM/examples/llama/build.py \
--model_dir ./deepseek-7b \
--dtype float16 \
--use_gpt_attention_plugin float16 \
--use_gemm_plugin float16 \
--max_batch_size 8 \
--max_input_len 2048 \
--max_output_len 512 \
--output_dir ./trt_engine
# 推論の実行
python TensorRT-LLM/examples/run.py \
--engine_dir ./trt_engine \
--tokenizer_dir ./deepseek-7b \
--input_text "What is AI?"TensorRT-LLMはvLLMと比較してスループットをさらに20-40%向上させることができます。
連続バッチ処理(Continuous Batching)
従来のバッチ処理では、すべてのリクエストが完了するまで次のバッチを開始できません。連続バッチ処理では、リクエストを動的に追加・削除でき、GPU利用率を大幅に向上させます:
# vLLMはデフォルトで連続バッチ処理を有効化
llm = LLM(
model="deepseek-ai/deepseek-llm-7b-chat",
max_num_seqs=256, # 最大同時リクエスト数
max_num_batched_tokens=8192 # 最大バッチ処理トークン数
)
# 連続バッチ処理の利点:
# - GPU利用率が50-80%向上
# - リクエスト待ち時間が70%削減
# - 動的な同時実行をサポート多次元最適化の組み合わせ戦略
| シナリオ | 推奨組み合わせ |
|---|---|
| 低遅延リアルタイム対話 | FlashAttention + 連続バッチ処理 |
| 高スループットのバッチ処理 | AWQ量子化 + TensorRT-LLM |
| 長いコンテキスト処理 | FlashAttention + PagedAttention |
| 複数GPU推論 | テンソル並列 + パイプライン並列 |
| 低メモリデバイス | INT4量子化 + CPUオフロード |
モニタリングとチューニング
# GPU使用状況の監視
nvidia-smi dmon -s pucv -d 1
# PyTorch Profilerの使用
from torch.profiler import profile, ProfilerActivity
with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA]) as prof:
output = model.generate(input_ids)
print(prof.key_averages().table(sort_by="cuda_time_total"))まとめ
GPU推論の最適化は継続的なプロセスです。まずFlashAttentionと量子化から始めることをお勧めします(最も効果が大きく、コストが低い)。その後、実際のボトルネックに基づいて、より高度な最適化技術を段階的に導入してください。覚えておいてください:時期尚早な最適化は諸悪の根源です。まず測定し、それから最適化しましょう。