NNCF์ ๐ค Optimum์ ์ฌ์ฉํ Intel CPU์ฉ Stable Diffusion ์ต์ ํ
Overview
Hugging Face๋ Neural Network Compression Framework (NNCF) ์์ํ ์ธ์ ํ๋ จ๊ณผ Token Merging์ ๊ฒฐํฉํ์ฌ Intel CPU์ฉ Stable Diffusion์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ถ๋ก ์๋๊ฐ ์ต๋ 5.1x ๋นจ๋ผ์ง๊ณ ๋ชจ๋ธ ํฌ๊ธฐ๊ฐ ์๋ PyTorch ์ฒดํฌํฌ์ธํธ์ 0.25x๋ก ๊ฐ์ํ์ต๋๋ค.
Stable Diffusion ์ต์ ํ
Stable Diffusion ํ์ดํ๋ผ์ธ์ UNet ๊ตฌ์ฑ ์์๋ ๊ฐ์ฅ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ๋ถ๋ถ์ด๋ฏ๋ก ์ด๋ฅผ ์ต์ ํํ๋ฉด ํฐ ์๋ ํฅ์์ ์ป์ ์ ์์ต๋๋ค. ์ ํต์ ์ธ ์ฌํ ํ๋ จ 8๋นํธ ์์ํ๋ ์ด ๋ชจ๋ธ์ ์ ์๋ํ์ง ์๋๋ฐ, ์ด๋ ํฝ์ ์์ค ์์ธก ์์ ์ด ๋งค๊ฐ๋ณ์ ๋ณ๊ฒฝ์ ๋งค์ฐ ๋ฏผ๊ฐํ๊ณ , ์๋ฐฑ๋ง ๊ฐ์ ์ํ๋ก ํ๋ จ๋์ด ๋ชจ๋ธ์ ์ค๋ณต์ฑ์ด ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ํ๋๋ฅผ ์ ์งํ๋ ค๋ฉด QuantizationโAware Training (QAT)์ ๊ฐ์ ๋ณด๋ค ์ ๊ตํ ์์ํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ต์ ํ ์ํฌํ๋ก
์ฐ๋ฆฌ๋ Pokemon ๋ฐ์ดํฐ์ (svjack/Stable-Diffusion-Pokemon-en)์์ ํ์ธํ๋๋ Stable Diffusion ๋ชจ๋ธ์์ ์์ํ์ต๋๋ค. Diffusers ํ ์คํธโtoโ์ด๋ฏธ์ง ํ์ธํ๋ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ NNCF ๊ธฐ๋ฐ QAT๋ฅผ ํ๋ จ ์คํฌ๋ฆฝํธ์ ํตํฉํ๊ณ , ์๋ณธ ๋ชจ๋ธ์ด ๊ต์ฌ ์ญํ ์ ํ๋ ์ง์ ์ฆ๋ฅ ์์ค์ ์ถ๊ฐํ์ผ๋ฉฐ, ํ๋ จ ์์ ์ฑ์ ์ํด ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ(์์ํ๊ธฐ ์ ์ธ)์ ์ง์ ์ด๋ ํ๊ท (EMA)์ ์ ์ฉํ์ต๋๋ค. ๊ทธ๋๋์ธํธ ์ฒดํฌํฌ์ธํ ๊ณผ EMA ๋ชจ๋ธ์ RAM์ ์ ์งํจ์ผ๋ก์จ ์ ์ฒด ์ต์ ํ๋ฅผ 24โฏGB VRAM์ ๊ฐ์ง ๋จ์ผ GPU์์ ํ๋ฃจ ๋ฏธ๋ง์ผ๋ก 4096๋ฒ์ ๋ฐ๋ณต์ ์ํํ ์ ์์์ต๋๋ค.
QuantizationโAware Training์ ๋์ด
์์ํ๋ง์ผ๋ก๋ ๋ชจ๋ธ ํํ๋ฆฐํธ, ๋ก๋ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์๋น ๋ฐ ์ง์ฐ์ด ๊ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ 8๋นํธ ์์ํ์ Token Merging (ToME) ๋ฐฉ๋ฒ์ ๊ฒฐํฉํ๋๋ฐ, ์ด๋ selfโattention ๋ธ๋ก ์ด์ ์ ์ค๋ณต ํ ํฐ์ ๋ณํฉํ์ฌ ๊ณ์ฐ์ ์ค์ ๋๋ค. ๊ฒฐํฉ๋ ์ํฌํ๋ก๋ ์์์ ์ค๋ช ํ ์ง์ ์ฆ๋ฅ, EMA, ๊ทธ๋๋์ธํธ ์ฒดํฌํฌ์ธํ ์ ํฌํจํฉ๋๋ค. ๋ค์ Pokemonโfineโtuned ๋ชจ๋ธ์์ ์์ํ์ฌ, ์์ํ ์์ ๋ณํฉ ๋น์จ 0.4์ ToME๋ฅผ ์ ์ฉํ์ต๋๋ค. ๊ฒฐ๊ณผ ๋ชจ๋ธ์ ํด๋ผ์ด์ธํธ ๋๋ ์์ง CPU์์์ ์ถ๋ก ์ ๋ชฉ์ ์ผ๋ก ํฉ๋๋ค.
๊ฒฐ๊ณผ
PyTorch ๊ธฐ์ค์ OpenVINO FP32๋ก ๋ณํํ๋ฉด 1.9x ์๋ ํฅ์์ด ์์์ต๋๋ค. 8๋นํธ ์์ํ๋ฅผ ์ถ๊ฐํ๋ฉด PyTorch ๋๋น 3.9x ์๋ ํฅ์์ด ๋๊ณ ๋ชจ๋ธ ํํ๋ฆฐํธ๊ฐ ์๋ ์ฒดํฌํฌ์ธํธ์ 0.25x๋ก ๊ฐ์ํ์ต๋๋ค. ์์ํ ์์ Token Merging์ ์์ผ๋ฉด ํํ๋ฆฐํธ๋ฅผ ๋์ผํ 0.25x ์์ค์ผ๋ก ์ ์งํ๋ฉด์ 5.1x ์ถ๋ก ์๋ ํฅ์์ ๋ฌ์ฑํ์ต๋๋ค. ๋ชจ๋ ์ธก์ ์ 3์ธ๋ Intelยฎ Xeonยฎ Scalable ํ๋ก์ธ์์ Intelยฎ Deep Learning Boost ๊ธฐ์ ์ ๊ฐ์ถ Hugging Face Spaces CPU ์ ๊ทธ๋ ์ด๋ ์ธ์คํด์ค์์ OpenVINO 2022.3์ ์ฌ์ฉํ์ฌ ์ํ๋์์ผ๋ฉฐ, ๊ธฐ๋ณธ 50 ์ถ๋ก ๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ธ๋ก๊ทธ์์๋ ๋จ๊ณ ์๊ฐ ์ ์์๋ก ์๋๋ ๋นจ๋ผ์ง์ง๋ง ์ด๋ฏธ์ง ํ์ง์ ์ํฅ์ ์ค ์ ์์ผ๋ฉฐ, ๋จ๊ณ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ์คํํด ๋ณผ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
from optimum.intel import OVStableDiffusionPipeline
# Load and compile the pipeline for performance.
name = "OpenVINO/stable-diffusion-pokemons-tome-quantized-aggressive"
pipe = OVStableDiffusionPipeline.from_pretrained(name, compile=False)
pipe.reshape(batch_size=1, height=512, width=512, num_images_per_prompt=1)
pipe.compile()
# Generate an image.
prompt = "a drawing of a green pokemon with red eyes"
output = pipe(prompt, num_inference_steps=50, output_type="pil\)).images[0]
output.save("image.png
The training and quantization code are available in the Optimum Intel repository, a demonstration notebook is provided, and optimized models can be found on the Hugging Face Hub under the OpenVINO organization. A live demo runs on Hugging Face Spaces.
๋ฒ์ฉ Stable Diffusion ๋ชจ๋ธ์ ์ด๋ป๊ฒ ๋๋์?
Pokemon ๋ชจ๋ธ์ ๋ํ ์์ฐ ์ํฌํ๋ก๋ modesteํ ํ๋ จ ์์์ผ๋ก๋ ์๋นํ ์ต์ ํ๊ฐ ๊ฐ๋ฅํจ์ ๋ณด์ฌ์ค๋๋ค. ๋ฒ์ฉ Stable Diffusion ๋ชจ๋ธ์ ์ฒ์๋ถํฐ ํ๋ จํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค์ง๋ง, ์ถฉ๋ถํ ์์ฐ๊ณผ ํ๋์จ์ด๊ฐ ์๋ค๋ฉด ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ํ ์ ์ Token Merging์ด ๋ชจ๋ธ ์ฉ๋์ ์ค์ธ๋ค๋ ์ ์ธ๋ฐ, ๋ฐ๋ผ์ ๋ ๋ณต์กํ ๋ฐ์ดํฐ์ ์์๋ ์ต์ ํ ์ค์ ๋ฎ์ ๋ณํฉ ๋น์จ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
For further reading on complementary approaches for 4thโgeneration Intel Xeon CPUs, see the related Hugging Face blog post on Stable Diffusion inference with Intel.