やりたいこと
StableDiffusion.cppをサーバモードで使用します。
利点とできないこと
まずサーバモードの利点とできないことをまとめるのでサーバモードを使用するかどうか検討してください。
利点
サーバモードで起動した場合、モデルがキャッシュされるので2回目以降の実行が早くなります。
HTMLを用意してHTMLからプロンプトなどを指定することができます。
できないこと
リクエストで指定できるのはプロンプト、枚数、画像サイズ、画像フォーマット、圧縮率のみです。細かい設定ができません。使用するモデルの変更を行う場合はサーバの再起動が必要です。
環境構築
ダウンロード
以下のページから自分の環境にあったZipファイルをダウンロードします。
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での起動パラメータは以下のページをご参照ください。


コメント