AI 이미지/AUTOMATIC1111

Stable Diffusion - AUTOMATIC1111 최적화

하늘이푸른오늘 2023. 7. 7. 12:50

Stable Diffusion이 느리다고 생각되나요? 속도를 올릴 수 있는 옵션이 여러가지 있습니다. 이 글에서는 Stable Diffusion 실행 속도를 올릴 수 있는 다음과 같은 방법에 대해 설명합니다.

  • 교차 인지(cross-attention) 최적화
  • 토큰 병합(token merging)
  • 부정적 가이드(negative guidance) 최소 시그마(minimum sigma)

이 글의 목차는 아래와 같습니다.

소프트웨어

이 글에서는 Stable Diffusion의 GUI중의 하나인 AUTOMATIC1111을 사용합니다. 설치방법은 여기를 읽어보세요. 처음이시라면 초보자 가이드도 추천합니다.

교차 인지 최적화 옵션

모든 최적화 옵션은 교차 인지(cross-attention) 계산을 빠르게 하고, 메모리 사용을 줄이는 게 목표입니다. 아래는 AUTOMATIC1111에서 사용가능한 모든 옵션입니다.

교차 인지 최적화 설정 방법

AUTOMATIC1111 웹UI에서 Settings  페이지에 들어가서 왼쪽에 있는 Optimization을 클릭합니다. Cross attention optimization 드롭다운 메뉴에서 원하는 옵션을 클릭한 후, [Apply Settings]를 클릭하면 됩니다. 

Stable Diffusion 최적화
Stable Diffusion 최적화

Doggettx

스테이블 디퓨전이 공개되고 얼마 지나지 않아, Github 유저인 Doggettx 가 교차 인지 연산에 몇가지 성능 향상을 이루었습니다. 그 당시에는 상당히 쓸만했지만, 현재는 아래에 있는 다른 옵션으로 대부분 이동했습니다.

xFormers

교차인지 연산은 스테이블 디퓨전 알고리듬의 핵심이라고 할 수 있지만, 상당히 느립니다. xFormers는 Meta AI 팀에서 개발한 트랜스포머 라이브러리로서, memory-efficient attentionFalsh Attention 을 구현하여 교차인지 연산의 메모리 사용량을 줄이고 속도를 올려줍니다. 

Memory-efficient attention은 계산 단계를 영리하게 재 배치하여 더 적은 메모리로 교차 인지 연산을 수행합니다. Flash attention은 교차인지 연산을 한번에 작은 패치에 대해 계산합니다. 그 결과 메모리 사용량은 줄어들고 연산 속도는 빨라집니다.

PyTorch가 네이티브로 지원해주기 전에는 xFormers 라이브러리를 사용해야 했습니다. 새로운 비디오 카드를 사용한다면 SDP를 사용하는 것이 좋습니다.

AUTOMATIC1111  명령 인자는 --xformers 입니다. 예를 들어 아래는 제 web-user.bat 파일중 일입니다.

set COMMANDLINE_ARGS= --xformers  --medvram-sdxl --no-half-vae

Scaled-Dot-Product(sdp) attention

Scaled-Dot-Product attention memory-efficient attention  Falsh Attention  Pythoch의 고유 연산으로 시행합니다. 즉, xFormer 옵션을 다른 방식으로 수행하는 것입니다.

이 최적화의 단점은 이미지가 결정적이지 않다는 것입니다(예전 버전의 xFormer에서도 동일한 문제가 있었음). 이로 인해 동일한 생성 파라미터를 사용하더라도 다른 이미지가 생성될 수 있습니다.

이 기능을 사용하려면 Pytorch 2 이상이 필요합니다.

AUTOMATIC1111 명령 인자는 --opt-sdp-attention 입니다.

sdp-no-mem

sdp-no-mem은 memory-efficient attention이 빠진 scaled-dot-procuct attention입니다. SDP와는 달리 최종 생성이미지는 결정적입니다(동일한 파라미터를 사용하면 동일한 이미지가 생성됩니다).

이 기능을 사용하려면 Pytorch 2 이상이 필요합니다.

AUTOMATIC1111 명령 인자는 --opt-sdp-no-mem-attention 입니다.

Sub-quadratic attention

Sub-quadratic(sub-quad) attention은 memory-efficient attention을 다른 방식으로 구현한 것으로, xFormer나 SDP의 일부입니다. xFormer나 SDP를 사용할 수 없는 경우 이 옵션을 사용해 볼 수 있습니다.

AUTOMATIC1111 명령 인자는 --opt-sub-quad-attention 입니다.

Split-attention v1

Split-attention v1은 memory-efficient attention의 예전 구현입니다. 이것을 사용하기전  xFormer나 SDP를 사용해 보는 것이 좋습니다.

AUTOMATIC1111 명령 인자는 --opt-split-attention-v1 입니다. 끄기 위해서는 --disable-opt-split-attention을 사용합니다.

Invoke AI

Invoke AI 코드 베이스에서 사용된 교차주의 최적화입니다. 이 옵션은 Nvidia GPU가 없는 MacOS 유저에게 유용합니다.

메모리 관리 옵션

Med Vram

명령줄에 --medvram 인자를 사용하면 모델이 VRAM에 일부만 들어가도록 하여 GPU 메모리를 보존합니다. 속도를 약간 떨어뜨립니다.

Low Vram

명령줄에 --lowvram 인자를 사용하면 모델이 VRAM에 꼭 필요한 부분만 들어가도록 하여 GPU 메모리를 더 많이 보존합니다. 속도가 확실히 떨어집니다.

SDXL 설정

명령줄 인자에 -medvram-sdxl 또는 -lowvram을 사용하여 속도가 많이 떨어지는지, SDXL 모델을 아얘 돌릴 수 없는 건 아닌지 시험해 보면 좋습니다. 아래는 추천입니다.

  • Nvidia 12GB+ VRAM: --opt-sdp-attention
  • Nvidia 8GB VRAM: --opt-sdp-attention --medvram-sdxl
  • Nvidia 4GB VRAM: --opt-sdp-attention --lowvram
  • AMD 4GB VRAM: --lowvram --opt-sub-quad-attention

토큰 병합(Token merging)

토큰 병합(ToMe)는 프롬프트 및 부정적 프롬프트에서 처리해야 할 토큰의 숫자를 줄임으로서 Stable Diffusion의 속도를 올리는 기법입니다 실제의 토큰은 많은 수가 중복이기 때문에 이를 결합하더라도 큰 변화는 일어나지 않는다는 것을 이용합니다.

토큰 병합 량은 "the percentage of token merged"를 사용해 제어할 수 있습니다.

아래는 토큰을 0% 부터 50%까지 병합하면서 비교해 본 결과입니다. 

토큰 머징은 생성되는 이미지가 변경될 수 있다는 단점이 있습니다. 동일한 이미지 재생성이 중요한 사용자라면 사용하지 않는 것이 좋습니다.

AUTOMATIC1111 웹UI에서 토큰 병합

AUTOMATIC1111에서 토큰 머징을 사용할 수 있습니다(별도의 확장을 설치할 필요가 없습니다) 

먼저 Settings 페이지로 들어가서 아래 그림과 같이 Optimization  부분으로 들어갑니다. 여기에서 원하는 값(아래 그림에서는 0.2 (20%)로 설정하고, [Apply Settings]를 클릭합니다.

AUTOMATIC1111 토큰 병합 설정
AUTOMATIC1111 토큰 병합 설정

Negative guidance minimum sigma

이 옵션을 사용하면, 부정적 프롬프트를 결과에 크게 영향을 미치지 않는다는 어떤 조건하에서는 꺼버리게 됩니다. 실험에 따르면 일부 단계에서는 부정적 조건부여를 꺼버리더라도 이미지에 영향이 없었다고 합니다.

minimun sigma의 영향
minimun sigma의 영향

변화가 거의 없다고 해도 일부분에서는 약간의 변화가 감지됩니다. 따라서 동일한 이미지를 재생성하는 것이 중요하다면 이 옵션을 사용하지 않는 것이 좋습니다.

Negative guidance minimum sigma 사용법

Negative guidance minimum sigma 를 사용하는 방법도 토큰 병합 사용법과 비슷합니다. 아래와 그림과 같이 설정하고 [Apply Settings] 버튼을 클릭해주면 됩니다.

Negative guidance minimum sigma 적용 방법
Negative guidance minimum sigma 적용 방법

스피드 및 메모리 사용량 벤치마크 테스트

시험 환경

아래는 벤치마크 테스트에 사용된 프롬프트 등 환경입니다. 어떤 프롬프트를 사용하는지는 중요한 것은 아니지만, 토큰 한계(75개) 이내를 사용했다는 점은 중요합니다. (이렇게 해야 추가적인 토큰 배치가 발생되지 않습니다)

모델 : ChilloutMix
프롬프트: (close-up editorial photo of 20 yo woman, ginger hair, slim American sweetheart), (freckles:0.8), (lips parted), realistic green eyes, POV, film grain, 25mm, f/1.2, dof, bokeh, beautiful symmetrical face, perfect sparkling eyes, well defined pupils, high contrast eyes, ultra detailed skin 
부정적 프롬프트: (semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime:1.4), text, close up, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation 
샘플링 방법 : Euler
크기 : 512x512
샘플링 단계 : 20
Batch count : 2
Batch size: 8
CFG 척도: 7
Seed: 100

아래는 생성된 이미지입니다. 빨강머리 앤이 생각나네요. ㅎㅎ

아래는 RTX 4090 CUP 카드와 CUDA 11.8 환경에서 수행한 결과입니다.

교차인지 최적화에 대한 벤치마크

옵션 시간(sec) 최대 VRAM
None 35.1 23.1 GB
doggettx 14.4 14.9 GB
xFormers 12.8 3.5 GB
sdp-no-mem 10.6 3.5 GB
sdp 10.5 3.5 GB
sub-quadratic 18.8 5.9 GB
v1 21.5 3.6 GB
Invoke AI 14.4 14.9 GB

sdp(Scaled dot product)가 가장 성능이 좋고 그 다음이 xFormer로 나타납니다. 이 두가지 모두 속도와 메모리 사용량 감소가 우수합니다.

토큰 결합에 대한 벤치마크

토큰 병합 비율 시간(sec) 최대 VRAM
0 10.6 3.5 GB
0.3 10.3 3.5 GB
0.5 10.0 3.5 GB
0.7 9.9 3.5 GB

이 표에서 보이는 것처럼, 토큰 병합은 그다지 속도가 메모리 사용량 부분이 좋아지지 않습니다. 사용하지 않는 게 좋을 것 같네요.

Negative guidance minimum sigma 에 대한 벤치마크 

Negative guidance 시간(sec) 최대 VRAM
0 10.6 3.5 GB
0.3 10.5 3.5 GB
0.5 10.2 3.5 GB
0.7 10.1 3.5 GB

Negative guidance minimum sigma 의 경우도 이렇다할 성능향상이 보이지 않습니다. 사용하지 않는 게 좋을 듯 합니다.

어떤 옵션을 사용하는 게 좋은가?

이미지를 똑같게 재 생성하는 게 중요하다면 xFormer나 SDP-no-mem을 사용하는 게 좋을 것 같습니다. 토큰 병합과Negative guidance minimum sigma 는 사용하지 않고요.

재생성이 그다지 중요하지 않다면 xFormer, SDP-no-mem, SDP중 하나를 사용하면 되고, 원한다면 토큰 병합과 Negative guidance minimum sigma 도 추가해보실 수 있습니다.

MacOS의 경우엔 Invoke AI가 최선입니다.

==

이상입니다. 저는 그냥 대충 읽고 xFormer만 사용하고 있습니다. xFormer와 관련해서... 메모리 부족 에러에 대처하는 방법도 읽어보세요~

이 글은 https://stable-diffusion-art.com/speed-up-stable-diffusion/ 을 거의 수정없이 번역한 글입니다.

==