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

글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion web UI - LoRA

Stable Diffusion web UI (이하 SD) 를 사용하다보면 반드시 사용하게 되는 SD 의 기능이 있다. LoRA (Low-Rank Adaptation of Large Language Models) 가 가장 많이 사용된다. 여기서 Large Language Models 는 Transformer 를 이야기하는거고 Stable Diffusion 에도 Transformer 가 있기 때문에 이 부분에 적용된다.

학습된 파라메터(SD 에서는 체크포인트)를 파인튜닝(미세조정)하려면 재학습 시켜야 하는데, 재학습시키는건 비용(=시간)이 많이 들기 때문에 조금 변형해서 학습 시킨다. 그 변형하는 방법이 "Low-Rank Adaptation" 이다. 예를 들어 1000 x 2000 행렬을 1000 x 2 + 2000 x 2 로 해서 학습할 파라메터를 줄인다. 그렇게 학습된게 LoRA 다.

이후에 LoCon(Conventional LoRA) 이라는 기법나오고, LoCon 을 발전시킨 LoHa(LoRA with Hadamard Product representation) 라는 기법이 더 나왔다. SD에서는 LyCORIS(Lora beYond Conventional methods, Other Rank adaptation Implementations) 라는 확장 프로그램을 사용해 LoCon 과 LoHa 를 사용할 수 있다.

물론 학습이 쉬워졌다(=낮은 사양에서도 실질적으로 학습 할 수 있다)는 이야기지, 대충 만들어도 좋게 나온다는 의미는 아니다. 그래도 학습에 필요한 양질의 이미지를 준비해야하기 때문에, 상당한 노력과 시간이 필요하긴 하다.

필자가 생성하는 거의 모든 이미지에 koreanDollLikeness_v10 를 사용한다. 심지어 koreanDollLikeness_v20 이 나오긴 했지만 안쓴다. 맘에 드는 LoRA 하나 정도는 찾아 놓는것도 좋을것 같다. 아래 이미지는 이를 사용해 생성한 이미지다.

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - 스탭

SD를 사용하다보면, 스탭을 몇번에 놓을지 고민하게 된다. 필자는 처음에는 24 스텝을 사용하고, 업스케일링할 때에는 30으로 놓고 업스케일링 한다. 스텝을 늘이는 이유는 더 선명해지고, 디테일이 증가하기 때문이다.

하지만 이렇게 하다보면 간혹 스텝 24일때와 스텝 30일때 큰 변화를 가지게 되는 경우가 생긴다. 대부분의 이미지는 30으로 설정할 때 더 선명해지기만 하지만, 그렇지 않은게 간혹 나온다. 아래와 같이 말이다.

사용자 삽입 이미지


사용자 삽입 이미지

아래와 같아지는 경우도 있다.

사용자 삽입 이미지

사용자 삽입 이미지

하지만, 선명한 이미지는 스케일업할 때에도 할 수 있고, 그래서 필자는 이런 경우는 스텝을 늘여서 제작하지 않는다. 특히 18, 19, 20, 21 스텝이 이미지가 판이하게 다르게 나오곤 한다. 공통적으로 프롬프트가 적용되는 강도가 달라지는 거지만, 강하게 적용된다고 모두 내 맘에 든다는 아니니 말이다. 그렇다고 모든 스텝을 다 확인해볼 수는 없는 노릇이고 말이다. 어떻게 효율적으로 확인해보는 방법 없을지 고민이다.
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - 윈디하나#1 체크포인트 사용

체크포인트 바꾸려고 이리저리 머지 해보다가 하나 건졌다. 이를 윈디하나#1 이라고 명명했다. ㅎㅎ

서브컬처에서 에니메이션풍 그림을 "2D", 사진풍 그림을 "3D" 라고 한다. 이의 중간정도 되는게 "2.5D"라고 하는데, AI 로 생성한 그림들이 주로 이 레벨이다. 그래야 위화감이 별로 없을 거라 생각한다. 실사와 너무 같으면 불쾌한골짜기도 생기고 말이다.

하지만 필자는 2.5D 에서 더 에니메이션 풍을 원했다. 그렇다면 2.3D 정도 되려나. 아래 사진정도면 2.3D 라고 봐줄만 하지 않을까?

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - 체크포인트 머지

인물 사진 얼굴을 변경해보기 위해 체크포인트 머지했다. 얼굴을 변경하는 많은 방법이 있겠지만, 로라사용하는 것 외에는 이게 가장 먼저 생각 났다. 예쁜 얼굴을 만들기 위함이다.

사용자 삽입 이미지

기본적으로 WebUI 에서 머지를 지원한다. 여러가지 모델에 대해 문제 없이 머지되도록 잘 되어있기 때문에 이를 사용해 머지한게 많다. 그냥 체크 포인트 두개 선택하고, 비율 조절해준 다음 safetensors 선택해서 머지해주면 된다. 위 사진과 같이 하면 체크포인트 해시 "ca883fecc7" 값을 가지는 safetensor 파일이 나온다. 이 조합법이 한때 많이 유행했다고 한다.

이렇게 하면 같은 시드, 같은 프롬프트라도 다른 이미지가 나온다. 아래와 같이 말이다. 다른건 몰라도 얼굴형을 미세 조정 하는건 어렵기 때문에 얼굴만 봤다. 이중 맘에 드는거 하나 골랐다. ㅎㅎ

사용자 삽입 이미지



사용자 삽입 이미지

사용자 삽입 이미지
글쓴시간
분류 기술,IT/하드웨어 정보
마이크로닉스 PCIe 4.0 200mm 라이저 케이블

사용자 삽입 이미지

라이저케이블을 사용해 VGA 를 수직 장착했다. 배송비 별도 4.95 만냥에 구매했다. 사용하고 있는 2060이 기가바이트 윈드포스라 바람이 그래픽 카드 위로도 나온다. 따라서 수평 장착시 케이스 측면을 향해 뜨거운 바람이 불게되고, 이때문에 뜨거운 바람이 다시 케이스 안으로 들어가게 된다. 여러모로 발열을 해결하는데 있어 문제가 되기 때문에 수직 장착으로 해결했다. 수직 장착하면 케이스 후면 팬으로 뜨거운 바람이 나가게 된다. 케이스 내부 온도는 쉽게 체감될 정도로 낮아졌고, 그래픽 카드 온도는 72 도 정도로 수직장착 전보다 3도 낮아진걸로 측정되긴 했지만 큰 차이 없는듯 하다.

라이저케이블을 사용해 그래픽 카드를 장착하게 되면, 그래픽 카드가 붕 뜨게 된다. 그냥 그래픽 카드가 떠있는 상태에서 그래픽 카드 받침대를 사용해 지지하고, 라이저케이블을 사용해 마더보드의 PCIe 16 포트와 그래픽 카드의 접속 단자를 연결해주는식으로 설치한다. 초기에는 PCIe 3.0 용 케이블만 판매했고 품질도 조악했었다고 하는데, 요즘 판매되는건 PCIe 4.0 용 케이블이고 속도저하도 없다고하며 무었보다 5만원정도로 저렴하게 구매할 수 있다.

사용자 삽입 이미지

필자의 경우도 다행이 성능 저하는 없는듯 하지만, 현재 사용하고 있는 마더보드는 PCIe 3 까지만 지원하는거라 PCIe 4 로는 확인 못했다.

사용자 삽입 이미지

L610 수직 장착


케이스에 따라 전용 라이저 장치를 달 수 있는경우도 있지만, 그렇게 하면 다른 확장포트를 전혀 쓰질 못하게 되어서 이런식으로 장착했다. 케이스에 수직으로 장착해 고정할 수 있는 확장 포트가 있고, 라이저케이블을 끼울 수 있을 정도의 공간이 있다면, 다른 케이스에도 장치하는건 어렵지 않을것 같다. 참고로 필자는 3RSYS L610 를 사용한다.

사용자 삽입 이미지
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion WebUI - img2img 이미지 업스케일링

Stable Diffusion WebUI (이하 SD) 사용하다보면 같은 프롬프트를 주었는데도 유사한 이미지를 생성하지 못하는 경우가 꽤 자주 있다. 원인은 모르겠지만, 프롬프트 외에도, SD 실행시 옵션이나 설정이 달라지면 같은 프롬프트로도 완전히 다른 이미지가 생성되는것 같다.

재미있는건 이 현상이 이미지 업스케일링에서도 일어난다는 거다. txt2img 에서 hi.res fix 를 사용하거나, img2img 탭에서 업스케일링하는 경우에 업스케일링 전 이미지와 살짝 다른 이미지를 생성해 낸다. 그게 더 좋아보이기 때문에 사용하고 있다. 어쨌든 img2img 탭에서는 프롬프트를 입력하도록 되어있고 이 프롬프트를 업스케일링할때 사용한다.

이 문서에서는 프롬프트를 사용해 업스케일링 하는 방법을 이야기 한다. AI를 사용한 이미지 업스케일링은 Extra 탭에서 사용하고 추후 다룰 것이다.

이미지 생성시에 사용한 프롬프트를 가지고 있지 않은 경우

img2img 탭에서 프롬프트 없이 실행.
사용자 삽입 이미지

프롬프트를 사용하지 않은 이미지 업스케일링


단, 단순 업 스케일링 하는 경우 PNG 파일에는 프롬프트가 남지 않는다. 프롬프트를 입력하지 않아도 업스케일 되기 떄문에, 필자는 입력하지 않는다. 또한 선명함이 조금 낮아진다. 그래도 프롬프트를 전혀 알 수 없을때 SD 를 사용해야할때 할 수 있는 방법이다. 추천하는 방법이 아니다. 프롬프트 없으면 Extra 탭 사용하자.

※ 이미지 생성시에 사용한 프롬프트를 가지고 있지만, txt2img 탭에서 프롬프트를 사용했을 때 같은 이미지가 생성되지 않는 경우

img2img 탭 하단의 Script 드롭박스에서 SD upscale 을 선택한 후 Upscaler 를 선택해 사용

사용자 삽입 이미지

프롬프트를 사용한 이미지 업스케일링. (스크린샷에서 프롬프트는 삭제되어있다)


매우 쓸만해지고 선명해진다.


아래는 업스케일링한 이미지들이다.

사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - animePastelDream 사진

파스텔 풍 그림 그려주는 모델이다. 써본 것 중에 가장 괜찮은것 같다.

원래는 다른 이미지를 얻기 위한 프롬프트인데, 시드를 높이면서 이미지를 생성하면 아래와 같이 입력한 프롬프트와 다른 이미지를 그려주기도 한다. 그런데, 이게 맘에 드는 경우가 있다. 뭔가 과하게 학습되었다고 생각되는데, 그게 나름 괜찮다. 다른 모델들 보다 animePastelDream  이 조금 심한것 같긴 하다. 아래는 그 사진들이다. 1920 x 1080 해상도로 업스케일 했다. 윈도 바탕화면 용이다.

사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지

글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - FP16,  FP32 성능, 차이

FP16과 FP32 가 어떤 차이가 있을까 궁금해서 한번 테스트 했다. 결론을 먼저 말하자면, 그냥 FP16 사용하자. 사용하는데에는 결과물에 차이 없고 메모리를 더 적게 사용하기 때문에, FP16 사용해야 한다.

nVidia RTX 2060 에서 테스트했다. 참고로 20 시리즈는 FP16 이 FP32 보다 연산능력이 2배 좋다. 30 시리즈부터 FP16 과 FP32 연산능력이 동일하다.

이미지크기는  504 x 960 으로 했다.

① FP32 체크포인트, FP32 실행
chilloutmix_NiPrunedFp32Fix         FP32  5.1G -> 5.9G -> 7.7G -> 5.1G
Total progress: 100%|██████████████████████████████████████████████████████████████████| 28/28 [00:46<00:00,  1.48s/it]

② FP32 체크포인트, FP16 변환

chilloutmix_NiPrunedFp32Fix FP32 -> FP16  2.6 -> 10.1 -> 8.9G -> 3.0G
100%|████████████████████████████████████████████████████████████████████████████████| 28/28 [00:28<00:00,  1.01s/it]
Total progress: 100%|██████████████████████████████████████████████████████████████████| 28/28 [00:24<00:00,  1.15it/s]
Total progress: 100%|██████████████████████████████████████████████████████████████████| 28/28 [00:24<00:00,  1.57it/s]

③ FP32 체크포인트, FP16 실행

chilloutmix_NiPrunedFp32Fix         FP16  3.0G -> 3.3G -> 5.1G -> 3.0G
Total progress: 100%|██████████████████████████████████████████████████████████████████| 28/28 [00:17<00:00,  1.61it/s]

④ FP16 체크포인트, FP16 실행

chilloutmix_NiPrunedFp16Fix         FP16  3.0G -> 3.3G -> 3.0G
Total progress: 100%|██████████████████████████████████████████████████████████████████| 28/28 [00:17<00:00,  1.62it/s] 

② 은 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]
글쓴시간
분류 기술,IT/스테이블 디퓨전
Stable Diffusion - FP16 을 사용한 사진 네장

FP16 을 사용해서 생성했다. FP32 를 사용한 것과 차이는 느껴지지 않는다.

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지
글쓴시간
분류 기술,IT
nVidia FP16,  FP32, FP64 성능

사용자 삽입 이미지


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 10.1 23.22T 23.22T 362.9G (1:64) 1.47 (예상치)

참고
3060 Ti Ampere 8.6 16.20T 16.20T 253.1G (1:64)
4060 Ti 16G Ada Lovelace 8.9 22.06T 22.06T 344.8G (1:64) 1.36
3070 8.6 20.31T 20.31T 317.4G (1:64)
4070 8.9 29.15T 29.15T 455.4G (1:64) 1.43

가장 처음 CUDA 를 선보인건 GeForce 8000번대 제품 부터다. 이때에는 FP32 만 지원되었다. 이후 200번대에 와서 FP64가 지원되고, 이후 1000 번대부터 부터 FP16이 지원되었다. FP16은 AI 연산에서 사용된다.

최근에 나온 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 이미지를 생성할 수 있을것 같기도 하고 말이다.

----

Stable Diffusion - FP16, FP32 성능

----

2023.04.17

RTX2060 12GB에서 FP16으로 이미지를 생성하고 있긴 하지만, 4K 이미지는 생성 못하고 있다. VRAM 메모리 부족때문이다. 뭔가 방법을 찾는 중.

----

2023.09.28

4K 이미지는 Upscaler 사용해서 생성하고있다.