AI 이미지/Stable Diffusion

스테이블 디퓨전 샘플러: 완벽 가이드

하늘이푸른오늘 2024. 6. 7. 16:28

AUTOMATIC1111과 ComfyUI에는 Euler, Heun, DDIM 등등 여러가지 샘플링 방법이 존재합니다. 이 글에서는 샘플러가 무엇인지, 작동 원리, 그리고 어떤 차이점이 있는지, 어떤 걸 사용하는 게 좋은지 등을 다룹니다.

샘플링이란?

샘플러는 잡음제거 단계를 수행하는 역할을 한다.

이미지를 생성하기 위해서는 , 스테이블 디퓨전은 먼저 잠재 공간(latent space)에 완전히 무작위(random) 이미지를 생성합니다. 잡음 예측기(noise predictor)는 이미지로부터 잡음을 예측하고, 원래의 잡음 이미지에서 그 만큼의 예측된 잡음을 제거해줍니다.이 프로세스를 여러번 반복하면 최종적으로 깨끗한 이미지를 얻을 수 있습니다.

이와 같은 잡음 제거(denoising) 프로세스를 샘플링(sampling)이라고 합니다. 스테이블 디퓨전은 각 단계별로 새로운 샘플 이미지를 생성하기 때문입니다. 샘플링에서 사용된 방법을 샘플러(sampler) 또는 샘플링 방법(sampling method)라고 합니다.

샘플링은 스테이블 디퓨전 모델의 일부일 뿐입니다. 전체 모델을 알고 싶으시다면, 스테이블 디퓨전의 기본 원리를 읽어보시기 바랍니다. 

아래는 샘플링 프로세스가 진행되는 동안 잡음 이미지가 변화되는 모습입니다. 샘플러는 점점 더 깨끗한 이미지를 생성하게 됩니다.

잡음 제거 단계별 이미지

이러한 잡음 제거 프로세스는, 기본 원리는 동일하지만 여러가지 다른 방법이 존재합니다. 이러한 방법에 따라 정확도와 속도가 다를 수 있습니다.

잡음 스케줄(noise schedule)

위에서 잡음 제거 프로세스가 진행됨에 따라 이미지가 점차 깨끗해진다는 것을 아셨을 것입니다. 이때 잡음 스케줄은 각 샘플링 단계에서 제거하는 잡음의 수준을 제어합니다. 대부분의 경우 첫 단계에서는 제거되는 잡음 양이 많고, 마지막에 가까워질 수록 줄어듭니다.

각 단계에서 샘플러의 역할은 잡음 스케줄에 맞는 잡음 수준을 가지는 이미지를 생성하는 것입니다.

15 단계의 샘플링을 위한 잡음 스케줄

샘플링 단계의 수를 증가시키면 어떤 효과가 있을까요? 각 단계간의 잡음 제거량이 줄어들겠죠. 그렇게 되면 샘플링의 잘림 오류를 줄어들게 됩니다. 결국 오류가 적은 이미지가 생성됩니다.

아래는 30단계의 잡음 스케줄입니다. 함께 비교해 보시죠.

30 단계의 샘플링을 위한 잡음 스케줄

디퓨전 궤적(Diffusion trajectory)

잠재 공간에서 디퓨전(diffusion, 확산)은 어떤 모습일까요? 사실 SDXL 샘플른 65,536 차원의 잠재 공간에서 확산되므로, 상상하기는 어렵습니다.

다음은 PCA(Principle Component Analysis, 주성분 분석)을 사용해 디퓨전 프로세스를 2차원 공간에 투영해본 모습입니다. 

잡음 스케줄과 마찬가지로, 처음에는 디퓨전(확산) 단계가 크고, 끝으로 갈수록 줄어듭니다. 초기단계에서는 이미지의 전반적인 구도가 결정됩니다. 이후에는 좀더 상세한 부분을 세밀화하죠.

샘플은 최종 잠상(latent image)에 도달하기 까지, 훈련된 이미지의 복잡한 확률 분포 환경을 통과합니다.

씨드(Seed) 변경

이미지의 씨드를 변경하면 유사하면서도 다른 이미지가 생성됩니다. 샘플링 단계에서 어떤 일이 발생하는 것일까요? 약간 다른 궤적을 따라가지만, 거의 비슷한 곳에서 끝나게 됩니다.

프롬프트(Prompt) 변경

프롬프트를 변경할 경우, 샘플의 종착점이 극적으로 달라져서 최종적으로 아주 다른 이미지가 생성됩니다.

샘플러(Sampler) 개요

이 글을 쓰는 현재, AUTOMATIC1111에는 19가지 샘플러가 존재합니다. 물론 이 숫자는 앞으로 계속 증가할 것입니다. 이들 샘플러들은 어떠한 차이가 있을까요?

이제부터는 이런 샘플러들에 대해 자세히 알아보겠습니다. 상세한 기술적 세부사항은 너무 과할 수 있기 때문에 이글에서는 개략적으로 어떤 기능인지 파악하는 데 도움이 되는 정도만 간락하게 정리합니다.

고전적 ODE 해법(Old-school ODE Solver)

먼저 쉬운 것 부터 시작하겠습니다. 여러가지 샘플러중 일부는 백년 이상 이전에 발명되었습니다. 이들은 ODE(상미분 방정식, ordinary differential equations)를 위한 고전적인 해법입니다. 

  • Euler - 가장 간단한 해법
  • Heun - Euler 보다 좀더 정확하지만, 늦은 버전
  • LMS(Linear multi-step method) - Euler와 속도는 비슷하지만, 좀더 정확하다고 추정되는 버전

Ancestral 샘플러

일부 샘플러에는 아래와 같이 'a'가 추가된 것들이 있습니다.

  • Euler a
  • DPM2 a
  • DPM++ 2S a
  • DMP++ 2S a Karras

이들이 Ancestral 샘플러입니다. ancestral 샘플러는 각각의 샘플링 단계에서 이미지에 잡음을 추가합니다. 이들은 확률적 샘플러라고 하는데, 샘플링 결과가 약간 무작위성이 존재하기 때문입니다. 참고로 이름에 'a'가 있지 않더라도 확률적인 샘플러인 경우도 있습니다.

Ancestral 샘플러를 사용하면, 이미지가 수렴하지 않는다는 단점이 있습니다. 아래에서 보는 것처럼, Ancestral 샘플러는 일반 샘플러에 비해 단계별로 변화가 더 많습니다.

Euler 샘플러 Euler a 샘플러

Euler a 샘플러로 생성한 이미지의 경우, 샘플링 단계를 높여도 수렴하지 않습니다. 하지만 Euler 샘플러는 매우 잘 수렴합니다.

재생산이 중요할 경우 이미지 수렴도가 높은 것이 바람직할 것입니다. 

Karras 잡음 스케줄

샘플러 이름에 "Karras"가 포함된 것은 Karras 논문에서 추천된 잡음 스케줄을 사용합니다. 자세히 살펴보면, 끝부분에 잡음의 크기가 작은 것을 알 수 있습니다. 논문 저자들에 따르면 이를 통해 이미지의 품질이 향상된다고 합니다.

기본 잡음 스케줄과 Karras 잡음 스케줄 비교

DDIM 과 PLMS

DDIM(Denoising Diffusion Implicit Model)과 PLMS(Pseudo Linear Multi-Step method)는 스테이블 디퓨전 v1과 함께 공개된 샘플러입니다. DDIM은 디퓨전 모델을 위해 설계된 최초의 샘플러이며, PLMS는 DDIM보다 속도가 향상된 새로운 대체 버전입니다.

아들은 구식으로 취급되어 널리 사용되지 않습니다.

DPM. DPM2 및 DPM++

DPM(Diffusion probabilistic model solver)와 DPM++는 2022년에 디퓨전 모델을 위해 설계된 새로운 샘플러입니다. 이들은 유사항 아키텍처를 가진 대표적인 해법입니다.

DPM2는 DPM 과 비슷하지만, DPM2가 이차방정식을 사용해 좀더 정확하지만 느립니다.

DPM++는 DPM을 개선시킨 버전입니다.

DPM adaptive는 단계별 크기를 필요에 따라 조정합니다. 정해진 샘플링 단계 수 내에서 완료된다는 보장이 없어서 속도가 느릴 수 있습니다.

UniPC

UniPC(Unified Predictor-Corrector)는 2023년에 새로 공개된 샘플러입니다. ODE 해법중 predictor-corrector 기법에 영감을 받아, 5-10 단계에 고품질의 이미지를 생성할 수 있습니다.

k-디퓨전

마지막으로 k-diffusion이라는 용어를 들어보셨을 텐데요, 캐서린 크로우선(Katherine Crowson)의 k-diffusion 깃허비 저장보 및 그와 관련된 샘플러를 가리킵니다.

이 저장소는 Karras 2022 논문에서 연구된 샘플러를 구현합니다.

기본적으로 DDIM, PLMS, UniPC외에 AUTOMATIC1111에 존재하는 모든 샘플러는 k-diffusion에서 가져온 것입니다.

샘플러 평가

그럼 이렇게 많은 샘프러 중에서 어떤 것을 사용해야 할까요? 이 절에서는 몇가지 객관적인 비교를 제공합니다.

이미지 수렴도

여기에서는 샘플링 단계를 40으로 하고 여러가지 샘플러를 사용해 동일한 이미지를 생성하면서 비교해 보겠습니다. 최종 40단계의 이미지를 기준으로 하여 샘플러에 따라 얼마나 빠르게 수렴하는지 평가합니다. 기준 이미지는 Euler 샘플러를 사용했습니다. 

Euler, DDIM, PLMS, LMS Karras, Heun

먼저 Euler, DDIM, PLMS, LMS Karras, Heun 샘플러를 묶어서 살펴보겠습니다. 모두 고전적 상미분 방정식 해법 또는 원래의 디퓨전 해법을 대표하기 때문입니다. DDIM은 Euler와 같이 단계에 따라 수렴하지만, 좀더 변화가 많습니다. 이는 샘플링 단계에 무작위 잡음을 집어 넣기 때문입니다.

Euler, DDIM 등의 이미지 수렴도(낮을 수록 좋음)

PLMS는 이 테스트에서 그다지 좋은 성적을 거두지 못했으며, LMS Karras는 수렴에 어려움을 겪는 것으로 보입니다. 

이 테스트에서 가장 빨리 수렴한 것은 Heun 샘플러로서 이는 2차 방정식을 사용하기 때문입니다. 따라서 공정하게 비교하려면 Heun의 30 단계를 Euler의 15단계와 비교해야 합니다.

Ancestral 샘플러

안정적이고 재사용가능한 이미지가 목표라면 ancestral 샘플러는 사용하지 않는 것이 좋습니다. 아래 그림과 같이 모든 Ancestral 샘플러는 수렴되지 않습니다.

Ancestral 샘플러는 잘 수렴되지 않는다(낮을 수록 좋음)

DPM 및 DPM2

DPM fast는 잘 수렴되지 않습다. DPM2와 DPM2 Karras는 Euler에 비해 성능이 좋지만, 2배 정도 속도가 떨어집니다.

DPM adaptive는 자체 적응형이기 때문에 성능이 놀라우리만치 뛰어납니다. 하지만, 매우 느릴 수 있습니다.

DPM 샘플러의 수렴(낮을 수록 좋음)

DPM++

DPM++ SDE 와 DPM++ SDE Karras는 Ancestral 샘플러와 동일한 단점을 가지고 있습니다. 즉, 수렴하지 않을 뿐 아니라, 각 단계 사이에 이미지가 크게 달라집니다. 

DPM++ 2M 및 DPM++ 2M Karras는 잘 작동합니다. Karras 잡음 스케줄을 채택한 변형들은 단계가 충분하다면 더 빠르게 수렴됩니다.

DPM++ 샘플러의 수렴(낮을 수록 좋음)

UniPC

UniPC는 Euler에 비해 약간 느리게 수렴되지만, 그다지 나쁜 편은 아닙니다. 

UniPC 샘플러의 수렴(낮을 수록 좋음)

속도

DPM adaptive가 수렴 면에서 성능이 뛰어나지만, 제일 느리다는 것을 알 수 있습니다.

나머지 샘플러들은 거의 2가지 부류로 나누어집니다. 첫번째 그룹은 Euler와 비슷한 속도(1 배)이고, 다른 그룹은 2배의 시간이 걸립니다(2배 시간). 이는 알고리즘의 차수에 따른 결과입니다. 2차 해법은 좀더 정확하지만,  잡음제거 U-Net을 두번 평가하여야 하기 때문에 2배의 시간이 소요됩니다.

품질

물론 속도와 수렴도 중요하지만, 가장 중요한 것은 이미지의 품질이죠. 

최종 이미지

DPM++ fast는 꽤 심하게 나쁜 결과가 만들어졌습니다. 또한 Ancestral  샘플러는 다른 이미지에 대해 수렴하지 않아서 약간 다른 결과가 만들어짐을 알 수 있습니다. 그리고 Ancestral 샘플러는 아기 고양이 이미지로 수렵하는 경향이 있고, 기타 결정론적 샘플러는 성체 고양이로 수렴하는 경향이 있습니다. 이는 생성하는 사람의 선호도에 따를 뿐, 정답은 없습니다.

느낌적 품질

이미지가 수렴되지 않더라도 결과물은 좋을 수 있습니다. 여기에서는 각 샘플러가 얼마나 빨리 고품질 이미지를 생성하는지 살펴보겠습니다.

아래는 BRISQUE(Blinkd/Referenceless Image Spatial Quality Evaluator) 를 사용해 평가한 느낌적 품질입니다. BRISQUE는 자연적 이미지의 품질을 평가합니다.

여기에서는 놀랍게도 DDIM이 가장 좋은 성능이 나오는 것으로 나타나며, 8 단계 정도에서 가장 고품질의 이미지를 생산하는 것으로 평가됩니다.

DDIM, PLMS, Heun, LMS Karras의 이미지 품질(낮을수록 좋음)

한두개는 예외로 하고, 모든 Ancestral 샘플러는 이미지 품질 면에서 Euler 샘플러와 거의 비슷한 성능을 보입니다.

Ancestral 샘플러의 이미지 품질(낮을수록 좋음)

DPM2 샘플러 계열은 Euler 샘플러보다 약간 성능이 좋지 않습니다.

DPM 샘플러의 이미지 품질(낮을수록 좋음)

DPM++ SDE 및 DPM++ SDE Karras는 이미지 품질 면에서 가장 뛰어난 것으로 평가되었습니다.

DPM++ 계열의 샘플러의 이미지 품질(낮을수록 좋음)

UniPC는 Euler 샘플러보다 이미지 품질이 약간 낮은 것으로 나오지만 단계수가 늘어나면 차이가 거의 없습니다.

결론 - 어떤 샘플러가 가장 좋은가?

아래는 위의 여러가지 특성을 고려한 추천사항입니다.

  1. 빠르고 잘 수렴되며, 품질도 뛰어난 샘플러를 원한다면:
    • DPM++ 2M Karras (20-30 단계)
    • UniPC (20-30단계)
  2. 수렴여부는 따지지 않고 고품질의 이미지만 원한다면:
    • DPM++ SDE Karras(10-15 단계. 이 샘플러는 속도가 느림)
    • DDIM (10-15 단계)
  3. 안정적이고 재생성가능한 이미지를 원한다면 Ancestral 샘플러는 사용하지 말라.
  4. 그냥 신경쓰기 싫다면 Euler나 Heun으로 충분하다. Heun의 경우 샘플링 단계를 줄일 수 있다.

====

이상입니다. 이 글은 https://stable-diffusion-art.com/samplers/을 번역하여 작성하였으며, 뒷부분은 일부 생략하였습니다.