きっかけ
仕事でローカル環境にLLMを乗せたアプリを作る話が出たときのこと。通常のPyTorchやTransformersで推論を回すと、バッチ処理の効率が悪くて、数秒から数十秒かかる。「これじゃユーザー体験にならない」と悩んでたときに、VLLMという選択肢を知った。
使ってみた
導入は思ったよりシンプル。pip install vllmで入ってくるし、基本的な使い方はllm = LLM(model="meta-llama/Llama-2-7b-hf"); outputs = llm.generate(prompts)みたいな感じ。試しに llama2-7bを回してみたら、単純な推論だけでも従来比で2倍以上速い。ドキュメントもそこそこ揃ってるから、セットアップで詰まることはなかった。
ここが良い
最大の強みはページ単位キャッシング。複数のリクエストが同じトークンを参照するときに、KV キャッシュを再利用できるから、メモリ効率がえげつなく良い。それに動的バッチング機構で、異なる長さのシーケンスを同時処理できる。実際に複数ユーザーからの並行リクエストを捌いてみたら、スループットが従来の3倍以上に。結果として、単一GPU(A100)でも十分本番耐性のあるパフォーマンスが出た。ちなみに CUDA対応はもちろん、ROCmやTPUにも対応してるから、ハードウェア選択の自由度も高い。
気になった点
ドキュメントは充実してきてるけど、細かいチューニングやトラブル時の情報はまだ限られてる。特にカスタムモデルで何か想定外が起きた時の解決策が少ない。あと分散推論セットアップは手順が複雑で、初見だと戸惑うかも。
まとめ
ローカルやオンプレ環境でLLM推論が重い、スループット足りない、そういう課題を抱えてるなら、まず試す価値は確実にある。自分も今では新しい推論パイプを組む時はVLLMが第一選択になってる。