所要時間: 約40分 | 難易度: ★★★★☆

この記事で作るもの

  • Qwen 3.6(および現行のQwen 2.5シリーズ)をバックエンドに採用し、OpenAI互換の高速APIサーバーを自社サーバー上に構築します。
  • Pythonから呼び出し、長文の要約やコード生成を自動化する実用的なスクリプトを完成させます。
  • 前提知識:Linuxの基本コマンド操作、Pythonの基礎、GPUドライバー(CUDA)の概念を理解していること。
  • 必要なもの:NVIDIA製GPU(VRAM 24GB以上推奨)、Linux環境(Ubuntu 22.04以降)、Python 3.10以上。

📦 この記事に関連する商品

NVIDIA GeForce RTX 4090

72Bクラスの量子化モデルを高速かつ安定して動かすための、ローカルLLM構築における現時点の結論です。

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

なぜこの方法を選ぶのか

ローカルLLMを動かす方法はいくつかありますが、私は「vLLM」一択だと考えています。llama.cppも手軽で良いのですが、実務、特に複数人での利用やバッチ処理を想定した場合、スループット(時間あたりの処理量)でvLLMに勝てるライブラリは今のところありません。

vLLMが採用している「PagedAttention」という技術は、VRAMの断片化を劇的に抑え、推論速度を最大で数倍に引き上げます。SIer時代、リソース不足で処理が詰まる現場を何度も見てきましたが、このライブラリの登場で「ローカルでも本気で使える」レベルに到達しました。今回は、来るべきQwen 3.6のリリースを見据え、最もパフォーマンスを引き出せる構成で組み上げます。

Step 1: 環境を整える

まずは推論エンジンであるvLLMをインストールします。依存関係が複雑なため、必ず仮想環境を作成してください。

# 仮想環境の作成とアクティベート
python3 -m venv qwen-env
source qwen-env/bin/activate

# 最新のpipとセットアップツールに更新
pip install -U pip setuptools wheel

# vLLMのインストール(CUDA 12.1以上を想定)
pip install vllm

vLLMはインストール時にCUDAのバージョンを厳密にチェックします。エラーが出る場合は nvidia-smi で自分の環境のCUDAバージョンを確認し、公式ドキュメントに沿ったバイナリを選択してください。

⚠️ 落とし穴: 「とりあえず最新を入れる」と、PyTorchとCUDAのバージョン不一致で動かないことが多々あります。私の経験上、特にRTX 4090などのAda世代を使う場合は、CUDA 12.x系で統一しないと、フラッシュアテンション(推論加速機能)が効かずに速度が半分以下に落ちることがあります。

Step 2: 基本の設定

APIサーバーとして立ち上げるための起動スクリプトを用意します。直接コマンドを打つよりも、シェルスクリプトにして引数を管理するのが実務的です。

# start_server.sh という名前で保存
python3 -m vllm.entrypoints.openai.api_server \
    --model Qwen/Qwen2.5-72B-Instruct-AWQ \
    --quantization awq \
    --tensor-parallel-size 2 \
    --max-model-len 32768 \
    --port 8000

ここでは現時点で最強の Qwen2.5-72B のAWQ版(4bit量子化)を指定しています。Qwen 3.6がリリースされた際は、このモデル名を書き換えるだけで対応可能です。

  • --quantization awq: 72BモデルはそのままではVRAMを140GB以上消費しますが、AWQ量子化により40GB程度に抑えられます。
  • --tensor-parallel-size 2: 私のようにRTX 4090を2枚挿ししている場合、この数値を「2」にすることで、2枚のGPUにモデルを分割してロードします。
  • --max-model-len 32768: 業務で長いドキュメントを扱うなら、コンテキスト長はこれくらい確保しておくと安心です。

Step 3: 動かしてみる

サーバーが立ち上がったら(モデルのロードに数分かかります)、別のターミナルからPythonスクリプトでリクエストを投げます。

import os
from openai import OpenAI

# vLLMで立てたローカルサーバーを指す設定
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="dummy-key-for-local"
)

def run_test_query(prompt):
    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-72B-Instruct-AWQ",
        messages=[
            {"role": "system", "content": "あなたは優秀なエンジニアです。"},
            {"role": "user", "content": prompt}
        ],
        temperature=0.7
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    result = run_test_query("Pythonでフィボナッチ数列を生成する効率的なコードを書いて。")
    print(result)

期待される出力

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

Qwenシリーズはコード生成能力が非常に高く、特にこの「ジェネレータを使った実装」をさらっと出すあたり、実務での使い勝手の良さが伝わると思います。

Step 4: 実用レベルにする

実務では、単発の問い合わせではなく「大量のPDFを読み込ませる」「社内DBから取ってきた情報を整理させる」といったバッチ処理が求められます。エラーハンドリングとリトライ処理を追加した、より堅牢な実装例を紹介します。

import time
from openai import OpenAI, APIConnectionError, RateLimitError

client = OpenAI(base_url="http://localhost:8000/v1", api_key="local")

def safe_generate(prompt, retries=3):
    """
    接続エラーや負荷によるタイムアウトを考慮した生成関数
    """
    for i in range(retries):
        try:
            response = client.chat.completions.create(
                model="Qwen/Qwen2.5-72B-Instruct-AWQ",
                messages=[{"role": "user", "content": prompt}],
                timeout=60.0 # 巨大な出力に備えて長めに設定
            )
            return response.choices[0].message.content
        except (APIConnectionError, RateLimitError) as e:
            if i == retries - 1:
                raise
            print(f"再試行中... ({i+1}/{retries}): {e}")
            time.sleep(2 ** i) # 指数バックオフ

# 大量データの処理例
tasks = ["タスク1の説明...", "タスク2の説明...", "タスク3の説明..."]
results = [safe_generate(t) for t in tasks]

for res in results:
    print(f"--- Processed ---\n{res[:50]}...")

ローカル環境といえど、vLLMに高い負荷をかけるとリクエストが詰まることがあります。SIer時代、システムの安定稼働のために最も時間を割いたのがこの「リトライ戦略」でした。この数行を入れるだけで、夜通し回すバッチ処理の完走率が劇的に変わります。

よくあるトラブルと解決法

エラー内容原因解決策
Out of Memory (OOM)KVキャッシュの確保失敗--gpu-memory-utilization を 0.9 程度に下げる
接続拒否 (Connection Refused)サーバー起動完了前のリクエストログに Uvicorn running on... が出るまで待つ
推論が極端に遅いCPU推論にフォールバックしているnvidia-smi でGPUが使われているか確認

次のステップ

この記事の通りに動かせるようになったら、次は「RAG(検索拡張生成)」との組み合わせに挑戦してください。Qwen 3.6(または最新のQwen 2.5)は、外部知識を与えた際の忠実度が非常に高いのが特徴です。

具体的には、社内のドキュメントをベクターDB(ChromaやQdrant)に放り込み、ユーザーの質問に関連する箇所を抽出してQwenのコンテキストに流し込む仕組みを作ります。これにより、モデルが知らないはずの「自社独自の仕様」についても正確に回答できるようになります。

また、Qwenは多言語対応が優れているため、海外の技術ドキュメントを日本語で要約させるエージェントを構築するのも、フリーランスとしての生産性を上げる強力な武器になるはずです。

よくある質問

Q1: RTX 3060(12GB)などのミドルレンジGPUでも動きますか?

72Bモデルは無理ですが、7Bや14BモデルのAWQ版なら十分動きます。vLLMの --model 引数を Qwen/Qwen2.5-7B-Instruct-AWQ に変更して試してみてください。速度的には12GBでも実用範囲内です。

Q2: サーバーを公開して外部から使いたいのですがセキュリティは?

vLLMの標準機能には認証がありません。実務で使うなら、NGINXでリバースプロキシを立て、Basic認証やIP制限をかけるのが鉄則です。SIer的な観点では、VPN経由のみのアクセスに絞るのが最も安全です。

Q3: モデルが「Qwen 3.6」になったら設定は変わりますか?

基本的なアーキテクチャがTransformerベースである限り、vLLM側が数日で対応版を出します。私たちは単に pip install -U vllm を実行して、起動引数のモデル名を最新のものに更新するだけで、これまでの資産をそのまま引き継げます。


あわせて読みたい