Stable Diffusion WebUI (이하 SD) 사용하다보면 같은 프롬프트를 주었는데도 유사한 이미지를 생성하지 못하는 경우가 꽤 자주 있다. 원인은 모르겠지만, 프롬프트 외에도, SD 실행시 옵션이나 설정이 달라지면 같은 프롬프트로도 완전히 다른 이미지가 생성되는것 같다.
재미있는건 이 현상이 이미지 업스케일링에서도 일어난다는 거다. txt2img 에서 hi.res fix 를 사용하거나, img2img 탭에서 업스케일링하는 경우에 업스케일링 전 이미지와 살짝 다른 이미지를 생성해 낸다. 그게 더 좋아보이기 때문에 사용하고 있다. 어쨌든 img2img 탭에서는 프롬프트를 입력하도록 되어있고 이 프롬프트를 업스케일링할때 사용한다.
이 문서에서는 프롬프트를 사용해 업스케일링 하는 방법을 이야기 한다. AI를 사용한 이미지 업스케일링은 Extra 탭에서 사용하고 추후 다룰 것이다.
※ 이미지 생성시에 사용한 프롬프트를 가지고 있지 않은 경우
img2img 탭에서 프롬프트 없이 실행.
프롬프트를 사용하지 않은 이미지 업스케일링
단, 단순 업 스케일링 하는 경우 PNG 파일에는 프롬프트가 남지 않는다. 프롬프트를 입력하지 않아도 업스케일 되기 떄문에, 필자는 입력하지 않는다. 또한 선명함이 조금 낮아진다. 그래도 프롬프트를 전혀 알 수 없을때 SD 를 사용해야할때 할 수 있는 방법이다. 추천하는 방법이 아니다. 프롬프트 없으면 Extra 탭 사용하자.
※ 이미지 생성시에 사용한 프롬프트를 가지고 있지만, txt2img 탭에서 프롬프트를 사용했을 때 같은 이미지가 생성되지 않는 경우
img2img 탭 하단의 Script 드롭박스에서 SD upscale 을 선택한 후 Upscaler 를 선택해 사용
원래는 다른 이미지를 얻기 위한 프롬프트인데, 시드를 높이면서 이미지를 생성하면 아래와 같이 입력한 프롬프트와 다른 이미지를 그려주기도 한다. 그런데, 이게 맘에 드는 경우가 있다. 뭔가 과하게 학습되었다고 생각되는데, 그게 나름 괜찮다. 다른 모델들 보다 animePastelDream 이 조금 심한것 같긴 하다. 아래는 그 사진들이다. 1920 x 1080 해상도로 업스케일 했다. 윈도 바탕화면 용이다.
② 은 FP32로 학습한 체크포인트를 FP16 으로 수행하기 전에 FP16 으로 변환하는데, 처음 체크포인트 변환시 10.1G, VAE 변환시 8.9G 를 소비한다. 재 실행시에는 변환작업이 없다.
생성한 이미지
①
③
④
메모리 사용
①
②③
④
------------
참고: GT1030, --lowvram
이미지크기: 384 x 768
① FP16 체크포인트, FP32 실행 chilloutmix_NiPrunedFp16Fix FP32 1952MiB Total progress: 100%|██████████████████████████████████████████████████████████████████| 20/20 [08:10<00:00, 25.61s/it]
② FP16 체크포인트, FP16실행 chilloutmix_NiPrunedFp16Fix FP16 1350MiB Total progress: 100%|██████████████████████████████████████████████████████████████████| 20/20 [05:10<00:00, 16.15s/it]
nVidia 제품에서, FP32 와 FP16 성능이 얼마나 차이나는지 확인해보려다가, 이왕 하는거 CUDA 가 들어있는 세대부터 FP16, FP32, FP64 성능을 정리해봤다. 기준이 되는 모델은 각 세대의 xx60 모델이다. 단위는 Flops 으로 GPU Database | TechPowerUp 에 나와있는걸 인용했다. 이 수치는 레퍼런스 스펙을 가질때의 이론상의 스펙이다.
아래 표에서 G 는 Giga, T 는 Tera 의 약어로 1T Flops = 1000G Flops 이다. flops 는 FLoating point Operations Per Second 의 약어로, 1초동안 수행할 수 있는 부동소수점 연산의 회수를 의미한다. FP16, FP32, FP64는 각각 16/32/64 비트 부동소수점 연산 회수를 의미한다.
Product Code name CUDA FP16 FP32 FP64 FP32향상비율 ----------- ------------ ---- ------------- ----------- -------------- ----------- 8600 Tesla 1.1 x 92.80G x 9600 x 278.4G x 3.00 260 1.3 x 476.9G 59.62G (1:8) 1.71 460 Fermi 2.1 x 907.2G 75.60G (1:12) 1.90 560 x 1,089G 90.72G (1:12) 2.28 660 Kepler 3.0 x 1.981T 82.56G (1:24) 1.82 760 x 2.378T 99.07G (1:24) 1.20 960 Maxwell 5.2 x 2.413T 75.39G (1:32) 1.01 1060 6G Pascal 6.1 68.36G (1:64) 4.375T 136.7G (1:32) 1.81 1660 Turing 7.5 10.05T (2:1) 5.027T 157.1G (1:32) - 2060 12G 14.36T (2:1) 7.181T 224.4G (1:32) 1.64 3060 12G Ampere 8.6 12.74T 12.74T 199.0G (1:64) 1.77 4060 Ada Lovelace 8.9 15.11T 15.11T 236.2G (1:64) 1.18 5060 Blackwell 2 10.1 19.18T 19.18T 299.6G (1:64) 1.26
참고 4060 Ti 16G Ada Lovelace 8.9 22.06T 22.06T 344.8G (1:64) 5060 Ti 16G Blackwell 2 10.1 23.70T 23.70T 370.4G (1:64)
위 표는 FP16, FP32, FP64 의 연산 속도를 나타낸 것이다. 단 Turing 아키텍처부터 있는 Tensor/RT 코어를 사용한 연산은 포함되지 않았다. 즉 GPU 코어만을 사용한 연산 속도를 나타냈다.
CUDA는 2006년 11월 8일에 발표된 8800 GTX 가 CUDA 1.0 을 지원하면서 처음 선보였다. 이후 2014년 선보인 900번대인 Maxwell 아키텍처부터 AI 에 유용하게 사용되었다. 처음에는 CUDA 의 가능성만 보고 nVidia 에서 투자했다가 이제야 빛을 보게 된 셈. 처음에는 CUDA 에서 FP32 만 지원되었다가 200번대에 와서 FP64가 지원되고, 1000 번대부터 부터 FP16이 지원되었다. FP16은 AI 연산에서 사용된다.
AI에서 주로 사용되는 형식인 INT8 은 CUDA 7.5 부터, INT 4 는 CUDA 8.0 부터, FP8 은 CUDA 8.9 부터 지원된다.
최근에 나온 40xx번대 GPU 는 FP8 도 지원하지만 텐서코어에서 지원하는 것이기 때문에 이 표에서 적지 않았다. 텐서코어를 이용한 4090 GPU 의 경우 FP8 성능은 660TFLOPS 정도다. (하지만 이 성능을 AI 에서 사용하지는 못한다. 말 그대로 텐서코어에서 지원하기 때문이다)
올해 7월 출시 예정인 4060으로 변경할 생각은 있긴 한데 VRAM 이 12GB 이 나오지 않는다고 한다. 이렇게 되면 4060Ti 16GB 모델로 변경해야할것 같다. 어쨌든 같은 성능에 전력소모는 확 줄어들것이기 때문에 쓰긴 써야 한다고 생각한다. 게임하는데에는 안좋지만 말이다. 하나 더 걸리는게 4060을 사용해도 예상대로라면 2060 FP16보다 1.35배 성능이 빨라진다. 가격은 1.35배 차이가 아닐 것 같은데 말이다. 에혀.
지금은 Stable Diffusion 실행시킬 때 FP32 을 사용하고 있지만, 이 표를 보니 FP16 써야 할것 같다. 지금 사용하고 있는 2060은 FP16 연산 능력이 FP32에 비해 2배 빠르기 때문이다. 또한 FP16으로 실행하면, 12GB VRAM 으로도 4K 이미지를 생성할 수 있을것 같기도 하고 말이다.