5分でできる！VLLMを使ったDeepSeek-R1-Distill-Qwen-32B-Japaneseのローカル環境構築



### はじめに
**VLLM**は、大規模言語モデル（LLM）を高速かつ効率的に動作させるための軽量なサーバーです。本記事では、**cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese**という日本語に特化した高性能な言語モデルを、ローカルPCでVLLMを使って簡単に起動する方法を解説します。手順に従えば、わずか5分でモデルを動作させることが可能です。

---

## 目次
1. [環境準備](#環境準備)
   - [必要なツール](#必要なツール)
   - [仮想環境の作成](#仮想環境の作成)
   - [VLLMと依存ライブラリのインストール](#vllmと依存ライブラリのインストール)
2. [モデルのダウンロード](#モデルのダウンロード)
   - [Hugging Face CLIのインストール](#hugging-face-cliのインストール)
   - [DeepSeek-R1-Distill-Qwen-32B-Japaneseのダウンロード](#deepseek-r1-distill-qwen-32b-japaneseのダウンロード)
3. [モデルの起動](#モデルの起動)
   - [起動コマンド](#起動コマンド)
   - [起動確認](#起動確認)
4. [モデルの検証](#モデルの検証)
   - [APIリクエストの送信](#apiリクエストの送信)
   - [サンプル出力](#サンプル出力)
5. [注意事項](#注意事項)
6. [参考リンク](#参考リンク)

---

## 環境準備

### 必要なツール
以下のツールを準備してください：
- **conda**：Python仮想環境の管理に使用します。
- **pip**：Pythonパッケージのインストールに使用します。
- **VLLM**：LLMを高速に動作させるためのサーバーです。
- **flash-attn**：モデルの推論速度を向上させるためのライブラリです。

### 仮想環境の作成
まず、Python 3.11の仮想環境を作成し、アクティベートします。
```bash
conda create -n vllm_v0.7.1 python=3.11 -y
conda activate vllm_v0.7.1
```

### VLLMと依存ライブラリのインストール
以下のコマンドで、VLLMと`flash-attn`をインストールします。
```bash
pip install vllm
pip install flash-attn --no-build-isolation
```

---

## モデルのダウンロード

### Hugging Face CLIのインストール
モデルをダウンロードするために、Hugging Face CLIをインストールします。
```bash
pip install "huggingface_hub[hf_transfer]"
```

### DeepSeek-R1-Distill-Qwen-32B-Japaneseのダウンロード
以下のコマンドで、**cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese**をダウンロードします。
```bash
HF_HUB_ENABLE_HF_TRANSFER=1 \
huggingface-cli download cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese
```

---

## モデルの起動

### 起動コマンド
以下のコマンドでモデルを起動します。  
（`CUDA_VISIBLE_DEVICES`で使用するGPUを指定し、`--tensor-parallel-size`でGPUの数を指定します。）
```bash
CUDA_VISIBLE_DEVICES=3,1,0,2 \
VLLM_USE_V1=1 \
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese \
--trust-remote-code --served-model-name gpt-4 \
--gpu-memory-utilization 0.98 --tensor-parallel-size 4 \
--port 8000 --max-model-len 65536
```

### 起動確認
起動に成功すると、以下のメッセージが表示されます。
```
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
```

---

## モデルの検証

### APIリクエストの送信
以下のコマンドで、起動したモデルにAPIリクエストを送信し、動作を確認します。
```bash
invoke_url='http://localhost:8000/v1/chat/completions'

authorization_header='Authorization: Bearer sk-dummy'
accept_header='Accept: application/json'
content_type_header='Content-Type: application/json'

data=$'{
  "messages": [
    {
      "role": "user",
      "content": "9.11と9.8、どちらが大きいですか？"
    }
  ],
  "stream": false,
  "model": "gpt-4",
  "max_tokens": 4096,
  "presence_penalty": 0,
  "frequency_penalty": 0,
  "top_p": 0.7,
  "temperature": 0.6
}'

response=$(curl --silent -i -w "\n%{http_code}" --request POST \
  --url "$invoke_url" \
  --header "$authorization_header" \
  --header "$accept_header" \
  --header "$content_type_header" \
  --data "$data"
)

echo "$response"
```

### サンプル出力
以下のようなレスポンスが返ってきます。
```json
<think>
まず、ユーザーが「9.11と9.8、どちらが大きいですか？」と質問しています。これは単純な数値比較のようですが、文脈によって解釈が異なる可能性があります。例えば、日付としての解釈か、数値の大小比較かを判断する必要があります。

まず、日付としての解釈を考えます。9月11日と9月8日を比較すると、日付の大小は通常、月と日で比較します。9月11日は9月8日より後の日付なので、日付としては9月11日の方が大きいと言えます。しかし、ユーザーが数値の大小を尋ねている可能性もあります。

次に、数値の大小比較として考えます。9.11と9.8を小数点以下の桁数で揃える必要があります。9.11は9.110、9.8は9.800とすると、小数点以下の桁数を揃えることで比較しやすくなります。この場合、9.800の方が9.110よりも大きいため、数値としては9.8の方が大きいです。

ただし、ユーザーが日付を指しているのか数値を指しているのかを明確にする必要があります。日本語の文脈では、日付を表す場合、月と日を「9月11日」と「9月8日」と表記することが一般的です。一方、数値の場合は「9.11」と「9.8」と表記されます。しかし、ユーザーの質問が「9.11と9.8」と書かれているため、数値の比較を想定している可能性が高いです。

さらに、ユーザーが過去にCyberAgent株式会社に関する詳細な分析を求めていたことを考慮すると、今回の質問は単なる数値比較ではなく、何か別の意図があるかもしれません。例えば、9.11を9月11日事件と解釈し、9.8を別の出来事と比較している可能性もあります。しかし、一般的な解釈としては数値の大小比較が適切でしょう。

結論として、数値の大小比較であれば9.8の方が大きいため、そのように回答します。ただし、日付としての解釈も考慮し、両方の可能性を説明した方が親切かもしれません。
</think>

**答え：数値としての比較では「9.8」が大きいです。**

### 詳細な解説：
1. **数値の大小比較**  
   - 9.8 は 9.11 より **0.69** 大きいです。  
   - 小数点以下を揃えると、  
     `9.800`（9.8） vs `9.110`（9.11）  
     → **9.800 > 9.110** が成立します。

2. **日付としての解釈**  
   - 「9.11」を「9月11日」、「9.8」を「9月8日」と解釈すると、  
     **9月11日（9/11）** が **9月8日（9/8）** より **3日後** に来ます。  
     → **日付としては9.11の方が「大きい」** と言えます。

3. **歴史的文脈**  
   - 「9.11」を **2001年のアメリカ同時多発テロ事件** と解釈すると、  
     9.8 は一般的な日付や数値の意味を持たず、比較対象になりません。

---

### 結論：
- **数値の大小** → **9.8 > 9.11**  
- **日付の大小** → **9/11 > 9/8**  
- **歴史的文脈** → 9.11は重大な事件を指すため、比較対象外です。

質問の意図に応じて、解釈が変わります！
```

---

## 注意事項

- **GPUメモリの設定**：`--gpu-memory-utilization 0.98`はGPUメモリの利用率を設定します。環境に応じて調整してください。
- **テンソル並列処理**：`--tensor-parallel-size 4`は使用するGPUの数に応じて変更します。
- **ポート番号**：`--port 8000`はAPIのポート番号です。他のアプリケーションと競合する場合は変更してください。

---

## 参考リンク
- [VLLM公式ドキュメント](https://vllm.readthedocs.io/)
- [DeepSeek-R1-Distill-Qwen-32B-Japanese（Hugging Face）](https://huggingface.co/cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese)

---

この手順に従えば、ローカルPCで**cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese**を簡単に動作させることができます。ぜひお試しください！