画像生成の高速化メモ【Stable Diffusion】
このメモを読むと
・画像生成の速度を28.8%上げられる。
検証環境
・Windows11
・VRAM24GB
・ローカル(Anaconda)
・NVidia ドライバー 531.61
・AUTOMATIC1111 v1.3.1
・2023/6/B時点
事前準備
Stable Diffusionで遊ぶメモ|おれっち (note.com)
画像生成の高速化
とにかく早く画像を生成したーいので、話題の手法を試してみます。
今回試したのは以下の二つです。
・高速化設定を適用する
・NVidiaドライバーの更新
実験
生成条件
下記生成を10回実行し平均したタイムをスコアとします。
・stetps : 20
・widtd : 512
・height : 512
・sampler : Euler a
・restore_faces : False
・10回生成
結果
デフォルト
生成時間 10.869秒
高速化設定のみ:--opt-sdp-no-mem-attention
生成時間 7.990秒
効果 26.5%
NVidiaドライバー 更新のみ:535.98
生成時間 10.402秒
効果 4.3%
高速化設定:--opt-sdp-no-mem-attention
NVidia ドライバー 更新:535.98
生成時間 7.741秒
効果 28.8%
はやくなった!
おまけ1
TensorRTも試しました。
TensorRT:ON
高速化設定:--opt-sdp-no-mem-attention
NVidia ドライバー:535.98
生成時間 5.481秒
効果 49.6%
とんでもない効果ですが、TensorRTはまだ試用段階でControlNetは扱えません。きっと今後実装されるでしょうから、正座待機ですね。
おまけ2
タイム計測に使ったAPIコードです。
import requests
import json
import base64
from datetime import datetime
import argparse
import time
import os
# 生成コマンド
# python SDGen.py -i http://127.0.0.1:7860 -n 10
# コマンドラインオプションをハンドルする
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument('-i', required=True)
parser.add_argument('-n', required=True, type=int)
args = parser.parse_args()
return args
# 画像生成に必要なプロンプトやパラメータを設定する
def build_payload():
return {
"prompt": "(Best quality: 1.5), (illustration, background details, eye details: 1.3), depth of field, dynamic lighting, flare effect, full body, black hair, kimono, a girl, japanese",
"negative_prompt": "(worst quality, low quality, normal quality:1.5), (nsfw), text, logo, ears, longbody, lowres, bad anatomy, bad hands, mutated hands, missing fingers, bad fingers, poorly drawn hands, blurry, fused fingers, chibi , bad_prompt, bad anatomy, dark colored eyes, rocking an untucked shirt, young face,",
"sampler_name": "Euler a",
"restore_faces": False,
"steps": 20,
"width": 512,
"height": 512,
}
# リクエストを送信する
def send_post_request(url, payload):
headers = {"Content-Type": "application/json"}
response = requests.post(url, headers=headers, data=json.dumps(payload))
return response
# 画像をローカルに保存する
def save_image(data, index):
decode_image = base64.b64decode(data["images"][0])
file_name = "{}_{}.png".format(datetime.now().strftime('%Y%m%d%H%M%S'), index + 1)
with open("./output/" + file_name, "wb") as file:
file.write(decode_image)
return file_name
# 画像を生成する
def create_and_save_images(input_url, number_of_images):
url = "{}/sdapi/v1/txt2img".format(input_url)
payload = build_payload()
for i in range(number_of_images):
#print("Generate {} image".format(i + 1))
response = send_post_request(url, payload)
image_data = response.json()
file_name = save_image(image_data, i)
print("Download {} to local".format(file_name))
def main():
args = parse_arguments()
start_time = time.time()
create_and_save_images(args.i, args.n)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Elapsed time: {elapsed_time} seconds")
if __name__ == "__main__":
main()
おわり
30%近い高速化に成功しました。高速化設定の恩恵がいいかんじですね。
設定も簡単なのでぜひ適用してね。
この記事が気に入ったらサポートをしてみませんか?