本トピックでは、Alibaba Cloud Edge Node Service (ENS) および vLLM を用いた QwQ-32B 推論モデルのデプロイ構成、パフォーマンスベンチマーク、および実行環境のセットアップについて説明します。
QwQ-32B の概要
QwQ-32B は、Qwen2.5-32B を基盤とするオープンソースの推論モデルです。強化学習を活用することで、AIME 2024、AIME 2025、LiveCodeBench などの主要なベンチマークおよび IFEval、LiveBench などの汎用指標において、フルバージョンの DeepSeek-R1 と同等の性能を実現しています。さらに、パラメーター数を削減した設計により、推論ワークロード向けのコスト効率に優れた選択肢となっています。
適用範囲
| シナリオ | 平均入力長(トークン) | 平均出力長(トークン) | 代表的な用途 |
|---|---|---|---|
| 数学的推論 | 0.5K~1.5K | 0.8~3.6K | MATH 問題の解決、LSAT 論理分析 |
| 知識ベース型対話検索 | 1K~4K | 0.2K~1K | MMLU 知識評価、医療相談 |
| マルチラウンド対話 | 2K~8K | 0.5K~2K | カスタマーサポート、心理相談 |
| 長文書処理 | 8K~16K | 1K~4K | 論文要約、法務文書分析 |
| コード生成およびデバッグ | 0.3K~2K | 1K~5K | 関数実装、デバッグ |
パフォーマンス指標のリファレンス
| 指標 | 説明 |
|---|---|
| モデル精度 | モデル重みおよび計算における数値精度。精度を低くするとメモリ使用量およびコストが削減されますが、複雑なタスクにおける精度が低下する可能性があります。 |
| 同時実行性 | 同時に処理されるユーザー要求の数。同時実行数を増やすと処理能力は向上しますが、GPU メモリおよび帯域幅の使用量も増加します。 |
| 入力長 | ユーザーによるプロンプトのトークン数。入力が長いほど GPU メモリ消費量および TTFT が増加します。 |
| 出力長 | モデル応答のトークン数。過度に長い出力は、出力の切り捨てやメモリ不足(OOM)エラーを引き起こす可能性があります。 |
| TTFT | 最初のトークンまでの時間。要求送信から最初の出力トークン受信までの遅延。目標値:1 秒未満。最大許容値:2 秒。 |
| TPOT | 1 トークンあたりの生成時間。最初のトークン以降の各トークンの平均生成時間。目標値:50 ms 未満。最大許容値:100 ms。 |
| 要求単位のスループット | 1 要求あたりのトークン出力レート(トークン/秒)。目標値:10~30 トークン/秒。 |
| GPU メモリ使用率 | 実行時の GPU メモリ使用率(モデルパラメーター、KV キャッシュ、中間アクティベーションを含む)。95 % を超える使用率は OOM エラーを引き起こす可能性があります。 |
デプロイ構成およびベンチマーク
ENS は、世界中に分散配置されたエッジノード上で異種混合のコンピューティングリソースを提供します。単一 GPU カードのメモリ容量は 12 GB ~ 48 GB です。以下のセクションでは、異なるモデル精度で QwQ-32B をデプロイするための、2 つの検証済み構成について説明します。
FP16 精度:デュアル GPU(48 GB × 2)インスタンス
この構成では、2 枚の 48 GB GPU カードを搭載した仮想マシン(VM)インスタンスを使用します。
環境仕様
| パラメーター | 値 |
|---|---|
| CPU | 96 コア |
| メモリ | 384 GB |
| GPU | NVIDIA 48 GB × 2 |
| オペレーティングシステム | Ubuntu 22.04 |
| Docker バージョン | 26.1.3 |
| GPU ドライバー | Driver Version: 570.124.06、CUDA Version: 12.4 |
| 推論フレームワーク | vLLM 0.7.2 |
パフォーマンスベンチマーク
| シナリオ | 入力長 | 出力長 | 同時実行数 | 要求単位のスループット(トークン/秒) | TTFT(秒) | TPOT(ms) | GPU メモリ使用率 |
|---|---|---|---|---|---|---|---|
| 数学的推論およびコード生成 | 1K | 4K | 4 | 14.5 | 0.6 | 67.4 | 95 % |
| 数学的推論およびコード生成 | 1K | 4K | 8 | 13.3 | 1.6 | 71.3 | 95 % |
| 知識ベース型対話検索 | 4K | 1K | 2 | 14.2 | 1.8 | 68.6 | 95 % |
| 知識ベース型対話検索 | 4K | 1K | 4 | 13 | 2.7 | 72.7 | 95 % |
| マルチラウンド対話および長文書処理 | 4K | 4K | 2 | 14.64 | 1.7 | 71.5 | 95 % |
| マルチラウンド対話および長文書処理 | 4K | 4K | 4 | 13.6 | 2.9 | 82.3 | 95 % |
同時実行数の推奨事項
数学的推論およびコード生成(入力が短く、出力が長い:入力 0.3K~2K、出力 0.8K~5K):同時実行数 4 の場合、TTFT が 1 秒未満で約 15 トークン/秒のスループットが得られ、ユーザーエクスペリエンスとコストのバランスが最適化されます。同時実行数 8 では TTFT が増加しますが、許容範囲内です。要求数あたりのコスト削減を目的として、同時実行数を増加させることを推奨します。
知識ベース型対話検索(入力が長く、出力が短い:入力 1K~4K、出力 0.2K~1K):最適な同時実行数は 2 です。同時実行数 4 の場合、TTFT は 2 秒を超えますが、ネットワーク遅延を考慮すると許容範囲内です。
マルチラウンド対話および長文書処理(入力・出力ともに長い:入力 2K~16K、出力 1K~4K):入力が長くなると、メモリ消費量および TTFT の両方が増加します。最適な同時実行数は 2 です。ワークロードに応じて入力長および同時実行数を調整してください。
5基の12 GB GPUインスタンスでのINT4精度
この構成では、5 枚の 12 GB GPU カードを搭載したベアメタルインスタンスを使用します。
環境仕様
| パラメーター | 値 |
|---|---|
| CPU | 24 コア × 2、3.0 ~ 4.0 GHz |
| メモリ | 256 GB |
| GPU | NVIDIA 12 GB × 5 |
| オペレーティングシステム | Ubuntu 20.04 |
| Docker バージョン | 28.0.1 |
| GPU ドライバー | Driver Version: 570.124.06、CUDA Version: 12.4 |
| 推論フレームワーク | vLLM 0.7.2 |
パフォーマンスベンチマーク
5 枚 GPU(12 GB × 5)構成は、要求単位のスループットが非常に高い一方で、カード単位の GPU メモリが小さいため TTFT のパフォーマンスに制限があります。この構成は、数学的推論およびコード生成のシナリオに適しています。知識ベース型対話検索、マルチラウンド対話、および長文書処理には、代わりにデュアル GPU(48 GB × 2)インスタンスをご利用ください。
| シナリオ | 入力長 | 出力長 | 同時実行性 | 要求単位のスループット(トークン/秒) | TTFT(秒) | TPOT(ms) | GPU メモリ使用率 |
|---|---|---|---|---|---|---|---|
| 数学的推論およびコード生成 | 1K | 4K | 2 | 37 | 1.3 | 26.4 | 96.5 % |
| 数学的推論およびコード生成 | 1K | 4K | 4 | 32.5 | 1.7 | 28.7 | 96.5 % |
| 数学的推論およびコード生成 | 1K | 4K | 8 | 24.6 | 3.5 | 61.5 | 96.5 % |
| 知識ベース型対話検索 | 4K | 1K | 1 | 33.5 | 4.7 | 25.1 | 96.5 % |
| マルチラウンド対話および長文書処理 | 4K | 4K | 1 | 35.8 | 4.7 | 26.6 | 96.5 % |
| マルチラウンド対話および長文書処理 | 8K | 4K | 1 | 21.9 | 9.3 | 43.3 | 96.5 % |
同時実行の推奨
数学的推論およびコード生成:同時実行数 2 の場合、TTFT が 1.3 秒で 37 トークン/秒のスループットが得られ、ユーザーエクスペリエンスとコストのバランスが最適化されます。よりコスト効率の高い運用を実現するには、同時実行数 4 をご採用ください。
知識ベース型対話検索、マルチラウンド対話、および長文書処理:同時実行数 1 の場合、TTFT は約 5 秒に達します。これは本番ワークロードには不適切ですが、概念実証(POC)環境では利用可能です。
テスト環境のセットアップ
本セクションでは、ENS インスタンスの作成、ディスクの初期化、推論環境のインストール、およびベンチマークの実行手順について説明します。手順はデュアル GPU(48 GB × 2)構成に基づいて記述されています。
前提条件
ENS へのアクセス権限を持つ Alibaba Cloud アカウント
Linux コマンドライン操作に関する知識
インスタンスへの接続に使用する SSH クライアント
ステップ 1:ENS インスタンスの作成
ENS コンソールまたは API 呼び出しによりインスタンスを作成します。
オプション A:ENS コンソールを使用する
ENS コンソール にログインします。
左側ナビゲーションウィンドウで、リソースとイメージ > インスタンス を選択します。
インスタンス ページで、インスタンスの作成 をクリックします。詳細については、「インスタンスの作成」をご参照ください。
以下の設定でインスタンスを構成します。
ステップ パラメーター 推奨値 基本構成 課金方法 サブスクリプション インスタンスタイプ x86 コンピューティング インスタンス仕様 NVIDIA 48GB × 2。詳細な仕様については、カスタマーマネージャーまでお問い合わせください。 イメージ Ubuntu、ubuntu_22_04_x64_20G_alibase_20240926 ネットワークおよびストレージ ネットワーク 自社構築ネットワーク システムディスク Ultra Disk、80 GB 以上 データディスク Ultra Disk、1 TB 以上 システム設定 パスワードの設定 カスタムキーまたはキーペア 右下隅の 注文の確認 をクリックし、支払いを完了します。
支払い後、ページは ENS コンソールにリダイレクトされます。インスタンスのステータスが 実行中 に変更された時点で、インスタンスの準備が完了します。
オプション B:RunInstances API を呼び出す
OpenAPI ポータル で RunInstances 操作を呼び出します。以下は参考となる JSON パラメーターです。
{
"InstanceType": "ens.gnxxxx", // インスタンスタイプ
"InstanceChargeType": "PrePaid",
"ImageId": "ubuntu_22_04_x64_20G_alibase_20240926",
"ScheduleAreaLevel": "Region",
"EnsRegionId": "cn-your-ens-region", // エッジノード
"Password": "<YOURPASSWORD>", // パスワード
"InternetChargeType": "95BandwidthByMonth",
"SystemDisk": {
"Size": 80,
"Category": "cloud_efficiency"
},
"DataDisk": [
{
"Category": "cloud_efficiency",
"Size": 1024
}
],
"InternetMaxBandwidthOut": 5000,
"Amount": 1,
"NetWorkId": "n-xxxxxxxxxxxxxxx",
"VSwitchId": "vsw-xxxxxxxxxxxxxxx",
"InstanceName": "test",
"HostName": "test",
"PublicIpIdentification": true,
"InstanceChargeStrategy": "instance" // インスタンス単位での課金
}ステップ 2:インスタンスへのログインおよびディスクの初期化
インスタンスへのログイン
詳細については、「インスタンスへの接続」をご参照ください。
ルートパーティションの拡張
インスタンスの作成またはサイズ変更後に、再起動せずにオンラインでルートパーティションを拡張できます。
# クラウド環境ツールキットをインストールします。
sudo apt-get update
sudo apt-get install -y cloud-guest-utils
# GPT パーティショニングツール sgdisk が存在することを確認します。
type sgdisk || sudo apt-get install -y gdisk
# 物理パーティションを拡張します。
sudo LC_ALL=en_US.UTF-8 growpart /dev/vda 3
# ファイルシステムをリサイズします。
sudo resize2fs /dev/vda3
# 結果を確認します。
df -h
データディスクのマウント
データディスクをフォーマットしてマウントします。コマンドはご利用の環境に応じて調整してください。
# 新しいディスクを特定します。
lsblk
# パーティションを分割せずにディスクをフォーマットします。
sudo mkfs -t ext4 /dev/vdb
# マウント設定を行います。
sudo mkdir /data
echo "UUID=$(sudo blkid -s UUID -o value /dev/vdb) /data ext4 defaults,nofail 0 0" | sudo tee -a /etc/fstab
# マウントを確認します。
sudo mount -a
df -hT /data
# 権限を変更します。
sudo chown $USER:$USER /data
このインスタンスからイメージを作成する場合は、イメージ作成前に ext4 defaults 0 0 行を /etc/fstab から削除してください。削除しない場合、そのイメージから作成されたインスタンスは起動に失敗します。
ステップ 3:vLLM 推論環境のインストール
CUDA のインストール
詳細については、「CUDA Toolkit 12.4 ダウンロード」をご参照ください。
# CUDA Toolkit をダウンロードします。
wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_570.124.06_linux.run
chmod +x cuda_12.4.0_570.124.06_linux.run
# インストーラーを実行します。このステップには数分かかり、インタラクティブな入力が必要です。
sudo sh cuda_12.4.0_570.124.06_linux.run
# 環境変数を ~/.bashrc に追加します。
export PATH="$PATH:/usr/local/cuda-12.8/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-12.8/lib64"
source ~/.bashrc
# インストールを確認します。
nvcc -V
nvidia-smiインストーラーは CUDA 12.4 をダウンロードしますが、環境変数のパスには cuda-12.8 が記載されています。これはソース構成を反映したものです。インストールディレクトリが異なる場合は、パスを適宜調整してください。
補助ソフトウェアのインストール(任意)
uv は Python 仮想環境および依存関係管理ツールであり、複数のモデルを実行するクラスターで有用です。詳細については、「uv のインストール」をご参照ください。
# uv をインストールします。デフォルトでは、uv は ~/.local/bin/ にインストールされます。
curl -LsSf https://astral.sh/uv/install.sh | sh
# ~/.bashrc に uv を PATH に追加します。
export PATH="$PATH:~/.local/bin"
source ~/.bashrc
# 仮想環境を作成します。
uv venv myenv --python 3.12 --seed
source myenv/bin/activate仮想環境を有効化した後に CUDA の環境変数が無効になる場合(例: nvcc や nvidia-smi が見つからない)、アクティベーションスクリプトに CUDA のパスを追加してください:
# myenv/bin/activate を編集し、既存の export PATH 文の後に以下の行を追加します:
export PATH="$PATH:/usr/local/cuda-12.8/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-12.8/lib64"必要なパッケージをインストールします:
# vLLM および ModelScope をインストールします。
uv pip install vllm==0.7.2
uv pip install modelscope
# GPU モニタリングツールをインストールします(任意)。nvidia-smi を使用することもできます。
uv pip install nvitopQwQ-32B モデルおよびベンチマークスクリプトのダウンロード
# システムディスクの空き容量不足を回避するため、モデルを /data にダウンロードします。
mkdir -p /data/Qwen/QwQ-32B
cd /data/Qwen/QwQ-32B
modelscope download --model Qwen/QwQ-32B --local_dir .
# (任意)データセットをダウンロードします。
wget https://www.modelscope.cn/datasets/gliang1001/ShareGPT_V3_unfiltered_cleaned_split/resolve/master/ShareGPT_V3_unfiltered_cleaned_split.json
# git が未インストールの場合はインストールします。
apt update
apt install git -y
# ベンチマークスクリプト用に vLLM リポジトリをクローンします。
git clone https://github.com/vllm-project/vllm.gitステップ 4:ベンチマークの実行
vLLM サーバーの起動
vllm serve /data/Qwen/QwQ-32B/ \
--host 127.0.0.1 \
--port 8080 \
--tensor-parallel-size 2 \
--trust-remote-code \
--served-model-name qw \
--gpu-memory-utilization 0.95 \
--enforce-eager \
--max-num-batched-tokens 8192 \
--max-model-len 8192 \
--enable-prefix-cachingベンチマークの実行
python3 ./vllm/benchmarks/benchmark_serving.py \
--backend vllm \
--served-model-name qw \
--model /data/Qwen/QwQ-32B \
--dataset-name random \
--random-input 1024 \
--random-output 4096 \
--random-range-ratio 1 \
--max-concurrency 4 \
--num-prompts 10 \
--host 127.0.0.1 \
--port 8080 \
--save-result \
--result-dir /data/logs/ \
--result-filename QwQ-32B-4-1-4.log結果の確認
以下の画像は、ベンチマーク出力の例を示しています。
