StableDiffusion.cppをサーバモードで使用

この記事は約8分で読めます。
スポンサーリンク

やりたいこと

StableDiffusion.cppをサーバモードで使用します。

利点とできないこと

まずサーバモードの利点とできないことをまとめるのでサーバモードを使用するかどうか検討してください。

利点

サーバモードで起動した場合、モデルがキャッシュされるので2回目以降の実行が早くなります。

HTMLを用意してHTMLからプロンプトなどを指定することができます。

できないこと

リクエストで指定できるのはプロンプト、枚数、画像サイズ、画像フォーマット、圧縮率のみです。細かい設定ができません。使用するモデルの変更を行う場合はサーバの再起動が必要です。

スポンサーリンク

環境構築

ダウンロード

以下のページから自分の環境にあったZipファイルをダウンロードします。

Release master-468-885e62e · leejet/stable-diffusion.cpp
Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++ - Release master-468-885e62e · leejet/stable-diffusion.cpp

AMDのGPUで動かしたい場合はvulkanとつくものかrocmとつくものです。

(基本的にはvulkanでいいと思います。rocmはどうするGPUが限られるはずです。)

NVidiaのGPUはcudaが付くものが対象です。

ちなみにこの記事で紹介する方法はかなり新しいパッケージである必要があります。(動作確認したのはmaster-468-885e62eです。master-431-23fce0b(2025/12M)では動作しません。)

avx512,avx2,avx,noavxはCPU動作です。お使いのCPUで使用できるavxのバージョンを調べてダウンロードしてください。(私は誤解していたのですがAMDのCPUもAVX使えるようです。どのバージョンが使用できるかはAIに聞いちゃうのが楽です。)

対象のダウンロードしたファイルを任意のフォルダに解凍したら準備完了です。

HTMLの用意

任意の場所にHTMLを用意します。

この記事では以下のHTMLをindex.htmlとして保存しました。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>sd-cpp Web UI</title>
</head>

<body>

    <div>
        <h2>sd-cpp</h2>
        <textarea id="prompt" placeholder="Prompt...">a cat in space, digital art</textarea>

        <div class="controls">
            <select id="size">
                <option value="512x512">512x512</option>
                <option value="768x768">768x768</option>
                <option value="1024x1024">1024x1024</option>
            </select>
            <button id="genBtn" onclick="generate()">Generate</button>
        </div>
        <div id="status" class="status"></div>
        <div id="result"></div>
    </div>

    <script>
        async function generate() {
            const prompt = document.getElementById('prompt').value;
            const size = document.getElementById('size').value;
            const btn = document.getElementById('genBtn');
            const status = document.getElementById('status');
            const resultDiv = document.getElementById('result');

            btn.disabled = true;
            status.innerText = "Generating";
            resultDiv.innerHTML = "";

            try {
                const response = await fetch('/v1/images/generations', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        prompt: prompt,
                        n: 1,
                        size: size,
                        response_format: "b64_json"
                    })
                });

                const jsonResponse = await response.json();

                if (jsonResponse.data && jsonResponse.data.length > 0) {
                    const b64Data = jsonResponse.data[0].b64_json;
                    const imgSrc = `data:image/png;base64,${b64Data}`;

                    resultDiv.innerHTML = `
                    <img src="${imgSrc}" alt="Generated Image">
                    <br>
                    <a href="${imgSrc}" download="generated.png" style="display:inline-block; margin-top:10px;">SAVE</a>
                `;
                    status.innerText = "DONE!!";
                } else {
                    throw new Error("Failed to generate image");
                }

            } catch (err) {
                console.error(err);
                status.innerText = "Error: " + err.message;
            } finally {
                btn.disabled = false;
            }
        }
    </script>

</body>

</html>
スポンサーリンク

実行

サーバの起動

以下のコマンドでサーバを起動します。

sd-server.exe --listen-port 8888 --serve-html-path 作成したhtmlのパス -s -1 モデル情報

モデル情報は”-m モデルパス”などです。sd-cli.exeで使用する起動引数と同じです。

-s -1 はランダムシードを使用することを指定しています。htmlからはシードを指定できないのでランダムシードを使用するようにしました。

起動ができたらブラウザで http://127.0.0.1:8888/ にアクセスします。

下の画像が表示されたらプロンプトを入力してGenerateをクリックすると画像が生成されます。

画像が生成されると以下のように表示されます。ローカルに保存されるわけではないので注意

起動パラメータ例

sd-cliでの起動パラメータ

sd-cli -m モデルパス -p "a lovely cat" -s -1

sd-serverでの起動パラメータ

sd-server.exe --listen-port 8888 --serve-html-path 作成したhtmlのパス -s -1 -m モデルパス

sd-cliでの起動パラメータは以下のページをご参照ください。

コメント

タイトルとURLをコピーしました