Stable Diffusion을 Apple Silicon M1, M2에서 CUDA대신 CoreML로 실행하는 방법

2022. 12. 5. 16:49Stable Diffusion 2.0

 

AP에서 적지 않은 공간을 차지하고 있는 뉴럴엔진의 혜택을 12월 1일부터 볼 수 있게 되었습니다

https://stablediffusion.tistory.com/entry/Apple-SiliconM1-M2-Model%EC%97%90%EC%84%9C-%EC%84%B1%EB%8A%A5%EC%9D%B4-%EC%A2%8B%EC%9D%80-Stable-Diffusion-%EC%93%B0%EB%8A%94-%EB%B2%95

 

Apple Silicon(M1, M2 Model)에서 성능이 좋은 Stable Diffusion 쓰는 법

Apple Silicon(Mac AP, M1, M2 Model)에서 성능이 좋은 Stable Diffusion 쓰는 법 Intel 기반의 맥북, 맥북에어, 맥프로, 맥미니 등과 달리 맥 실리콘을 탑재한 M1, M2 모델의 경우 PyTorch가 뉴럴 엔진/GPU 자원을 제대

stablediffusion.tistory.com

이전 글타래에서 적었던 nVidia CUDA 지원 대신 CoreML을 이용하여 Stable Diffusion의 성능을 맥북, 맥미니, 맥프로 등에서 높여서 실행하는 방법에 대한 설명을 좀 더 부연하고자 합니다.

 

2022년 12월 1일에 Stable Diffusion을 CoreML 지원 모델로 사용할 수 있는 패키지 등이 완성되어 릴리즈 되었습니다. 이는 애플과 Stable Diffusion의 협업을 통해 애플 기종의 CPU만을 사용하지 않고, GPU 혹은 GPU와 애플 뉴럴엔진을 활용하여 Stable Diffusion을 실행시킬 수 있게 되었습니다. 

Diffusion models의 선행학습이 가능한 Diffusers에서는 PyTorch를 사용하는데, 며칠 전까지(2022년 12월 1일)는 이 PyTorch는 CUDA 혹은 CPU 자원만을 활용할 수 있었으나, 애플의 뉴럴엔진 관련 소프트웨어 지원을 통해 엄청난 성능향상을 이뤄냈습니다. (글의 뒤에서 성능의 결과를 적겠지만, 현재 가장 비싸고 성능이 좋은 CUDA 지원 nVidia GPU에 근접하는 성능입니다)

애플 실리콘 지원 기종에서 CoreML을 사용할 수 있는 것은 단지 Stable Diffusion 2뿐만 아니라, Stable Diffusion 1.5와 Stable Diffusion 1.4까지도 지원이 가능합니다. 

 



이번에 CoreML 지원으로 릴리즈된 모델은 총 4가지로 나눠집니다.

1. Original과 split_einsum의 차이
"Original"은 CPU 자원과 GPU 자원을 사용할 수 있고, "split_einsum"은 CPU 자원과 GPU 자원과 애플 뉴럴엔진의 자원까지 사용할 수 있습니다. 
애플 뉴럴엔진이 없는 맥 기종을 사용할 경우 CUDA 지원대신 애플 기종의 GPU 자원을 CoreML 확장을 통해 사용할 수 있고, 뉴럴엔진의 자원까지 사용할 경우 뉴럴엔진의 특성상 고도화된 학습 등 Stable Diffusion의 학습 및 결과도출에 있어서 많은 자원이 사용되는 경우에 좀 더 최적화된 결과를 얻을 수 있을 것입니다.

2. "ML Packages"과 "Compiled"의 차이
"ML Packages"는 파이썬을 위한 것이며, "Compiled"는 스위프트를 위한 것입니다. 
iOS와 iPadOS 등의 기기를 위한 프로젝트 등에는 "Compiled"를 사용하고, 그 외에는 "ML Packages"를 사용하시면 무리가 없습니다.

위와 같은 구성으로 인해 모델 저장소는 다음과 같은 트리구조로 구성이 되게 되어 있습니다.
(위의 설명이 어렵지 않으므로, 트리구조도 한 눈에 들어오실 것입니다)


* CoreML 지원 형태의 트리구조
coreml-stable-diffusion-v1-4
├── README.md
├── original
│   ├── compiled
│   └── packages
└── split_einsum
    ├── compiled
    └── packages

CoreML을 사용하는 stable diffusion 1.4의 경우 아래처럼 사용할 수 있습니다.

python -m python_coreml_stable_diffusion.pipeline --prompt "Cluttered house in the city" -i models/coreml-stable-diffusion-v1-4_original_packages -o </path/to/output/image> --compute-unit ALL --seed 93

이 때 컴퓨트 유닛 파라메터(--compute-unit)로 Stable Diffusion에서 어떠한 자원을 사용할지 지정할 수 있습니다.
ALL : CPU, GPU, NE(뉴럴엔진) 모두 사용
CPU_AND_ GPU : 뉴럴엔진 사용하지 않고 CPU와 GPU만 사용
CPU_ONLY : CPU의 자원만 사용
CPU_AND_NE : CPU와 뉴럴엔진의 자원을 사용하며, GPU 자원은 사용하지 않음

이를 통해 80초 정도의 결과물 도출에 걸리던 시간을 최소 38초에서 최대 9.8초까지 줄일 수 있었으며, 이는 가장 최근에 나온 가장 비싼 모델의 nVidia CUDA 지원 모델의 결과인 8초와 비견할 수 있었으며, (M1 최고 모델과 비교) 뉴럴엔진에 적합한 선행학습 등으로 Stable Diffusion 사용결과에 있어서 근접 혹은 그 이상의 결과를 도출할 수 있을 것을 기대할 수 있습니다.

참조) https://github.com/huggingface/blog/blob/main/diffusers-coreml.md