- 글쓴시간
- 분류 기술,IT/스테이블 디퓨전
SDXL 에서 VAE 는 FP32 으로 사용하곤 한다. FP16 으로 된 VAE 라도, FP32 으로 변환해서 사용한다. 이렇게 하는 이유가 SDXL 의 경우 VAE 를 사용해 이미지를 변환할 때, NaN 오류가 많이 발생하기 때문이다.
- 그래서 필자도 Stable Diffusion webUI (SDUI) 에서 --no-half-vae 옵션을 주어 사용했다. 이렇게 하면 NaN 이 발생하지 않아 이미지가 검게 생성되는 현상을 없앨 수 있었다. 반대로 이 옵션을 주지 않으면, 매우 자주 발생한다.
여태까지 --no-half-vae 옵션을 주면서 사용하다가, 최근에 이에 대한 패치가 나온걸 알 았다. VAE 에 대한 FP16 FIX 이다. SDXL-VAE-FP16-Fix 에 나와있는
https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/resolve/main/sdxl.vae.safetensors
을 다운로드 받아 사용하면 된다.
- VAE를 받아 SDUI 의 VAE 디렉토리에 넣고 이 VAE 를 사용하도록 세팅한다. 그리고 --no-half-vae 옵션을 사용하고 SDUI 를 실행해보면, 이미지 생성시 아래와 같이 메모리 사용량이 줄어드는걸 볼 수 있다.

SDXL 에서 FP16 VAE 으로 세팅하고 이미지를 생성시 전용 GPU 메모리 사용량

SDXL 에서 FP32 VAE 으로 세팅하고 이미지를 생성시 전용 GPU 메모리 사용량
FP32 VAE 사용시 마지막 단계에서 FP32 VAE 를 사용하기 위해 메모리 사용량이 급격히 (2배) 늘어나는걸 볼 수 있다. 이미지 품질에는 영향이 없기 때문에 FP16을 사용할 수 있으면 사용해야 한다.
- 시간과 메모리 사용량은 아래와 같이 비교된다.
FP32 VAE: 생성시간 4 min. 18.3 sec. A: 8.37 GB, R: 26.08 GB, Sys: 16.0/15.9961 GB (100.0%)
FP16 VAE: 생성시간 3 min. 49.4 sec. A: 5.22 GB, R: 9.99 GB, Sys: 11.2/15.9961 GB (69.8%)
- 또한 HiResFix 나 Upscale 작업시에는 VRAM 이 부족한 경우가 많다. 부족한 경우 Tiled VAE 를 사용할 수도 있지만, FP16을 사용할 수도 있을것 같다. 아니면 두가지 모두 사용하거나 말이다.
- FP16 VAE 를 사용해서 문제가 생기면(검은색 이미지가 생성되면) SDUI 의 아래 옵션을 체크해보자. NaN 이 발생하는 경우 자동으로 BF16이나 FP16으로 변환해 사용한다. BF16 을 사용하는 경우 GPU 에서 지원하는지 반드시 확인해야 한다. 잘 모르겟으면 해제하면 된다.
☑ Automatically convert VAE to bfloat16 ☑ Automatically revert VAE to 32-bit floats
- FP16 VAE 설명을 보면, NaN 이 자주 발생하는건 일부 활성화 값이 너무 크기 때문이라고 한다. 이 값을 조절하기 위해 몇가지 작업을 했다고 한다.

활성화 값이 큰 예시