첫 번째로, DiffussionBee
로 대체해서 사용할 것을 꼭 고려해보자. 설치 이후 작동하면서도 수많은 에러와 부딪치게 된다. DiffussionBee는 Intel Mac 전용 설치도 지원해줘서 손쉽게 이용이 가능하다.
두 번째로, 맥북을 새로 사는 것을 추천한다. M1/M2가 아닌 Intel Mac이 지원이 안되는 경우를 맞닥뜨리고 나니, 이제 슬슬 정말 갈아타야될 것 같다는 생각을 하게되었다.
마지막으로, 파이썬 딥러닝 라이브러리 공부를 해서, 어느 환경에서든 최적화를 해서 사용할 수 있는 경지에 올라라.
위 3가지 경우를 다 고려하고도 Intel Mac으로 WebUI를 쓸 거면 필자의 사례로 설명하도록 하겠다.
하드 스펙
CPU: Intel Core i9 8코어
GPU: AMD Radeon Pro 5500M 4 GB
RAM: 16GB
웹개발하면서 사용하기에는 무난한 스펙이다. 고질적인 문제로 인한 발열 문제 빼고는 정말 괜찮다.
하지만 이번에 AI 이미지 생성을 주제로 한 프로젝트를 진행하며, 필자는 게임 붐이 있고난 이후 AI가 또 한 번 개인컴퓨터 시장에 파장을 줄 것 같다는 생각을 했다. 위 스펙으로 이미지 한 장을 뽑아내는데 DiffussionBee를 통해서 2분이 걸렸다. 결과적으로 필자가 WebUI를 사용해서 이미지를 뽑는 데 성공한 시간은 5분이다.
WebUI를 통해 이미지를 뽑아낼 수 있었던 방법은 사실 CPU만 사용을 했기 때문이다. 짧은 식견으로도 AI나 딥러닝에서는 CPU보다 GPU가 더 효율이 좋다는 것을 알고있다. 어떻게든 GPU로 돌리려고 노력해봤지만, 노력의 결과는 완전히 깨져버린 이미지들이었다. 그래도 필사의 노력을 해서 이 노트북으로 WebUI로 이미지를 뽑아냈다.
NansException: A tensor with all NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.
우선 WebUI README 에서 설명해준 결과 제일 먼저 맞닥뜨리는 문제는 이 문제였다. 여기서 하라는데로 --no-half
를 추가하면 변동사항이 없다. 대신 --disable-nan-check
를 추가하면 검은색 이미지만 출력된다.
RuntimeError: MPS backend out of memory (MPS allocated: 5.05 GB, other allocations: 1.28 GB, max allowed: 6.77 GB). Tried to allocate 1024.00 MB on private pool. Use PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 to disable upper limit for memory allocations (may cause system failure).
이 에러의 가장 큰 원인은 GPU 스펙이 낮았기 때문이라고 추측하고 있다. GPU 사용을 포기하게 되는 가장 문제였다.
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --precision full --no-half --use-cpu interrogate --lowvram"
--no-half
와 --precision full
은 커뮤니티에서 AMD 그래픽 카드를 이용하고 있으면 인자로 추가하라고 설명이 되어있어 추가했다. 그리고 --lowvram
같은 경우는 GPU의 램을 적게 사용하기 위해서 추가했다. 이렇게 하면 문제가 해결되어 시간이 오래걸리더라도 이미지가 생성될 것 같았다. 이전에 메모리 문제로 인한 런타임에러가 발생하는 것과는 달리, 이번에는 이미지 추출이 끝까지 이루어졌기 때문이다. 하지만 생성된 이미지는 프롬프트에 어떤 내용이 작성되어있든 상관없이 다음과 같이 출력되었다.
[이미지 깨짐]
해당 문제는 필자로서는 해결할 도리가 없었다. 왜냐하면 도중에 에러가 난 것도 아니고, WebUI는 나름대로 이미지를 생성해서 출력한 것이기 때문이다. 계속해서 똑같은 문제가 발생해서 다른 방법을 찾아야 했다.
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --precision full --no-half --use-cpu all"
이렇게 입력 인자를 구성하였을 때 드디어 WebUI가 정상 작동했다. 바뀐 것은 --use-cpu all
이고 --no-half
가 꼭 있어야 CPU 작동이 가능하다. --no-half
가 없으면 또 에러가 난다.