AI 이미지/Stable Diffusion

SDXL 터보 - 실시간 이미지 생성

하늘이푸른오늘 2023. 12. 6. 10:59

SDXL 터보 모델은 단 한번의 샘플링 단계만에 선명한 이미지를 생성하는 미세조정(fine-tuned) 모델입니다.  이 글에서 다루는 내용은 다음과 같습니다.

SDXL 터보란?

SDXL 터보(Turbo) 모델은 단 한번의 샘플링 단계만에 선명한 이미지를 생성하도록 미세조정(fine-tuned)한 SDXL(스테이블 디퓨전 XL) 모델입니다.  

학습방법

SDXL 터보 모델의 학습 방법은 Axel Sauer 등이 저술한 논문 "적대적 확산 농축(Adversarial Diffusion Distillation)"에 기술되어 있습니다. 농축 기법을 이용해 샘플링 속도를 올리고자하는 기존의 방법들도 1 스텝을 강조하였지만, 실제로는 1~4 스텝정도의 낮은 회수에서는 흐릿하거나 정상적이지 않은 이미지가 생성되는 경우가 많았습니다. 반면 적대적 생성 신경망(GAN, Generative Adversarial Network)의 경우에는 선명하긴하지만 디퓨전 모델의 품질에 못미치는 이미지가 생성되었고요.

새로운 적대적 확장 농축(ADD, Adversarial Diffusion Distillation) 학습법은 이 두 가지 방법론의 장점을 가지도록 목표하였습니다. 학생 모델(student model, SDXL Turbo)는 1 스텝만에 교사 모델(teacher model, SDXL)과 동일한 결과를 생성하도록 학습되었습니다. 이 기술이 새로운 것은 아닙니다. 일관성 모델(Consistency model)점진적 농축(progressive distillation)도 동일한 목표로 추진되었었습니다. 그런데 SDXL 터보의 경우에는 GAN 판별기를 추가하는 트릭을 사용해, 교사 모델과 거의 구분할 수 없는 고품질 이미지를 생성하도록 합니다.

아래는 학습 방법을 요약한 그림입니다.

SDXL 터보 모델 학습(출처 : 연구 논문)

참고로 SDXL 터모 모델은 SDXL 기본 모델을 사용해 학습하였으며, 512x512 이미지 생성에 최적화되어 있습니다.

AUTOMATIC1111에서 SDXL 터보 사용하는 방법

AUTOMATIC1111은 공식적으로 SDXL Turbo를 지원하지 않지만, 올바르게 설정하면 사용할 수 있습니다. 참고로 윈도 11에서 AUTOMATIC1111 설치방법은 이 글을 참고하시면 됩니다. 기타 Mac에서도, 구글 Colab에서도 사용할 수 있지만, 저는 따로 정리하지 않았습니다. 

1단계: SDXL Turbo 모델 다운로드

여기에서 SDXL Turbo 모델을 다운로드 받고, stable-diffusion-webui\models\Stable-diffusion 에 넣어주면 됩니다.

2단계: txt2img 설정

AUTOMATIC1111 의 txt2img 페이지에서 먼저 sd_xl_turbo_1.0_fp15 모델을 선택합니다.

모델(checkpoint model) : sd_xl_turbo_1.0_fp15
프롬프트: beautiful landscape scenery glass bottle with a galaxy inside cute fennec fox snow HDR sunset
샘플링 방법(Sampling method) : Euler a
샘플링 단계(Sampling steps): 1
이미지 크기(Size) : 512 x 512
CFG 척도(Scale): 1

SDXL Turbo용 AUTOMATIC1111 설정

3단계: 이미지 생성

[Generate] 버튼을 누르면 아래와 같은 이미지들이 생성됩니다. 1단계만에 생성된 것이라고는 생각할 수 없을 정도로 깔끔한 이미지가 생성되네요. 1단계다 보니 기다릴 필요도 없이 그냥 툭 튀어 나옵니다.ㅎㅎ

ComfyUI 에서 SDXL Turbo 사용하는 방법

ComfyUI는 SDXL 터보 모델을 공식적으로 지원(sdxl turbo 예제 사이트)합니다. ComfyUI를 처음 접하신다면 설치 및 기본적인 사용방법초보자 가이드를 읽어보시기 바랍니다.

1단계: ComfyUI  업데이트

이 글을 따라 ComfyUI를 최신 버전으로 업데이트하고, 커스텀 노드들을 업데이트합니다. 

2단계: SDXL Turbo 워크플로 불러오기

아래 그림을 다운로드 받은 후, ComfyUI 캔버스에 Drag&Drop하면 워크플로를 그대로 복원할 수 있습니다. 만약 빨간색 박스가 보이면 외부에서 가져온 워크플로 사용하기를 읽어보세요.

SDXL Turbo 워크플

3단계: SDXL 터보 모델 다운로드

여기에서 SDXL Turbo 모델을 다운로드 받고, ComfyUI\models\checkpints 폴더에 넣어줍니다. AUTOMATIC1111과 모델파일을 공유하고 싶을 경우에는 여기를 읽어보세요.

4단계: 이미지 생성

[Queue Prompt] 버튼을 누르면 이미지가 생성됩니다. 역시나... 처음에 모델을 불러들일 때는 약간 시간이 걸리지만, 그 다음부터는 그냥 버튼을 누르자 마자 이미지가 툭튀어나오네요. 원래 AUTOMATIC1111보다 더 빠른데다가 1 스텝 생성이다보니 중간과정이 전혀 느껴지지 않습니다.

실시간 프롬프트 처리(Real-time Prompting)

 그래픽 카드(GPU)의 성능이 좋다면, 프롬프트를 변경할 때마다 새로운 그림이 그려지는, 그야말로 실시간 프롬프트를 사용할 수 있습니다. 

SDXL 터보 모델을 사용한 실시간 프롬프트 처리

이렇게 하려면, 메뉴에서 Extra options를 클릭한 후, 아래쪽에 새로 추가된 Auto Queue를 켜주시면 됩니다. 다만 이렇게 하면 의도치 않게 엄청나게 많은 이미지가 생성됩니다. 그래서 한번 시도해 본 후 꺼버렸습니다^^

SDXL Turbo를 위한 최적 설정

SDXL Turbo 모델을 사용할 때의 설정은 다른 스테이블 디퓨전 모델을 사용할 때와 상당히 다릅니다. 특히 아래와 같은 설정에 유의하여야 합니다.

CFG 척도(scale)

일반적인 스테이블 디퓨전 모델의 경우 CFG 척도를 7~8 정도로 설정하여 사용합니다. 하지만, SDXL Turbo 모델의 경우, LCM LoRA 때와 마찬가지로, 거의 1로 두고 사용하여야 합니다. 

아래의 예에서 보는 것처럼, CFG를 1 이하로 두면 이미지 품질 저하가 발생하고, 1 이상으로 두면 이미지가 밝아지고 채도가 과해지는 것을 보실 수 있습니다. 대부분 CFG 값은 1~1.2 정도가 좋습니다.

0.8 1.0 1.2

부정적 프롬프트(Negative Prompt)

CFG 척도를 1로 두었을 경우,  부정적 프롬프트는 아무런 영향을 미치지 못합니다. 아래는 부정적 프롬프트에 Tree, Building  등을 넣었을 경우인데, 전혀! 아무 픽셀도 변하지 않았음을 알 수 있습니다.

- Tree Building

CFG 값을 1.1~1.3 정도로 올리면서 테스트해보면 부정적 프롬프트가 이미지를 변경시키기는 하지만, 원하는 효과는 얻기 힘듧니다. 그냥 부정적 프롬프트는 사용할 수 없다고 생각하시면 편합니다.

샘플링 단계(Sampling steps)

SDXL Turbo 모델은 1 스텝에 추론하도록 학습되었습니다. 그래서... 스텝을 5-10으로 올려주면 올려줄 수록 품질이 낮아지는 것을 볼 수 있습니다. 잡음이 거의 없을 경우에는 잡음 제거(Denoising)이 적절하게 수행되지 못하기 때문으로 보입니다.

샘플링 단계는 1~4 정도면 적당합니다. 

SDXL Turbo 모델과 샘플링 단계의 효과. 단계가 늘어나면 품질이 저하된다.

잡음 스케줄(Noise Schedule)

잡음 스케줄이란, 각각의 샘플링 단계에서 제거되는 노이즈 수준을 말합니다.

SDXL Tubo 모델에 대한 잡음 스케줄은 다른 잡음 스케줄러와는 상당히 다릅니다. SDXL Turbo의 경우엔 잡음이 각 단계에 비례해서 줄어들지만, 다른 스케줄러의 경우에는 시작 부분에서 더 많이 떨어지는 것이 일반적입니다. 이 때문에, 다른 잡음 스케줄러는 SDXL 터보 모델과는 잘 어울리지 않을 수 있습니다. 

그런데 실제로는 기본 txt2img 워크플로를 사용할 때, Karras 잡음 스케줄과 Euler ancestral 샘플러가 비슷한 결과를 보입니다. 특히, 1 단계를 사용할 경우, Turbo 와 Karras 스케줄은 동일합니다. 이 때문에 공식적으로는 지원하지 않는데도 SDXL 터보를 AUTOMATIC1111에서 사용할 수 있는 것입니다. 

성능 비교

여기에서는 SDXL Turbo와 SD 1.5 기본 모델을 사용하여 이미지를 생성하면서 비교해 보겠습니다. 둘다 512x512 이미지를 생성하는 데 최적화있기 때문입니다. SDXL Turbo 는 v1.5에 비해 훨씬 큰 모델이지만(v1-5-pruned-emaonly.safetensors는 약 4.1GB, sd_xl_turbo_1.0_fp16.safetensors는 6.7 GB 입니다), 샘플링 단계가 적으니 일반적으로 성능이 좋습니다.

ComfyUI

제 컴퓨터의 그래픽 카드는 GTX 3070입니다. 512x512 이미지 4장(batch size=4)을 생성할 경우, SDXL Turbo는 1.1초만에 완료되며, SD 1.5 기본 모델은 12.4초만에 완료되었습니다. SD1.5는 20단계, SDXL Turbo는 1단계이지만, SDXL Turbo의 모델 크기가 크므로 12배 차이는 합리적인 것 같습니다. SDXL 기본 모델을 사용해 1024x1024 이미지 4장을 생성할 경우에는 약 40초 정도가 소요되었네요.

Automatic1111

위에서 설정한 방법으로 테스트해봤을 때, SDXL Turbo는 15초 정도 소요되었으며, SD 1.5 기본 모델의 경우 약 10초 만에 생성되었습니다. 오히려 1 스텝만에 생성하는 SDXL Turbo가 더 늦다니 이상하다 싶습니다.

이미지 품질 비교

여러가지 케이스에 대해 이미지를 비교해 보겠습니다. 아래는 프롬프트입니다.

프롬프트: A color photo of a young boy and girl holding hands, witnessing the aftermath of an atomic bomb detonation from an elevated vantage point.
SDXL Turbo
SDXL Base (1024x1024)
Realistic Vision (v1.5)

이번엔 사진 스타일을 비교해보겠습니다.

프롬프트: photo of young woman, highlight hair, sitting outside restaurant, wearing dress, rim lighting, studio lighting, looking at the camera, dslr, ultra quality, sharp focus, tack sharp, dof, film grain, Fujifilm XT3, crystal clear, 8K UHD, highly detailed glossy eyes, high detailed skin, skin pores
부정적 프롬프트: disfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w
SDXL Turbo
SDXL
Realistic Vision

이러한 결과를 보았을 때, SDXL Turbo 모델이 SDXL 모델이나 SD 1.5 모델에 비해 품질이 떨어지는 것 같습니다. 아마도 나중에 좀더 미세조정(fine-tuning)이 필요할 수도 있겠다 싶네요. 또한 중복된 이미지가 많고, 신체 구조가 잘못되는 경우도 많은 것 같습니다. 부정적 프롬프트가 전혀 먹히지 않는 것도 하나의 이유로 보입니다.

SDXL Turbo와 LCM-LoRA 비교

이 두가지 속도 향상 기술은 거의 같은 시기에 공개되었습니다. 어떤 것을 사용하는 것이 좋은지 비교해 보겠습니다.

품질

SDXL Turbo는 속도면에서 타의 추종을 불허하지만, 이미지 품질이 떨어져서 응용에는 제한이 있는 것으로 보입니다. 특히 스텝수를 늘린다고 이미지 품질이 좋아지는 것이 아니기 때문에 Refinery 모델을 결합한다던지 기타 품질을 올릴 수 있는 기법이 나오지 않는 이상 널리 활용되지는 못할 것 같습니다. 향후, 고 품질의 이미지로 미세조정된 모델이 나오지 않을까 기대해 봅니다.

 LCM-LoRA의 경우, 이와는 반대로 추가로 미세조정해야 한다는 부담이 없습니다. 원래 어떠한 스테이블 디퓨전 모델에 대해서도 가속기로서 기능하도록 설계되었기 떄문입니다. 미세 조정된 다른 모델의 장점을 그대로 활용할 수 있는 거죠. 또한 SDXL Turbo와는 달리 품질이 약간 떨어진다면 스텝수를 늘리는 방법으로 대처가 가능하기 때문에 현재로서는 LCM-LoRA 의 활용도가 높을 듯 합니다.

또 한가지, SDXL용 LCM-LoRA는 1024x1024 이미지를 생성하는 반면, SDXL Turbo는 512x512 이미지만 생성할 수 있습니다. 

결론적으로 이미지 품질 면에서는 LCM-LoRA 가 훨씬 좋다고 해야 할 것 같습니다.

프롬프트: A portrait of a fairy princess, tiara, long flowery hair, fantasy, soft background, sea-like , bluish dress, bare shoulders, UHD, 8k, beautiful composition, a modern surrealistic
LCM-LoRA (1024x1024) 4 steps, CFG: 1.8
SDXL Turbo (512x512), 1 step, Euler a 샘플러

속도

SDXL Turbo는 1스텝만에 이미지를 생성할 수 있고, LCM-LoRA는 적어도 4 스텝이 필요합니다. 따라서 속도면에서는 SDXL Turbo가 당연히 뛰어납니다.

유연성

LCM-LoRA가 훨씬 적용성이 뛰어납니다. LCM-LoRA는 LoRA의 일종이기 때문에 어떠한 스테이블 디퓨전 모델과도 함께 사용할 수 있습니다. SDXL Turbo는 별도의 체크포인트 파일이므로 단독으로만 사용해야 합니다.

이상입니다.

이 글은 https://stable-diffusion-art.com/sdxl-turbo/를 번역하면서 예제들은 직접 생성한 이미지로 대체하고, 일부는 제 생각으로 추가하거나 변경해서 작성한 글입니다.

민, 푸른하늘