RunPod で Qwen 3-4B を激安サーバーレスホスティング

# はじめに
こんにちは！ノベルワークスのザワッチ([@zawatti](https://x.com/zawattizawawa))です！

今回は、最近性能が良いと話題のQwen3シリーズの4BモデルをサーバーレスAPIとしてセルフホストして、フロントまで統合してしまってチャットできるインターフェースまで仕上げてみます。

# 背景
大手LLMプロバイダに頼らないと性能の良い AI モデルを低価格・低レイテンシで提供できないのかと思った矢先に、ローカルLLM「Qwen3」のリリースを見て、もしかしたら結構いい精度のLLMをセルフホストで動かすことができるのではないかと思ったのがきっかけです。

あと、Runpodも使ってみたかった。

:::note info
<strong>Runpodとは</strong>
RunPod は GPU サーバーレス実行環境を数クリックで用意でき、秒単位課金・ゼロスケールなど、“Lambda × GPU” 的な体験を実現できます。
:::

# サーバレス推論APIの構築
<strong>1. Runpodの新規登録＆クレジット追加</strong>

<h3>とりあえず、10ドル課金します。</h3>

<strong>2.ダッシュボードの「Serverless」からエンドポイントを作成</strong>
Serverlessエンドポイントは、HTTP/JSON で同期 (/runsync)・非同期 (/run) 推論を実行できるサービスです。

ストリーミングにも対応しているみたいです。

0→N 台まで自動スケールし、秒課金なので、使った分だけ使われる従量課金制になります。

LLM推論 API、画像生成、音声生成、音声認識など多岐にわたるユースケースに対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/e3d08c2e-b27c-4781-b83c-d21e8273d0df.png)

<strong>3.Qwen3-4bモデルを選択</strong>
テキストモデルを選択し、Hugging FaceのQwen3-4BのモデルIDを指定します。

https://huggingface.co/Qwen/Qwen3-4B

Hugging Faceに置いた自前の Fine-tuned モデルもドロップダウンで選択して即デプロイできます。

:::note info
Qwen 3-4B は Alibaba が 2025 年 4 月末に公開した Qwen 3 ファミリー（0.6B〜235B）の中で最小サイズの密結合モデルです。

4B パラメータながら 32 K トークンの長文対応と「思考モード／即答モード」のハイブリッド推論を備え、前世代 Qwen 2.5-72B Instruct と肩を並べる実力を示しています。

Qwen 3 は 6 種の Dense モデル（0.6B, 1.7B, 4B, 8B, 14B, 32B）と 2種の MoE モデル（30B-A3B, 235B-A22B）から構成され、全モデルが Apache-2.0 ライセンスで公開されています。
:::

Hugging Faceとのインタラクションがシームレスでめちゃくちゃいいですね。

<strong>4.Dockerイメージとその他もろもろの設定変更</strong>
デフォルトで作成したエンドポイントに使用されるDockerイメージは、Qwen3 4Bには対応していなかったので、最新の安定バージョンに変更します（2025/05/12現在）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/c535656b-cf70-41e6-853a-f282ce82143b.png)

「Manage」→ 「Edit Endpoint」に遷移すると、ワーカーに載せるGPUを選択することができ、24GBに設定変更します。

推論タイムアウト、アイドルタイムアウトも設定できます。

<strong>5.いったん推論させてみる </strong>


生成時間はサーバーレスなので、少し遅延があるが、10秒～20秒の間に収まるイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/591a86f0-5c72-4e74-82f0-a454659f633f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/e6d8e423-6af7-40ae-bcaf-71dae916accc.png)



# フロントエンドとの統合
ストリーミングを簡単に導入できるai-sdkが気になっていたので、チャットUIのベースに使います。

https://ai-sdk.dev/docs/ai-sdk-ui/chatbot

簡単な特徴を列挙します。

- リアルタイムストリーミング
AIプロバイダから届くチャンクを逐次 UI へ描画し、ユーザーが待たされない会話体験を実現する。

- 状態管理の自動化
フック(useChat)が messages / input / status / error を内包し、handleInputChange・handleSubmit だけでフォーム制御と API 呼び出しを完結できる。

apiルートには、RunpodのサーバーレスAPIを呼び出すコードを記述します。

https://docs.runpod.io/serverless/endpoints/send-requests

以下は、RunpodSDKを使用した、サーバーレスAPI呼び出しのサンプルコードになります。

``` javascript
import runpodSdk from 'runpod-sdk'; 

// Runpod API Key 管理画面から取得しておく
const RUNPOD_API_KEY = process.env.RUNPOD_API_KEY;
// エンドポイントID
const ENDPOINT_ID = process.env.RUNPOD_ENDPOINT_ID;

// RunPod SDK を初期化
const runpod = runpodSdk(RUNPOD_API_KEY);
const endpoint = runpod.endpoint(ENDPOINT_ID);

// /run リクエストボディを作成 (SDKの形式に合わせる)
const runRequestBody = {
  input: {
    messages: messages,
    sampling_params: {
      temperature: 0.7,
      max_tokens: 4098,
    },
    chat_template_kwargs: {
        enable_thinking: enableThinking, // 推論モード有効無効化設定
    },
  },
};

// 生成実行
const runResult = await endpoint.run(runRequestBody);

// 実行ID
const jobId = runResult.id;

// ストリーム
const sdkAsyncGenerator = endpoint.stream(jobId);
```

このサンプルコードをもとに、フロントエンドとの統合を進めていきます。

以下は、フロントエンドとAPIルートを統合し、実際にRunpodで構築したサーバーレスAPIにリクエストを投げて、返答された結果になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/d4fb7265-dbfb-4e4b-9266-3cd785768208.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/5a0a511b-8a3c-45e8-96b1-ce76b8d12d9e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/e654ea0f-95b3-4890-8a94-69d3893b0ba4.png)

#### 感じたこと：

- Qwenは国産モデルがないにもかかわらず、日本語もけっこう学習されてる感触

- 絵文字とか（笑）とか使っていて、やり取りが人懐っこく可愛い（笑）

- 推論モードをオフにすると言葉が崩れてしまうことがあったので、そこは不安材料。基本、推論モードはオンがよさそう。

- 気軽にチャットする相手とかなら、全然使えるレベル。知らぬ間にメンタルケアされちゃいそう。



# 気になるお値段
RTX4090(VRAM24GB)で、１秒間に0.046円とめちゃくちゃ安い。（１ドル148.56円とする）
ワーカー立ち上げのわちゃわちゃ時間＋推論時間で、チャットに30秒かかるとしても、0.138円でかなりお得です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/f9f32a7a-6e50-4560-8b09-3a7499399e05.png)


アクティブモードとフレックスモードという前者は、常時ワーカー立ち上げだが、遅延が少なく安定稼働(~30 % 割引が付く)、後者は、アイドリング時にコストはかからないが、遅延は必須だがオートスケール可能（デフォルトはこの設定）。

他にもいろいろなGPUを手軽に使えるみたいです。

https://docs.runpod.io/references/gpu-types

https://www.runpod.io/serverless-gpu

# おわりに
Qwen3-4BはLLMとして担保できる性能を持っていると思うので、このレベルのLLMをセルフホストかつ低価格で動かせるようになった技術の進歩にとても驚いています。

今回は、実行基盤をRunpodにしましたが、セキュリティ重視でプライベートネットワーク下で動かしたい場合や、より厳密なアクセス制限（RBACなど）をかけたい場合はAzureで動かすという選択肢もあります。

いずれにせよ、大手LLMプロバイダに頼ることなく、より低価格でより性能の良いAIモデルをセルフホストできる時代は来ているので、システムへの組み込みの幅が広がってとてもワクワクしますね！

<strong>参考：</strong>
- Azure Container Apps (GPU)
2025 年春に Serverless GPUs (A100/T4) が GA となり、同様に従量課金・自動スケールを提供。

https://techcommunity.microsoft.com/blog/appsonazureblog/announcing-ga-for-azure-container-apps-serverless-gpus/4394302