Skip to content

ローカルLLMのデプロイ例 { モデル : Qwen3-Coder, 推論環境 : vLLM, CLI : qwen-code, ハード : H100} #39

@meme-dayo

Description

@meme-dayo

Step1 モデルのダウンロード

🏆Qwen3-Coder-480B-A35B-Instruct GitHub

※ FP8版なら最低限必要なVRAM(≒GPU数)が半減できて嬉しい(約960GB→480GB)

Note

「"Give Me BF16 or Give Me Death"? Accuracy-Performance Trade-Offs in LLM Quantization」
https://arxiv.org/abs/2411.02355 等を見る限り、推論において BF16→FP8 は、ほぼ無劣化
ゆえにベンチマークで比較するまでもないのだろう

  • Qwen3-Coder-480B-A35B-Instruct-FP8を採用
  • 前もって HuggingFaceからスパコンにダウンロードした方が良い。
スパコンへの直接ダウンロード方法

事前準備

Pythonモジュール

pip install -U "huggingface_hub[cli]"
pip install -U hf_transfer

Hugging Face CLIのログイン

hf auth login

hfトークン設定後の確認

hf auth whoami

以下のbashファイルを編集してhf_downloader.shとして保存

DEST=/work/YOUR_PROJECT_ID/YOUR_USER_ID/models/Qwen3-Coder-480B-A35B-Instruct-FP8
mkdir -p "$DEST"

# ダウンロード
hf download Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 --local-dir "$DEST"

実行許可

chmod +x hf_downloader.sh
hf_downloader.sh

Caution

vLLMデフォルトのHFキャッシュは~/.cache/huggingface/だが約480GBのLLMの重みを/homeには置けないので、 /work以下のあるフォルダに
HuggingFaceから全ファイルをダウンロードすべき
例:/work/PROJECT_ID/USER_ID/Qwen3-Coder-480B-A35B-Instruct-FP8/

さらにvllm serveの引数--download-dirをセット(後述)
vLLM args一覧


Step2 vLLMでのサービング

1ノードであればPython経由でuv pip install でvllmのPre-build wheelsを使えて楽 詳細

uv venv --python 3.12 --seed
source .venv/bin/activate

GH200でなければ下記は--torch-backend=autoで構わない

uv pip install vllm --torch-backend=cu126

(or UV_TORCH_BACKEND=cu126)

https://github.com/vllm-project/vllm/releases/tag/v0.10.0 にあるCUDA12.6のPre-build wheelを使えそう

Install vLLM with a specific CUDA version (e.g., 11.8 or 12.6).

export VLLM_VERSION=$(curl -s https://api.github.com/repos/vllm-project/vllm/releases/latest | jq -r .tag_name | sed 's/^v//')
export CUDA_VERSION=126
uv pip install https://github.com/vllm-project/vllm/releases/download/v${VLLM_VERSION}/vllm-${VLLM_VERSION}+cu${CUDA_VERSION}-cp38-abi3-manylinux1_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu${CUDA_VERSION}

Warning

不老のマルチノード環境ではDockerイメージをsingularityに変換して使用したが
GH200(aarch64/Arm64)は、別のDockerコンテナが必要
latestのビルドが4ヶ月前なのでPre-build版は非推奨(Qwen3-Coder等の最新モデルには未対応)
https://docs.vllm.ai/en/stable/deployment/docker.html#building-for-arm64aarch64

  • 自分で最新版をBuildする

vLLMのマルチノード分散サービング

マルチノード分散の場合Rayクラスタの構築方法

上記のリンクにある./multi-node-serving.sh を Head nodeで実行後 各 Worker node でHead nodeの IPアドレスを渡して実行.

Head node

./multi-node-serving.sh leader --ray_port=6379 --ray_cluster_size=8 [<extra ray args>]  && \
python3 -m vllm.entrypoints.openai.api_server --port 8080 --model Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 --pipeline-parallel-size 8 --max-model-len 8000 --download-dir /work/PROJECT_ID/USER_ID/Qwen3-Coder-480B-A35B-Instruct-FP8

InfiniBand等高速なノード間通信があればTensor並列も有効

--tensor-parallel-size 8 

Worker nodes

./multi-node-serving.sh worker --ray_address=<HEAD_NODE_IP> --ray_port=6379 [<extra ray args>]
  • Miyabi-G向けのバッチスクリプト(自動でHead node起動時にHEAD_NODE_IPを取得しWorker起動の引数に渡す)

最低限必要な引数は以下(コンテキスト長 8000は控え目。256Kに近づけたい)

vllm serve Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --max-model-len 8000 \
  --download-dir /work/PROJECT_ID/USER_ID/Qwen3-Coder-480B-A35B-Instruct-FP8 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder

https://x.com/vllm_project/status/1947780382847603053
他の参考

Note

Miyabi-GのGH200は各ノード1GPUなのでTensor並列よりPipeline並列の方が良いかもしれない


Step3 Qwen Code CLIへの接続

vLLM自体がOpenAI互換なので、以下のように環境変数をセットした後

export OPENAI_API_KEY="dummy"
export OPENAI_BASE_URL="http://<ローカルサーバのIP>:8080/v1"
export OPENAI_MODEL="Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8"

以下のコマンドでQwen Code CLIを起動すれば良い

qwen

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions