Intel Sapphire Rapids CPU에서 Stable Diffusion 추론 가속화

TL;DR

Hugging Face는 Optimum Intel/OpenVINO, 시스템 수준 메모리 및 스레딩 최적화, BF16/AMX를 활용한 Intel Extension for PyTorch (IPEX), 그리고 DPMSolverMultistepScheduler를 결합하여 Intel Sapphire Rapids (Xeon Sapphire Rapids) CPU에서 Stable Diffusion 추론 시간을 32.3 초에서 ~5 초로 단축할 수 있음을 보여줍니다.


Diffusers 라이브러리 – 기본 성능

diffusers 라이브러리는 Stable Diffusion을 위한 간단한 Python API를 제공합니다. 기본 float32 파이프라인을 Amazon EC2 r7iz.metal-16xl 인스턴스(64 vCPU, 512 GB RAM, Ubuntu 20.04)에서 실행하면 이미지당 평균 지연 시간이 32.3 초(20 inference steps)입니다. 동일한 Sapphire Rapids 세대는 이전 세대 Ice Lake Xeon보다 이미 빠르며, Ice Lake에서는 동일 작업에 약 45 초가 소요됩니다.


Optimum Intel 및 OpenVINO – 2배 속도 향상

Optimum IntelStableDiffusionPipeline을 대체하는 OVStableDiffusionPipeline을 제공합니다. pip install optimum[openvino] 로 설치하면 PyTorch 모델을 OpenVINO 형식으로 자동 변환하고 bfloat16으로 추론할 수 있습니다.

from optimum.intel.openvino import OVStableDiffusionPipeline
ov_pipe = OVStableDiffusionPipeline.from_pretrained(model_id, export=True)
latency = elapsed_time(ov_pipe, prompt)
print(latency)  # → ~16.7 s

OpenVINO 파이프라인은 지연 시간을 16.7 초로 줄이며, 기존 Diffusers 기준보다 2배 빠릅니다.

고정 형태 최적화 – 추가 3.5배

OpenVINO는 정적 입력 형태도 지원합니다. 파이프라인을 고정 해상도(예: 512 × 512)로 재구성하면 지연 시간이 4.7 초까지 감소합니다.

ov_pipe.reshape(batch_size=1, height=512, width=512, num_images_per_prompt=1)
latency = elapsed_time(ov_pipe, prompt)

Sapphire Rapids와 결합하면 Ice Lake 대비 거의 10배 속도 향상을 달성합니다.


시스템 수준 최적화 – 코드 변경 없이 3배 가속

Stable Diffusion이 사용하는 수 기가바이트 규모 모델은 메모리 할당과 스레딩에 크게 영향을 받습니다. 동일한 EC2 인스턴스에서 다음과 같은 시스템 튜닝을 적용했습니다:

  • 고성능 메모리 관리를 위해 jemalloc 설치 및 프리로드
  • Intel OpenMP 런타임을 활성화하기 위해 intel‑mkl 설치 및 libiomp5.so 프리로드
  • 코어 수에 맞춰 OMP_NUM_THREADS=32 설정
  • numactl -C 0-31 로 Python 프로세스를 일부 코어에 고정
sudo apt-get install -y libjemalloc-dev intel-mkl
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libjemalloc.so
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/x86_64-linux-gnu/libiomp5.so
export OMP_NUM_THREADS=32
numactl -C 0-31 python sd_blog_1.py

이러한 변경으로 기본 Diffusers 지연 시간이 32.3 초에서 11.8 초로 감소하여 약 3배의 향상을 얻었습니다.


IPEX와 BF16 – 또 다른 2배 가속

**Intel Extension for PyTorch (IPEX)**는 Sapphire Rapids에 탑재된 AVX‑512 VNNI와 AMX(Advanced Matrix Extensions)를 활용합니다. intel_extension_for_pytorch==1.13.100 을 설치한 뒤, 각 파이프라인 구성 요소(UNet, VAE, 텍스트 인코더, safety checker)를 channels‑last 레이아웃으로 변환하고 bfloat16 모드에서 IPEX 최적화를 적용합니다.

import torch, intel_extension_for_pytorch as ipex
# Convert modules to channels‑last
pipe.unet = pipe.unet.to(memory_format=torch.channels_last)
# ... repeat for vae, text_encoder, safety_checker
# Optimize with IPEX
pipe.unet = ipex.optimize(pipe.unet.eval(), dtype=torch.bfloat16, inplace=True, sample_input=input_example)
# Run under autocast
with torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16):
    latency = elapsed_time(pipe, prompt)
    print(latency)  # → ~5.4 s

지연 시간이 11.8 초에서 5.4 초로 개선되어 BF16과 AMX 덕분에 2배 이상의 가속을 달성했습니다.


더 빠른 스케줄러 – 최종 6.5배 전체 가속

Diffusers는 디노이징 단계 일정을 제어하는 교체 가능한 스케줄러를 지원합니다. DPMSolverMultistepScheduler는 20 단계만으로도 최고의 속도/품질 균형을 제공합니다.

from diffusers import DPMSolverMultistepScheduler
scheduler = DPMSolverMultistepScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler)
latency = elapsed_time(pipe, prompt)
print(latency)  # → ~5.05 s

이 스케줄러를 사용하면 최종 지연 시간이 5.05 초가 되며, 원래 Sapphire Rapids 기준(32.3 초) 대비 6.5배 향상되고 Ice Lake 대비 대략 10배 빠릅니다.


전체 환경 스냅샷

벤치마크는 다음 환경에서 수행되었습니다:

  • 인스턴스: Amazon EC2 r7iz.metal-16xl (64 vCPU, 512 GB RAM)
  • OS: Ubuntu 20.04, Linux kernel 5.15.0-1031-aws
  • 라이브러리: libjemalloc‑dev 5.2.1‑1, intel‑mkl 2020.0.166‑1, PyTorch 1.13.1, Intel Extension for PyTorch 1.13.1, Transformers 4.27.2, Diffusers 0.14, Accelerate 0.17.1, OpenVINO 2023.0.0.dev20230217, Optimum 1.7.1, Optimum‑Intel 1.7

시사점 및 향후 과제

Stable Diffusion 추론 시간을 몇 초 수준으로 단축하면 일반 CPU만으로도 새로운 활용 사례가 열립니다:

  • GPU 인프라 없이도 고객용 애플리케이션에서 실시간 이미지 생성 가능
  • 다른 모델 학습을 위한 비용 효율적인 합성 데이터 생성
  • 데이터 프라이버시 혹은 지연 제한으로 클라우드 GPU 사용이 어려운 온‑프레미스 배포

개발자는 블로그 포스트에 사용된 전체 스크립트를 포함한 GitLab 데모 레포지토리를 따라해 볼 수 있습니다. 향후 확장을 위해서는 곧 발표될 Hugging Face 기사에서 Sapphire Rapids 클러스터를 이용한 확산 모델 분산 파인‑튜닝에 대해 다룰 예정입니다.


참고 자료

Sources