요즘에 가장 핫한 AI 알고리즘이 Transformer 라는 알고리즘이다. 대규모 언어 모델을 구현할때 많이 사용한다. xFormers 는 페이스북에서 만든 Transformers 기반의 성능향상 파이썬 모듈이다 nVidia CUDA 에 최적화되어있다. Stable Duffusion 에도 Transformers 가 있기 때문에, 이 부분을 성능향상시켜준다.
Transformer 아키텍처.라고 한다.
몇일전에 xFormers 0.0.20 이 나왔다. 성능이꽤 많이 향상되었다고 해서, 한번 써 봤다.
2023.05.26 현재 Stable Diffusion webUI에서 소스 수정없이 설치되는 xFormers 버전은 0.0.17 이다. 조만간 0.0.20 을 사용하도록 변경할 것으로 생각한다.
필자는 RTX 2060 12G 을 사용하고 있다. nVidia 홈페이지에서 윈도11용 드라이버를 새로 받았고, Stable Diffusion 디렉토리의 venv디렉토리를 지우고, launch.py 를 수정해 xFormers 0.0.20 을 설치했다.
결론부터 말하자면, 꽤 만족할만한 성능 향상이 있었다. xFormers 0.0.17 으로 2:27 걸리던 이미지 생성시간이 XFormers 0.0.20 으로 업그레이드 하니 2:04 이 걸렸다. 20여초나 단축한 셈. 매우 많은 성능향상이다.
LoRA 적용시 오류 - output with shape {param} doesn't match the broadcast shape {param}
Traceback (most recent call last): File "C:\stable-diffusion-webui\extensions\a1111-sd-webui-lycoris\..\..\extensions-builtin/Lora\lora.py", line 215, in load_loras lora = load_lora(name, lora_on_disk.filename) File "C:\stable-diffusion-webui\extensions\a1111-sd-webui-lycoris\..\..\extensions-builtin/Lora\lora.py", line 176, in load_lora module.weight.copy_(weight) RuntimeError: output with shape [4, 320, 1, 1] doesn't match the broadcast shape [4, 320, 3, 3]
이와같이 나오는 이유는 적용하려는 파일(.safetensor, .pt 파일)이 LoRA용 파일이 아니기 때문이다. 이런 파일은 LoRA 의 확장 규격을 사용한 거라, 현재 Stable Diffusion WebUI 에서 사용하려면 LyCORIS 사용해야한다. 파일이름, 파일 크기만 가지고는 LoRA 인지 LyCORIS 용인지 명확하게 구분이 안된다. (그래도 LyCORIS 용 파일은 파일 크기가 수십메라 정도로 작다)
프롬프트도 <lyco:***:1.0> 처럼 사용해야 한다. <lora:***:1.0> 이 아니다.
- 확장 LoRA 는 [*, *, 1, 1] 에서 [*, *, 3, 3] 과 같이 뒤의 2개 숫자가 1 에서 3으로 변경되었다. (이건 프로그래밍에서 4차원 배열 정도로 생각하면 된다) 이게 확장 LoRA 규격이다.
----
2023.05.26 추가
Stable Diffusion WebUI 를 최신 버전으로 패치하면 LoRA 로 적용 된다. (LyCORIS 쓸 필요 없다) 기존에는 [*, *, 3, 3] 형식의 LoRA 를 지원하지 않았다고 한다.
체크포인트 변경하고 생성한 이미지들이다. 순수하게 AI 로만 생성하고 후보정(예를 들어 포토샵을 사용한 보정)도 하지 않은 AI 가 생성한 이미지 그대로 게시한다.
실사처럼 보이지도, 만화처럼 보이지도 않는, AI 로만 그릴 수 있는 디테일 있는 그림을 원했고, 이제 어느정도 맞는거 같다. 앞으로도 계속 이미지 생성 하면서 조금씩 변하겠지만 말이다. SD 2.1 도 아직 사용하지 않고 있는거라, 앞으로도 꽤 많은 변화가 있긴 할거 같다. 몇개월, 몇년 후에 서서히 바뀌는 그림들 보면 재미있을것 같다.
2023.04.16 에 생성해서 사용하던 체크포인트를 5월 5일자로 교체했다. 다른 체크포인트를 하나 더 머지 했다. 전체적으로 이미지가 밝아진 느낌.
체크포인트 머지 비율로 많이 고민하다가 결국 마지막 이미지에 사용된 체크포인트를 사용하기로 했다. 입력한 프롬프트에 더 알맞는 이미지가 나왔기 때문이다. 프롬프트 가중치나 로라를 사용해 튜닝이 가능한 항목은 체크포인트를 선택하는데 있어 중요하게 생각하지 않는다. 결과적으로 프롬프트가 잘 먹히는 체크포인트가 좋은거다.
체크포인트를 교체하면, 기존에 해놓았던 시드가 먹히질 않는다. 당연한거라서, 이부분은 신경 안썼다. 어차피 프롬프트의 웨이트 수정해서 다시 생성중이다. 이런것도 한달 주기로 반복할 듯.