윈디하나의 누리사랑방. 이런 저런 얘기

글쓴시간
분류 기술,IT/스테이블 디퓨전
SDXL 으로 생성할 때의 표준 해상도이다.

SDXL 은 다양한 해상도를 가진 이미지로 학습되어있는데, 이 해상도의 기준이 1024 x 1024 이다. 또한 내부적으로 64px 의 디멘션을 사용하기 때문에, 해상도는 64의 배수가 되어야 한다.

학습한 해상도인 1024 x 1024 가 가장 좋고, 512 ~ 1536 사이의 값으로 64 의 배수값으로 사용한다. 전체 픽셀수는 1.04M (1,090,519) 을 넘어서는 안된다.

보통 이미지는 아래 해상도로 생성하면 된다.

해상도      픽셀수    비율    
---------- --------- -------------
1344 x 768 1,032,192 1.75:1 16:9
1216 x 832 1,011,712 1.46:1 3:2
1152 x 896 1,032,192 1.28:1 4:3
1024 x 1024 1,048,576 1.00:1 1:1
1536 x 640 983,040 2.40:1 2.39:1

가로/세로를 바꿔서 생성해도 된다. 비율은 16:9 비율이 약 1.77:1 비율임을 생각하면 된다. 참고로 2.39:1 은 시네마스코프 비율이다.

필자의 경우 768 x 1344 를 선호한다. 16:9 에 가장 가깝기 때문에 그렇다. 두번째로는 832 x 1216 을 사용한다. 대략 3:2 비율이기 때문이다.

SDXL 은 생성할 이미지의 비율에 따라 이미지의 구도가 달라지기 때문에, 생성해보다가 구도가 맞지 않으면 다른 걸 사용해도 된다.

아래 이미지를 보자.

사용자 삽입 이미지

1536 x 640


사용자 삽입 이미지

1344 x 768


사용자 삽입 이미지

1216 x 832


사용자 삽입 이미지

1152 x 896


사용자 삽입 이미지

1024 x 1024


모두 동일한 프롬프트와 시드에서, 해상도만 변경해서 생성한 이미지다. 머리 모양과 흩날리는 정도가 이미지 비율에 따라 변경되는걸 볼 수 있다.
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - VAE FP16 vs FP32

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 이 자주 발생하는건 일부 활성화 값이 너무 크기 때문이라고 한다. 이 값을 조절하기 위해 몇가지 작업을 했다고 한다.

사용자 삽입 이미지

활성화 값이 큰 예시

글쓴시간
분류 기술,IT
VRAM 4G 이상 8G 이하의 nVidia GPU

남는 PC에 Stable Diffusion 1.5 를 원활히 돌리기 위해 8G 이하의 저렴한 GPU 를 구매하려 한다. 중고로 5만원 정도에 SD1.5 에 사용할 수 있는 쓸만한 4G VRAM 을 가진 GPU 를 구매하는게 목표이긴 하다. 아직은 그 이상 투자하려는건 아니다.

우선 어떤 모델이 있는지 확인해 봤다. 표에 정리된 모델명은 해당 제품군에서 해당 VRAM 을 가진 가장 낮은 사양의 모델이다.

VRAM | 10xx    16xx  20xx   30xx  40xx  50xx
-----+-------------------------------------
4G | 1050Ti 1650
6G | 1060 1660 2060 3050
8G | 1070 2060S 3050 4060 5050

이 모델들에 대한 2025.03.05 현재 가격을 알아보았다. 중고 업자에게 구매할 수 있는 가격이며, 직거래하는 경우 더 저렴한 가격에 구매할 수 있다. TDP 도 중요하기에 같이 적어놓았다.

모델   VRAM TGP  CUDA FP32   PRICE     VARIATION
------ ---- ---- ---- ------ --------- ---------------------------
1050Ti 4G 75W 768 2.138T 9만 중고
1650 4G 75W 896 2.984T 11만 중고 GDDR6, TU106, TU116, 1650S
1060 6G 120W 1280 4.375T 13만 중고 3G, 5G, GDDR5, GDDR5X
1660 6G 120W 1408 5.027T 16만 중고 1660S, 1660Ti
1070 8G 150W 1920 6.463T 17만 중고 GDDR5X, 1070Ti
2060 6G 160W 1920 6.451T 19만 중고 12G
2060S 8G 175W 2176 7.181T 25만 중고
3050 6G 70W 2304 6.774T 25만
3050 8G 130W 2560 9.098T 32만 GA107 (115W)
4060 8G 115W 3072 15.11T 45만 Ti
5050 8G 100W 2560 12.90T 250$ (예상)

1030 2G 30W 384 1.127T 10만 DDR4

※ 1650 은 기본 모델은 추가 전원 핀이 없지만, TU106, TU116 을 사용한 후기 버전은 추가 전원핀이 있고 전력을 더 소모한다. 이건 장단점이 있는데, 필자처럼 마더보드의 전력을 끌어 쓰지 않도록 구성하는걸 선호하는 경우에는 오히려 좋다. 마더보드의 전력은 CPU와 메모리에 집중해야 한다.

사용자 삽입 이미지

PALIT GeForce RTX™ 3050 KalmX 6GB. 3050 에서 유일한 무소음이다.



※ 글을 쓰다보니 3050이 눈에 보인다. 이건 중고가격도 15만원대다. 3050 은 3가지 버전이 있다.

- 3050 8G (GA106, 130W, 2560, 9.098T, 8핀) * 2022.01 출시
- 3050 8G (GA107, 115W, 2560, 9.098T, 6핀) * 2022.12 출시. MSI 에서 주로 출시했다.
- 3050 6G (GA107, 70W, 2304, 6.774T, X) * 2024.02 출시

3050 8G 인데 115W 인 GPU 가 있어서 찾아봤다. 주로 MSI 에서 발매한 기종으로 아래와 같다. 단종/판매중이라고 쓴 제품은 실제 우리나라에서 수입된 제품이다.

Colorful iGame RTX 3050 Ultra W DUO OC V2 (2팬, 249mm) 단종
Colorful Tomahawk RTX 3050 DUO V2         (2팬, 255mm) 단종
MSI RTX 3050 AERO ITX OCV1                (1팬, 168 mm)
MSI RTX 3050 AERO ITX V1                  (1팬, 168 mm)
MSI RTX 3050 VENTUS 2X OCV1               (2팬, 236 mm) 단종
MSI RTX 3050 VENTUS 2X V1                 (2팬, 236 mm)
MSI RTX 3050 VENTUS 2X XS                 (2팬, 205 mm)
MSI RTX 3050 VENTUS 2X XS OC              (2팬, 205 mm) 판매중. DVI 커넥터가 있다.

사용자 삽입 이미지

MSI RTX 3050 VENTUS 2X OCV



쓰고보니 3050이 좋아보인다. 에혀.

----

2025.03.10 수정
생각을 바꿨다. SDXL 까지 되는걸로 해야겠다. 지금 최소 필요한 용량을 확인해보고 있는 중이다. Tiled VAE 사용해도 최소 6GB 는 필요할 것으로 생각한다. 이렇게 되면 3050 6G 모델이 가장 좋아보이는데 저렴한 가격에 구매할 수 있을지 모르겠다. 애초에 계획했던 5만원대와는 멀어지게 되는거고 말이다.
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion WebUI 4K 이미지 생성 - Tiled VAE 사용

요즘엔 4K 이미지에 대한 목표가 없어졌다. 예전엔 그렇게도 생성하고 싶었었는데, 막상 할 수 있게 되고보니 그다지 갈망하지는 않는거 같다.

좀 다른 방법을 소개한다. Tiled Diffusion 플러그인을 사용하는 방법이다. 하는 방법은 아래와 같다.

1. SDUI 에서 Extensions 탭으로 간 후, TiledDiffusion with Tiled VAE manipulations 을 설치한다.

사용자 삽입 이미지

2. txt2img 탭으로 가서 이미지를 생성하기 위한 설정(프롬프트)을 하고, Hires Fix 를 선택한다. 최종 해상도가 4K 이상이 되도록 배율을 선택한다.

3. Tiled VAE 를 선택한다. 최소한 아래와 같은 설정이 필요하고 나머지 2개도 필요하면 체크해준다.

사용자 삽입 이미지

Encoder/Decoder Tile Size 는 가급적 크게 주는게 좋은데, 너무 크게 주면 CUDA error: out of memory 오류가 발생한다. 적당히 크게 세팅하자. 16GB VRAM 의 경우 1536, 96 으로 세팅한다. 8GB VRAM 의 경우 1024, 64 정도면 될것이다. 그 이하의 VRAM 을 사용하면 더 낮게 세팅해도 된다. 최소값은 256, 48 이다.

4. 생성을 눌러 이미지를 생성하자.

콘솔을 보면 아래와 같이 생성되는걸 확인해볼 수 있다.

100%|████████████████████████████████████████| 38/38 [02:51<00:00,  4.52s/it]
100%|████████████████████████████████████████| 76/76 [03:32<00:00, 3.83s/it]
[Tiled VAE]: input_size: torch.Size([1, 4, 320, 192]), tile_size: 96, padding: 11
[Tiled VAE]: split to 4x2 = 8 tiles. Optimal tile size 96x96, original tile size 96x96
[Tiled VAE]: Fast mode enabled, estimating group norm parameters on 57 x 96 image
[Tiled VAE]: Executing Decoder Task Queue: 100%|███████████| 984/984 [00:04<00:00, 213.04it/s]
[Tiled VAE]: Done in 5.675s, max VRAM alloc 3613.766 MB
Total progress: 100%|██████████████████████████████| 76/76 [03:41<00:00, 2.92s/it]

Tiled VAE 사용하지 않은 이미지와 사용한 이미지와는 차이나지 않는다.

VRAM 이 부족하지 않아도 이미지 생성시 GPU가 공유 메모리도 사용하고 있다면 Tiled VAE 를 사용해볼만 하다. 상당히 빨라진다. 필자의 경우 4:59 소요되던 스케일링 작업이 Tiled VAE 를 사용하면 3:45 정도 소요된다.
글쓴시간
분류 기술,IT
소프트웨어 업그레이드로 인한 CPU 발열 증가

- Ubuntu 22.04 -> 24.04 으로 업그레이드 했다.

사용자 삽입 이미지

- 이때문에 Stable Diffusion WebUI도 다시 설치하고, nVidia 드라이버를 다시 설치했는데 실행하고 보니 발열이 많아졌다.

상세하게 말하자면, GPU 의 발열은 줄었는데, CPU 의 발열은 늘었다.

GPU: 80°C -> 75°C
CPU: 70°C -> 80°C

- nVidia GPU 드라이버는 570.86 으로 변경했다. 현재 최신버전이다.

- Stable Diffusion WEBUI 에서의 PyTorch 와 CUDA 버전도 2.1.2+cu121 -> 2.3.1+cu121 으로 달라지긴 했다. 옵션은 동일하다. 메모리도 45% 정도 사용하던게 50% 정도 사용하고 있다.

뭔가 CPU에서 발열이 더 일어나고 있고, GPU 에서 발열이 적게 일어나는식으로 튜닝이 된 느낌이다. 마치, AVX2 를 사용하는 것 처럼 말이다. ( Intel® Core™ i7-7700K 발열 참조 )  문제는 CPU가 그것때문에 80도가 "유지"된다는거. 순간적으로는 100°C 으로도 올라가는거 같다. 수냉 쿨러를 점검해봤지만 이상 없었다.

- 이미지 생성이 느려진다는건 아니라서 그냥 쓰고는 있는데 뭔가 찜찜하긴 하다. 예정에도 없던 수냉 쿨러 바꿀 준비 해야할지도 모르겠다.