高火力 DOK と AI エージェント「Hermes」で画像生成ベンチを回してみた(SDXL vs FLUX)

AI・高火力 , さくらのクラウド , ストレージとデータ # 高火力DOK

こんにちは、ネットアシスト運用チームのhaokiです。

今回はさくらインターネットのGPUコンテナサービス「高火力 DOK」で、OSSの画像生成モデル SDXL 1.0 と FLUX.1-dev のベンチマークを取ってみました。

ただし今回は普通にスクリプトを書いて回すのではなく、ローカルで動かしているAIエージェント「Hermes」に自然言語で指示して、APIのつなぎこみからトラブル対応まで任せる、という形でやってみました。その顛末と実測結果を紹介します。

高火力 DOKとは

高火力 DOKは、Dockerイメージとコマンドを渡すと、GPU付きの環境でタスクとして実行してくれるマネージドなコンテナ型GPUクラウドです。実行が終わればコンテナは破棄されるので、GPUサーバーを借りっぱなしにする必要がありません。

今回使った範囲での特徴をまとめるとこんな感じです。

  • GPUプランは V100(32GB)と H100(80GB)。今回は H100 に統一しました(FLUX.1-dev は V100 だと VRAM 不足で動きません。V100 プランは 2027 年 2 月で提供終了予定でもあります)
  • 成果物はコンテナ終了時に /opt/artifact 配下が tar.gz で回収され、後から API でダウンロードできます
  • コンテナ内ディスクは実測で 930GB ほど空きがあり、57GB の FLUX モデルを展開しても余裕でした

料金が安い

個人的に一番推したいのがここです。料金は秒単位の従量課金で、初期費用はかかりません。

プラン単価1時間あたり最低利用時間
V100(32GB)0.016円/秒57.6円1秒
H100(80GB)0.28円/秒1,008円60秒

H100 が 1 時間 1,000 円ちょっと、と聞くとピンとこないかもしれませんが、DOK はタスクが終わればそこで課金も終わりです。今回の FLUX 成功タスクは実行 641 秒だったので、1 回あたり約 180 円。後述するように今回は 6 回失敗しているのですが、その失敗分を全部足しても 860 円程度でした。H100 で試行錯誤し放題でこの金額なら、かなり気軽に使えると思います。

しかも新規利用だと 3,000 円分の無料枠が付いてくるので、今回程度の検証なら実質タダで一通り試せてしまいます。

とはいえ、API直叩きはハードルが高い

高火力 DOK は API ですべて操作できます。裏を返すと、自動化しようとすると API を叩くコードを書く必要があるということです。今回必要だったものを並べると、

  • タスク作成 API への認証(トークン + シークレットの Basic 認証)
  • モデル置き場としてのオブジェクトストレージと、署名付き URL の発行(boto3)
  • コンテナに渡す command の組み立て。これが曲者で、["/bin/sh", "-c", cmd] として渡るため、シェルのクオート問題と正面から向き合うことになります
  • 失敗時のログ回収と原因調査

一つひとつは難しくないのですが、組み合わせると試行錯誤の回数がかさみます。ベンチを取りたいだけなのに、その前の配管工事が長い、というのが正直なところです。

AIエージェント「Hermes」に丸投げしてみた

そこで今回は、この配管工事をローカルの AI エージェント Hermes に任せました。人間がやったのは、おおよそ次のような指示だけです。

高火力 DOK で SDXL と FLUX のベンチを取って。お題は「猫とさくら」、5 シードで、速度と品質を比較して

Hermes はここから、ランチャースクリプトの作成、オブジェクトストレージへのモデル配置、DOK API へのタスク投入、結果の回収とレポート作成までを自律的に進めます。

6回失敗して、6回自分で直した

正直に書くと、最初から成功したわけではありません。FLUX のタスクは 6 回連続で失敗しました。ただ面白いのは、その原因調査と修正もエージェントが自分で回した点です。失敗の時系列がこちらです。

#結果exit原因
1error1V100 指定 / クオートバグ(初期)
2error1PROMPT のシングルクォートが sh と衝突
3error2/bin/sh -c '...' を二重にネストして即死
4error127ubuntu 最小イメージに wget がなかった
5error1生成スクリプトの torch import 順序バグ(NameError)
6done0wget 追加 + スクリプト修正で成功

タスク投入 → 失敗 → ログ回収 → 原因特定 → コード修正 → 再投入、というループを人間の介入なしに回してくれます。こちらは進捗を眺めていただけでした。

これを成立させるコツが一つあります。コマンド末尾に > /opt/artifact/run.log 2>&1 を付けて、失敗しても必ずログを成果物として残すことです。DOK は成果物を tar.gz で回収できるので、失敗時も run.log さえあれば NameError などの正確な原因まで辿れます。これがないと exit code しか手がかりがなく、ループが回りません。

ハマりどころ:sh のクオート問題

失敗の大半はシェルのクオート問題でした。DOK に限らず「コンテナに sh -c でコマンドを渡す」あらゆる場面で踏む罠なので、正解パターンを載せておきます。

# OK: シングルクォートで囲む(中のダブルクォートが Python にそのまま渡る)
python3 -c 'import zipfile;zipfile.ZipFile("/m.zip").extractall("/model")'

# NG: sh のダブルクォート内に生の " を入れるとクオートが崩壊する
python3 -c "import zipfile;zipfile.ZipFile("/m.zip").extractall("/model")"

また、command はすでに ["/bin/sh", "-c", cmd] として実行されるので、cmd の中にさらに /bin/sh -c '...' を書いてはいけません(二重ネストで即死します)。ubuntu:22.04 の最小イメージには wget も python3 も入っていないので、冒頭の apt-get install -y python3 python3-pip wget もお忘れなく。

ベンチマーク結果:SDXL vs FLUX.1-dev

環境は H100(h100-80gb)に統一、解像度は 1024×1024 です。お題は 2 つ用意しました。

  1. 猫とさくら(5 シード): a small cat sitting under cherry blossom (sakura) trees, soft pink petals falling, sunlight through branches, photorealistic, high detail
  2. 女性ポートレート(10 シード): a beautiful woman portrait, detailed face, studio lighting, photorealistic, 35mm lens

お題A:猫とさくら(5シード)

モデルロード(秒)1枚平均(秒)プロンプト遵守steps / dtype
SDXL 1.05.762.27○ 猫+桜30 / float16
FLUX.1-dev9.516.73○ 猫+桜(映画的)28 / bfloat16

お題B:女性ポートレート(10シード)

モデルロード(秒)1枚平均(秒)プロンプト遵守steps / dtype
SDXL 1.04.592.1530 / float16
FLUX.1-dev8.486.5628 / bfloat16

傾向まとめ

  • 速度は SDXL が優勢。モデルが軽い分ロードも生成も速く、1 枚 2 秒強で安定していました
  • FLUX は 2〜3 倍遅いものの、質感と照明の映画的な仕上がりは一段上。品質重視なら FLUX です
  • 参考として、SDXL を V100 で回した旧実測はロード 12.38 秒 / 1 枚 9.23 秒でした。H100 移行で生成が約 4 倍速くなっています。V100 の提供終了も踏まえると、今から始めるなら H100 で良いと思います

実際の生成画像(お題:猫とさくら)

数字だけではピンとこないので、実際に生成された画像を並べます。シードだけ変えた 5 枚ずつです。

SDXL 1.0(1枚平均 2.27秒)

SDXLで生成した猫と桜の画像 seed1
seed 1
SDXLで生成した猫と桜の画像 seed2
seed 2
SDXLで生成した猫と桜の画像 seed3
seed 3
SDXLで生成した猫と桜の画像 seed4
seed 4
SDXLで生成した猫と桜の画像 seed5
seed 5

5 シードすべてで「猫 + 桜」を安定して生成。2 秒強でこの画が出てくるなら十分実用的です。

FLUX.1-dev(1枚平均 6.73秒)

FLUX.1-devで生成した猫と桜の画像 seed1
seed 1
FLUX.1-devで生成した猫と桜の画像 seed2
seed 2
FLUX.1-devで生成した猫と桜の画像 seed3
seed 3
FLUX.1-devで生成した猫と桜の画像 seed4
seed 4
FLUX.1-devで生成した猫と桜の画像 seed5
seed 5

こちらも 5/5 で遵守。逆光気味の柔らかい光の回り方や被写界深度の表現など、映画のワンカットのような仕上がりが FLUX の持ち味です。

まとめ

  • 高火力 DOK は「タスクを投げたら GPU で実行して成果物を返してくれる」シンプルなサービスで、ベンチや一括生成のようなバッチ型ワークロードと相性が良いです
  • H100 が秒課金で使えて、今回のベンチは失敗 6 回分を含めても 1,000 円未満。3,000 円の無料枠もあるので試すハードルはかなり低いです
  • API のつなぎこみや試行錯誤は AI エージェントに丸投げすると、失敗 → ログ解析 → 修正 → 再実行のループまで自動で回してくれました
  • モデルの傾向は「速さの SDXL、画の FLUX」でした

今回の構築でハマりやすいポイントをまとめると:

  • commandsh -c 経由で実行される。中でさらに sh -c をネストしない
  • zip 展開などの Python ワンライナーはシングルクォートで囲む
  • ubuntu 最小イメージには wget / python3 がない。apt で最初に入れる
  • コマンド末尾の > /opt/artifact/run.log 2>&1 は必須。失敗調査が段違いに楽になります

なお、今回はモデルをオブジェクトストレージから毎回ダウンロードする方式にしたため、コールドスタートに数分〜十数分かかっています。モデルをコンテナイメージに焼き込めばここは消せるはずなので、続編で試してみたいところです。ランチャーは --seeds 1..1000 と指定するだけで 1 タスク 1,000 枚生成にも対応しているので、大量生成デモも続編候補です。

後片付けも忘れずに。オブジェクトストレージに置いた flux.zip(約 58GB)と sdxl.zip(35GB)は使い終わったら削除してストレージ課金を止め、DOK のトークンも失効させておきましょう。

さくらのクラウドを使ったサーバーの監視・運用体制の整備についてご相談がある方は、ぜひネットアシストにご連絡ください。

それではまた!

参考リンク

この記事を書いた人

haoki

ネットアシスト運用チームのhaokiです。 【取得資格】 AWS Certified Solutions Architect - Associate AWS Certified CloudOps Engineer - Associate LPIC level2 Cisco Certified Network Associate Routing and Switching さくらのクラウド検定