見出し画像

画像生成の高速化メモ【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%近い高速化に成功しました。高速化設定の恩恵がいいかんじですね。
設定も簡単なのでぜひ適用してね。

この記事が気に入ったらサポートをしてみませんか?