[備忘録] Google Colab無料枠 (T4) でVLLMを使った日本語GPT-2を動かしてみた

## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4780d64c-1506-4149-83b8-7aebaf1b7cfe.png)

VLLMは、高性能な大規模言語モデル推論エンジンとして注目を集めています。本記事では、Google Colaboratoryの無料枠で提供されるT4 GPUを使って、日本語GPT-2モデルをVLLMで動かした実践記録を紹介します。

**重要な注意事項：**
vLLMは高速な推論のためにCUDA対応GPUが必須で、特に現代的なGPU（例：T4、V100、A100など）での動作を想定しています。Google Colabの無料枠ではメモリ不足やGPU非対応で起動に失敗することが多く、安定動作にはColab Proや自前のGPU環境が推奨されます。

## 環境設定
### 使用環境
- **プラットフォーム**: Google Colaboratory（無料枠）
- **GPU**: NVIDIA Tesla T4
- **使用モデル**: rinna/japanese-gpt2-small
- **推論エンジン**: VLLM

ランタイムのタイプ: T4 GPUを設定した。2025年6月現在での検証結果である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c4736d2f-4a52-4acd-913e-cca3343c9550.png)

### 前提条件
- Googleアカウント
- Google Colabの基本操作知識
- Pythonの基礎知識

## 実装手順
### 1. VLLMのインストール
まず、Google Colabの新しいノートブックを作成し、GPUランタイムを選択します。その後、VLLMをインストールします。

```python
!pip install vllm
```

インストールには数分かかる場合があります。依存関係も含めて自動的にインストールされるため、エラーが出ないことを確認しましょう。

### 2. VLLMサーバーの起動
次に、日本語GPT-2モデルを使ってVLLMサーバーを起動します。バックグラウンドで実行するため、`nohup`コマンドを使用します。

```python
!nohup vllm serve rinna/japanese-gpt2-small --dtype float32 > vllm.log 2>&1 &
```

**パラメータの説明：**
- `rinna/japanese-gpt2-small`: 使用するモデル名
- `--dtype float32`: データ型をfloat32に指定（T4の制約に合わせて調整）
- `> vllm.log 2>&1 &`: ログをファイルに出力し、バックグラウンドで実行

### 3. サーバー起動確認
ファイルからvllm.logを開きログを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3d0e3e59-6454-4e1e-a440-b030e6e7d025.png)

正常に起動すると、以下のような出力が表示されます：
- モデルの読み込み完了メッセージ
- サーバーがポート8000で待機中のメッセージ
- APIエンドポイントの情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e7970e52-db19-490f-b940-88f2def718e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7a760fd6-7a82-4bf0-b118-cdbd24a101c9.png)

### 4. APIによる推論テスト
サーバーが起動したら、Python Requestsライブラリを使ってAPIを呼び出し、実際に推論を行います。

```python
import requests

url = "http://127.0.0.1:8000/v1/completions"
headers = {"Content-Type": "application/json"}

# 丁寧で自然なプロンプトを指定（文脈が明確な文）
prompt_text = "今日は寒いので、夕食は鍋にしようと思います。おすすめの鍋料理はありますか？"

payload = {
    "model": "rinna/japanese-gpt2-small",
    "prompt": prompt_text,
    "max_tokens": 64,
    "temperature": 0.3,  # 出力の安定性を高める
    "top_p": 0.8,
    "stop": ["。", "！", "？"]  # 文の切れ目で止める
}

response = requests.post(url, headers=headers, json=payload)

# 応答を表示
try:
    result = response.json()
    generated_text = result["choices"][0]["text"]
    print(f"【出力】\n{generated_text}")
except Exception as e:
    print("エラー:", e)
    print("レスポンス内容:", response.text)
```

## 実行結果
上記のコードを実行した結果、以下のような出力が得られました。

```
【出力】
鍋料理は、鍋の具材を鍋にのせて、野菜や肉、魚などを入れて、煮込む料理です
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f82d9f38-160c-4ab0-b053-10165a082a59.png)

## パラメータ調整のポイント
日本語の自然な文章生成を意識して、各種パラメータを次のように設定しています。まず、temperature は出力の安定性を重視して 0.3 に設定し、創造性よりも一貫性を優先しています。また、top_p を 0.8 に設定することで、適度な多様性を保ちつつ、不自然な単語の生成を抑制しています。stop には「。」「！」「？」といった日本語の文末記号を指定し、自然な文の終わりで出力が停止するようにしています。さらに、max_tokens はT4環境の制約や応答速度を考慮し、64トークンに設定しました。

## 注意点とトラブルシューティング
Google Colabの無料枠では、古いGPUの割り当てやメモリ不足、セッション切断といった制約があり、大規模モデルの実行は安定しません。対策としては、Colab Proへのアップグレードや自前のGPU環境、クラウドGPUの利用が有効です。

T4 GPUでメモリ不足が起きる場合は、--dtype float16やfloat32の指定、小型モデルの選択、バッチサイズや--max-model-lenの調整が効果的です。

また、Colabでは一定時間操作がないとタイムアウトするため、定期的にセルを実行し、必要なデータは事前にGoogle Driveへ保存しておくと安心です。

パフォーマンスを最適化するには、バッチサイズの調整やキャッシュの活用、ログ出力の抑制も有効です。

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/8167b7a5-7c84-4211-85fb-492f20b3a44d.png)

Google Colabの無料枠におけるT4 GPUでVLLMを検証したところ、日本語GPT-2モデルが正常に動作し、自然な日本語出力と安定したAPI応答を確認できました。一方で、Colabの不安定さやメモリ制限、セッション時間といった制約も明確になりました。

実験や学習段階ではColab無料枠でも十分ですが、開発にはColab ProやクラウドGPUの利用、本格運用では自前のGPUや商用クラウドの検討が望まれます。VLLMの性能を活かすには、用途に応じたGPU環境の段階的な整備が重要です。

---
最近は7B以上のLLMを動かしたいと考えていましたが、手の届く範囲で課金してもVLLMでの実行は難しく、最終的に本記事の内容に落ち着きました。