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.

Sources