5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

松尾研 LLM開発コンペ2025で学んだ「vLLM」入門 ― Transformersとの違いと実践 ―

Last updated at Posted at 2025-10-21

vLLMを理解しないままLLMを扱うのは、スポーツでルールを知らずにプレーするようなもの。
本記事では、松尾研 LLM開発コンペ2025 に参加して得た知見をもとに、Transformersとの違いからvLLMの仕組みを解説し、Google Colab(無料)と Ubuntu + RTX3060(ローカル)で Qwen2-0.5B-Instruct を動かす最小手順を紹介します。

背景:松尾研 LLM開発コンペ2025で見えた課題

松尾研 LLM開発コンペ2025 に参加し、チームで LLM の開発・評価 を進める中で、重要な学びがありました。
vLLMの基礎を理解していないと、推論や評価で大きくつまずく場面が多かったことです。
言い換えれば、このvLLMを理解すれば、スループットやチーム連携は格段に向上します。

1. Transformers(前提の整理)

1-1. Transformersとは?

Transformers は Hugging Face 製の LLM 用フレームワーク。事前学習済みモデルを簡単に呼び出し、テキスト生成・翻訳・要約などが可能です。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "Qwen/Qwen2-0.5B-Instruct"
tok = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")

prompt = "What is AI? Answer in one short sentence."
inputs = tok(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=60)
print(tok.decode(outputs[0], skip_special_tokens=True))

1-2. 強みと課題

項目 内容
強み モデル取得~推論が容易/Hubとの統合/多様なモデル対応
課題 逐次処理中心で非効率/GPUアイドルが多い/複数入力で速度低下

2. vLLM

2-1. vLLMとは?

vLLM は、大規模言語モデル(LLM)推論を高速化・効率化するために設計された推論エンジンです。
従来の Transformers では、入力ごとに逐次的に処理が行われ、GPUの待機時間(アイドル時間)が多く発生していました。
vLLM はこの非効率性を根本から改善し、複数リクエストを同時に処理しながらGPUを常時フル稼働させることを目指しています。
バックエンドでは、PyTorchやCUDAを直接活用しつつ、モデル管理・メモリスケジューリング・OpenAI互換APIの提供までを一元化しており、研究・業務・評価環境のどれでも同じ仕組みで動かすことができます。

2-2. 3つの中核機能

vLLMの高速化を支えるのは、以下の3つの設計思想です。

機能 概要
PagedAttention GPUメモリをページ単位で管理し、必要なページだけを保持。巨大モデルでも効率的に推論可能。
Continuous Batching リクエストをリアルタイムで束ねて動的に処理。複数ユーザの同時生成を高効率で実行。
OpenAI 互換API vllm serve を実行するだけで /v1/completions エンドポイントを自動公開。OpenAI SDKがそのまま使える。

これにより、Transformersをそのまま使う場合と比べて、最大3〜5倍のスループット向上が期待できます。
特に、複数の短いプロンプトを同時に処理するRAGや評価系のタスクでは、その効果が顕著に表れます。

3. Transformers vs vLLM

Transformers と vLLM はどちらも LLM の推論を行う仕組みですが、設計思想がまったく異なります。
Transformers は単純で扱いやすい一方、vLLM は高効率・同時処理特化型です。

比較項目 Transformers vLLM
推論単位 1つの入力を順番に処理(逐次実行) 複数入力をリアルタイムで束ねて処理(動的バッチ化)
GPU利用効率 リクエスト待ち時間中はGPUが待機(非効率) 常に複数リクエストを処理しGPUをフル稼働
メモリ管理 すべてのトークンをGPU上に保持 PagedAttentionで必要な部分のみロード(省メモリ)
API提供 開発者が独自にエンドポイント実装が必要 vllm serve だけでOpenAI互換APIを自動提供
スループット(処理速度) 通常(逐次処理のためボトルネック) 最大3〜5倍の高速化(連続バッチ処理)

Transformers は簡単に動かせますが、並列処理やAPI化を考えるとボトルネックが出やすくなります。
vLLM は推論効率とスケーラビリティを重視して設計されており、同じGPUでも「より多く」「より速く」テキストを生成できます。

補足:Hugging Face トークン(HF_TOKEN)の設定方法

Qwen シリーズなど、Hugging Face Hub で「利用同意が必要なモデル」を使う場合は、アクセス用トークン(HF_TOKEN) を設定する必要があります。
このトークンは、Google Colaboratory と Ubuntu のどちらでも共通で使えます。

トークンの取得(共通手順)

  1. Hugging Face にログイン
  2. 右上メニュー → Settings → Access Tokens
  3. 「Create new token」をクリック
  4. 権限は Read を選択 → コピー(例:hf_xxxxxxxxxxxxxxx

⚠️注意:このトークンはあなたの認証情報です。公開ノートブックやGitHubに直接書かないようにしてください。

Google Colaboratoryでの設定

Colab の「シークレット」機能を使えば、追加コードなしでも自動的に環境変数が設定されます。

  1. 左側メニューの「鍵マーク(シークレット)」
  2. 「新しいシークレットを追加」
    • キー:HF_TOKEN
    • 値:コピーしたトークン

Ubuntu / WSL2 環境での設定

方法A:環境変数を直接設定(推奨)

export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxx

方法B:.env ファイルを用意(uv など対応ツール使用時)

プロジェクト直下に .env ファイルを作成:

echo "HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxx" > .env

uv rundotenv 対応ライブラリを使用すると自動ロードされます。
.env.gitignore に登録しておきましょう。

4. Google Colaboratoryで試す(Qwen 2-0.5B)

4-1. セットアップ

  1. メニューから「ランタイム → ランタイムのタイプを変更」
  2. 「ハードウェア アクセラレータ」を GPU に設定
!pip -q install vllm openai
!nvidia-smi

T4 などのGPUが表示されればOK。

4-2. 単一推論

from vllm import LLM, SamplingParams

llm = LLM(
    model="Qwen/Qwen2-0.5B-Instruct",
    dtype="float32",
    max_model_len=1024,
    gpu_memory_utilization=0.70,
)

out = llm.generate(
    ["What is AI? Answer in one short sentence."],
    SamplingParams(max_tokens=512, temperature=0.2)
)
print(out[0].outputs[0].text.strip())

4-3. 複数プロンプト同時推論

prompts = [
    "What is AI? Answer in one short sentence.",
    "Why do plants need sunlight? Answer simply."
]

outs = llm.generate(prompts, SamplingParams(max_tokens=100, temperature=0.2))
for i, o in enumerate(outs):
    print(f"Q{i+1}:", prompts[i])
    print("A   :", o.outputs[0].text.strip(), "\n")

複数プロンプトを渡すと Continuous Batching が働き、処理時間が短縮されます。

5. Ubuntu + RTX3060で動かす

5-0. 事前チェック(GPU・ドライバ)

  • NVIDIAドライバが入り、nvidia-smi でGPUが見えること
  • CUDA Toolkit は必須ではありません(PyTorchの cu121 ビルドが同梱のCUDAランタイムを使用)
nvidia-smi

5-1. uv でプロジェクト&仮想環境を作る

uv は「高速な Python パッケージ&環境マネージャ」です。プロジェクト直下に .venv を作り、依存は pyproject.toml に記録されます。

# uv インストール(未導入なら)
curl -LsSf https://astral.sh/uv/install.sh | sh

# プロジェクト作成
uv init vllm-demo
cd vllm-demo

以後、仮想環境の有効化は uv run ... でOK(手動でのactivateは不要)。

手動で仮想環境を有効化したい場合:

source .venv/bin/activate    # activate environment
deactivate                   # deactivate environment

5-2. 依存インストール(PyTorch/cu121 + vLLM)

RTX3060(Ampere)は cu121(CUDA 12.1)ビルドが安定です。

uv add torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
uv add vllm openai

GPUがPythonから使えるか確認。仮想環境内で動いていることを保証するため、uv run を付けます。

uv run python -c "import torch;print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
# 例)True NVIDIA GeForce RTX 3060

5-3. vLLM サーバ起動(仮想環境で)

サーバは必ず uv run で起動します。

uv run vllm serve Qwen/Qwen2-0.5B-Instruct \
  --dtype float32 \
  --max-model-len 1024 \
  --gpu-memory-utilization 0.70 \
  --port 8000

別ターミナルを開かず 同一シェルで動かしたい人向けTips:
uv run vllm serve ... & でバックグラウンド化、tail -f nohup.out 等でログ監視。

5-4. クライアントから叩く(OpenAI SDK互換)

Python(同じ仮想環境から)

# client.py
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")

resp = client.completions.create(
    model="Qwen/Qwen2-0.5B-Instruct",
    prompt="What is AI? Answer in one short sentence.",
    max_tokens=512
)
print(resp.choices[0].text.strip())

実行:

uv run python client.py

curl

curl -s http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model":"Qwen/Qwen2-0.5B-Instruct",
    "prompt":"What is AI? Answer in one short sentence.",
    "max_tokens":512
  }' | jq -r '.choices[0].text'

謝辞

本プロジェクトを通じて、貴重な学びと経験を得ることができました。
松尾研LLM開発コンペ2025の運営関係者および支援者の皆様に、心より感謝申し上げます。
また、チームねこの皆さんと共に学び、成長できたことに心から感謝します。

本プロジェクトは、国立研究開発法人新エネルギー・産業技術総合開発機構(以下「NEDO」)の「日本語版医療特化型LLMの社会実装に向けた安全性検証・実証」における基盤モデルの開発プロジェクトの一環として行われます。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?