1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【読めばできる】画像生成LLM Krea2をたった数円で動かす

1
Posted at

概要

こんにちは、ふきです!
この記事では、2026年に公開されたオープンモデル Krea 2(Krea-2-Turbo) を、GPUを持っていなくても 1枚5円以下 で動かす方法を解説します。

今回は、そのまま使える公開Dockerイメージ(GHCR) と、80GBディスクに収まる軽量版モデル を共有するので、
めんどくさい事前準備をSkipしつつ、環境構築 → 画像生成が完結します。

この記事を読むと、以下ができるようになります。

  • Krea 2 がどんなモデルか分かる
  • RunPod Serverless で画像生成モデルを動かす流れが分かる
  • 公開イメージを使って、自分のEndpointから画像を生成できる

本記事はその画像生成・実践版です。RunPod Serverless そのものの基礎(アカウント作成・Model Cache・API の叩き方)は、入門記事で詳しく解説しています。RunPodが初めての方は、こちらからどうぞ。

https://qiita.com/fky/items/a9ec7c5eb5b6dd86ecc0


1. Krea 2とは

Krea 2 は、12B(120億パラメータ)の Diffusion Transformer ベースのT2Iモデルです。

ポイントは大きく3つ。

  • オープンウェイトで公開(Hugging Face から誰でもDL可能)
  • Turbo(蒸留)版がある … Krea-2-Turbo は たった8ステップ で生成できる
  • diffusers 対応(Krea2Pipeline)

品質の高い最新モデルで、安く画像生成できるのが今回のKrea2です。

Krea 2 には高品質な Krea-2-Raw(28ステップ)と、高速な Krea-2-Turbo(8ステップ)があります。コスト重視なので、本記事は Turbo を使います。


2. RunPod Serverlessで動かす

ちょっとだけローカルLLMを試すためだけに自前で 80GB GPU を買う/借りっぱなしにするのは、個人にはつらいです。そこで RunPod の Serverless を使います。

  • 必要なときだけGPUが起動し、終わると自動で止まる(AWS Lambda の GPU 版みたいなもの)
  • 秒単位課金なので、画像を数枚作るだけなら数円
  • Model Cache 機能で、Hugging Face のモデルを課金時間外に事前DLしてくれる

特に Model Cache がほかのサービスにはないメリットです。これのおかげで、重い36GBのモデルをDockerイメージに焼きこむ必要がなく、イメージは軽量なまま、起動時にキャッシュから読み込めます。

生成コスト

RunPod Serverless の H100 80GB はだいたい 1秒あたり約0.2円。

Turbo は 8ステップなので、1024×1024 の1枚が 8秒で生成できます。つまり、
ウォーム状態なら 1枚あたり 1.5円前後ぐらいです。

注意:上の「1枚1.5円」はワーカーが温まっている(ウォーム)状態の話です。最初の1リクエストは、モデル(約36GB)をVRAMにロードするコールドスタートが走るため、別途数十秒ぶんの課金(数円)が乗ります。


3. セットアップ 〜 画像生成まで

ここからが本番です。やることは3ステップだけ。

  1. 公開イメージを指定して Endpoint を作る
  2. Model Cache に軽量版モデル fkyyy/Krea-2-Turbo-slim を指定する
  3. API を叩いて画像を受け取る(base64)

3-0. 事前準備(RunPodアカウント & APIキー)

RunPod のアカウントを作り、APIキーを発行しておきます(無料枠はなく、最初に $10 チャージが必要です)。

下記の招待リンクから登録すると、お互いに $5 ぶんのクレジットがもらえます。
自分もうれしいのでお願いします!

招待リンク

Settings → API Keys → Create API Key

発行したキーは 後で使うので控えておきます。

3-1. 配布している公開イメージ

今回のビルド済みの公開イメージ(GHCR) がこちらです。Endpoint作成時にこれを指定するだけでOKです。

ghcr.io/fky1714/krea:latest

3-2. 使うモデル(軽量版を配布しています)

Model Cache に指定するのは、オリジナルではなく私が用意した軽量版です。

fkyyy/Krea-2-Turbo-slim

なぜ軽量版なのか? オリジナルの krea/Krea-2-Turbo は、単一ファイル版とdiffusers分割版が二重に入っていてリポジトリ全体で約62GBあります。これを Model Cache でDLすると、80GBのディスクに(Dockerイメージと合わせて)収まらず、ワーカーが image ready, model pending download のまま起動しない…という問題が起きます。

そこで、推論に使わない重複ファイル(turbo.safetensors 約26GB)を除いた軽量版(約36GB) を公開しています。中身の推論結果はオリジナルと同一で、80GBディスクに余裕で収まります。

3-3. Endpoint を作成する

RunPodコンソールから Serverless Endpoint を作ります。流れは入門記事と同じです。

Serverless → New Endpoint → Custom Deployment
 → Deploy from Docker registry or a template → イメージを指定

左メニューの Serverless → New Endpoint

Custom deployment を選択

Deploy from Docker registry or a template で、配布イメージを指定

ここに、先ほどの公開イメージを入力します。

ghcr.io/fky1714/krea:latest

少し下の Model に Hugging Face リポジトリを指定(=Model Cache)

Model フィールドに、次を入れるだけです。

fkyyy/Krea-2-Turbo-slim

環境変数に MODEL_NAME を指定(重要)

配布イメージの既定は krea/Krea-2-Turbo を読む設定になっているため、軽量版を使うにはワーカーにも同じリポジトリを教える必要があります。Endpoint の環境変数に次を追加してください。

MODEL_NAME = fkyyy/Krea-2-Turbo-slim

これを設定し忘れると、ワーカーがオリジナル(62GB)を読みに行き、model pending download で詰まります。Model フィールドと MODEL_NAME は必ず同じ fkyyy/Krea-2-Turbo-slim に揃えてください。

設定項目の例

  • GPU:H100 80GB
  • Max Workers:1
  • Active Workers:0
  • Idle Timeout:1秒

Krea 2 は 12B と大きいので、VRAM 80GB のGPUを選びます。Active Workers は常時課金なので 0、個人利用なら Idle Timeout は最小の1秒でOKです。

もっと安く・小さいGPUで動かしたい人へ
このワーカーは環境変数で挙動を変えられます(どれも任意。未設定でそのまま動きます)。

環境変数 効果
ENABLE_FP8=1 transformer を fp8 量子化し VRAM を約半分に
ENABLE_CPU_OFFLOAD=1 VRAMが足りないGPUで、CPUへ退避しながら動かす(遅いがVRAM節約)
OUTPUT_FORMAT=jpeg 返却画像をJPEGに(レスポンスが軽くなる)

まずは MODEL_NAME だけ設定して動かすのがおすすめです。

設定したら Deploy でEndpointを作成します。

作成直後、Model Cache が fkyyy/Krea-2-Turbo-slim(約36GB)をDLします。このDL中はワーカー課金は発生しません。オリジナル(62GB)より軽いぶんDLも短めですが、終わるまでは少し待ちます。たまにログを見ながら待ちましょう。

3-4. 画像を生成する(最初の1枚)

Endpoint ができると API URL が発行されます。リクエストは「最上位に input を持つJSON」が基本形。input の中身がワーカーへのパラメータです。

非同期実行(/run)でジョブを投げます。

curl -X POST \
  https://api.runpod.ai/v2/{ENDPOINT_ID}/run \
  -H "Authorization: Bearer {API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "prompt": "a cinematic photo of a red fox sitting in fresh snow, golden hour light",
      "width": 1024,
      "height": 1024,
      "steps": 8,
      "guidance_scale": 0.0,
      "seed": 42
    }
  }'

steps: 8 / guidance_scale: 0.0 は Turbo の推奨値です。指定しなくても同じ値がデフォルトで入ります。

すぐにジョブIDが返ります。

{ "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "status": "IN_QUEUE" }

この id で /status をポーリングして完了を待ちます。

curl https://api.runpod.ai/v2/{ENDPOINT_ID}/status/{JOB_ID} \
  -H "Authorization: Bearer {API_KEY}"

完了すると status が COMPLETED になり、output.images に base64 の画像(PNG) が配列で入ってきます。

{
  "status": "COMPLETED",
  "output": {
    "status": "completed",
    "images": ["iVBORw0KGgoAAAANSUhEUg...(base64)"],
    "meta": { "seed": 42, "steps": 8, "model": "krea-2-turbo-slim", "gpu": "NVIDIA H100 80GB HBM3" },
    "timing": { "inference_s": 4.2, "total_s": 4.3 }
  }
}

3-5. base64 をデコードして保存(Python)

ここまでをまとめた最小クライアントです。これを実行すれば out.png が手に入ります。

import base64
import time

import requests

EP  = "{ENDPOINT_ID}"
KEY = "{API_KEY}"
H   = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}

# 1. ジョブを投げる
jid = requests.post(
    f"https://api.runpod.ai/v2/{EP}/run",
    headers=H,
    json={"input": {
        "prompt": "a cinematic photo of a red fox sitting in fresh snow, golden hour light",
        "steps": 8,
        "guidance_scale": 0.0,
        "seed": 42,
    }},
).json()["id"]

# 2. 完了までポーリング(コールドスタートを考慮して長めに待つ)
while True:
    s = requests.get(f"https://api.runpod.ai/v2/{EP}/status/{jid}", headers=H).json()
    if s["status"] in ("COMPLETED", "FAILED", "CANCELLED", "TIMED_OUT"):
        break
    print("status:", s["status"])
    time.sleep(3)

# 3. base64 をデコードして保存
out = s["output"]
b64 = out["images"][0]                 # 先頭の画像
with open("out.png", "wb") as f:
    f.write(base64.b64decode(b64))
print("saved -> out.png  meta:", out.get("meta"))

実行すると、こんな画像が返ってきます(プロンプト:雪の中のキツネ)。

![生成サンプル:雪の中のキツネ]
image-1783601400903.jpg

1枚以上まとめて作りたいときは、batch を使うと1回のGPU処理でまとめて生成できます(お得)。

{ "input": {
    "batch": [
      { "prompt": "a fox in the snow" },
      { "prompt": "a cyberpunk night market in the rain" }
    ],
    "steps": 8, "guidance_scale": 0.0
} }

結果は output.results[i](入力順)に、それぞれ images が入って返ります。


4. コストの実際

最後に、気になるコストを整理します(H100 80GB ≒ 0.2円/秒 で概算)。

タイミング 内容 ざっくり課金
初回(コールド) モデル約36GBをVRAMへロード(数十秒)+生成 数円
2回目以降(ウォーム) 生成のみ(8ステップ・数秒) 1枚 1.5円前後

つまり「最初だけ数円、あとは1枚数円以下」。Idle Timeout を1秒にしておけば、使っていない間は課金されません。

コールドスタートを減らすコツ:連続で何枚も作りたいときは、Idle Timeout を少し長め(数十秒)にすると、ワーカーが温まったまま使い回せて、トータルで安くなることがあります。とはいえ普段は1秒で十分です。


まとめ

  • Krea 2(Turbo) は、8ステップで速く生成できる高品質オープンモデル
  • RunPod Serverless + Model Cache で、GPUを持たずに自分のAPI化できる
  • 今回配布した 公開イメージ ghcr.io/fky1714/krea:latest + 軽量版モデル fkyyy/Krea-2-Turbo-slim を指定するだけでデプロイ完了
  • コストは 最初だけ数円・あとは1枚数円以下

「最新の画像生成モデルを、安く、自分のものとして触る」体験、ぜひ試してみてください。

RunPod の基礎やコスト最適化については、こちらもどうぞ。

最後まで読んでいただき、ありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?