Triton과 TensorRT로 Stable Diffusion 모델 배포하기

Triton과 TensorRT로 Stable Diffusion 모델 배포하기

이 예시는 TensorRT demo 파이프라인과 유틸리티를 활용해 Stable Diffusion 모델을 Triton에서 배포하는 법을 보여줘요. TensorRT demo를 기반으로, 다양한 버전·설정의 Diffusion 모델을 배포하기에 적합한 재사용 가능한 python 기반 백엔드(/backend/diffusion/model.py)를 담고 있습니다.

Stable Diffusion에 대한 자세한 내용은 stable-diffusion-v1-5, stable-diffusion-xl을, TensorRT 구현에 대해서는 TensorRT demo를 참고하세요.

참고: 이 예시는 샘플 코드로 제공되며, 운영 환경에서 쓰기 전에 반드시 검토해야 해요.

이 가이드는 요구 사항, 서버 이미지 빌드, Stable Diffusion v1.5, Stable Diffusion XL, 추론 요청 보내기, 모델 설정, 샘플 클라이언트, 알려진 이슈·제약으로 구성돼 있습니다.

요구 사항

이 안내는 Docker가 설치된 Linux 시스템이 필요해요. CUDA 지원을 위해, CUDA 드라이버가 Deep Learning Framework 지원 매트릭스의 "NVIDIA Driver" 절 요구 사항을 충족하는지 확인하세요.

Triton Inference Server 이미지 빌드

이 예시는 nvcr.io/nvidia/tritonserver:26.07-py3 도커 이미지와 TensorRT OSS v10.4 기반으로 설계됐어요.

TensorRT Stable Diffusion demo의 의존성을 설치한 이미지를 만들기 위한 편의 스크립트들이 제공됩니다.

Triton Inference Server + TensorRT OSS

저장소 클론

 git clone https://github.com/triton-inference-server/tutorials.git --single-branch
 cd tutorials/Popular_Models_Guide/StableDiffusion

Tritonserver Diffusion 도커 이미지 빌드

 ./build.sh

포함된 모델

default 빌드에는 /diffusion-models 폴더의 모델 설정 파일이 포함돼요. stable_diffusion_1_5stable_diffusion_xl의 예시 설정이 제공됩니다.

모델 아티팩트와 엔진 파일은 이미지에 포함되지 않고, 별도 단계로 볼륨 마운트 디렉터리에 빌드됩니다.

Stable Diffusion v1.5 빌드와 실행

Tritonserver Diffusion 컨테이너 시작

다음 명령은 컨테이너를 시작하고 현재 디렉터리를 workspace로 볼륨 마운트해요.

 ./run.sh

Stable Diffusion v1.5 엔진 빌드

참고: stable-diffusion-v1-5 모델은 huggingface 로그인과 이용 약관 동의가 필요해요. 그에 맞춰 HF_TOKEN 환경 변수를 설정하세요.

 ./scripts/build_models.sh --model stable_diffusion_1_5

기대 출력

 diffusion-models
 |-- stable_diffusion_1_5
 |   |-- 1
 |   |   |-- 1.5-engine-batch-size-1
 |   |   |-- 1.5-onnx
 |   |   |-- 1.5-pytorch_model
 |   `-- config.pbtxt

서버 인스턴스 시작

참고: 데모 목적으로 어떤 Stable Diffusion 버전을 로드할지 제어하기 위해 EXPLICIT 모델 제어 모드를 사용해요. 운영 배포에서는 EXPLICIT 모드와 관련된 위험에 대한 자세한 내용은 Secure Deployment Considerations를 참고하세요.

 tritonserver --model-repository diffusion-models --model-control-mode explicit --load-model stable_diffusion_1_5

기대 출력

 < SNIP >
 I0229 20:15:52.125050 749 server.cc:676] +----------------------+---------+--------+
 | Model               | Version | Status |
 +----------------------+---------+--------+
 | stable_diffusion_1_5 | 1       | READY  |
 +----------------------+---------+--------+
 < SNIP >

Stable Diffusion XL 빌드와 실행

Tritonserver Diffusion 컨테이너 시작

 ./run.sh

Stable Diffusion XL 엔진 빌드

 ./scripts/build_models.sh --model stable_diffusion_xl

기대 출력

 diffusion-models
 |-- stable_diffusion_xl
 |   |-- 1
 |   |   |-- xl-1.0-engine-batch-size-1
 |   |   |-- xl-1.0-onnx
 |   `-- xl-1.0-pytorch_model
 `-- config.pbtxt

서버 인스턴스 시작

 tritonserver --model-repository diffusion-models --model-control-mode explicit --load-model stable_diffusion_xl

기대 출력

 < SNIP >
 I0229 20:22:22.912465 1440 server.cc:676] +---------------------+---------+--------+
 | Model              | Version | Status |
 +---------------------+---------+--------+
 | stable_diffusion_xl | 1       | READY  |
 +---------------------+---------+--------+
 < SNIP >

추론 요청 보내기

요청을 간단히 보내고 받기 위해 샘플 클라이언트 앱을 제공해요.

Tritonserver Diffusion 컨테이너 시작

서버와 별도의 터미널에서 새 컨테이너를 시작해요.

 ./run.sh

Stable Diffusion 1.5에 프롬프트 보내기

 python3 client.py --model stable_diffusion_1_5 --prompt "butterfly in new york, 4k, realistic" --save-image

예시 출력

 Client: 0 Throughput: 0.7201335361144658 Avg. Latency: 1.3677194118499756 Throughput: 0.7163933558221957 Total Time: 1.395881175994873

--save-image를 주면 출력 이미지가 jpeg로 저장돼요.

client_0_generated_image_0.jpg

sample_generated_image

Stable Diffusion XL에 프롬프트 보내기

 python3 client.py --model stable_diffusion_xl --prompt "butterfly in new york, 4k, realistic" --save-image

예시 출력

 Client: 0 Throughput: 0.1825067711674996 Avg. Latency: 5.465569257736206 Throughput: 0.18224859609447058 Total Time: 5.487010717391968

--save-image를 주면 출력 이미지가 jpeg로 저장돼요.

client_0_generated_image_0.jpg

sample_generated_image

샘플 클라이언트

샘플 클라이언트 앱은 다양한 동시성 시나리오에서 diffusion 모델을 빠르게 테스트할 수 있게 해 줍니다. 클라이언트 앱 옵션의 전체 목록과 설명은 다음으로 확인하세요.

 python3 client.py --help

동시 요청 보내기

부하와 동시성을 높이려면 clientsrequests 옵션으로 클라이언트 프로세스 수와 각 클라이언트가 보내는 요청 수를 제어할 수 있어요.

예시: 클라이언트 10개가 각각 요청 10개 보내기

다음 명령은 클라이언트 10개를 각자 10개씩 요청하게 해요. 각 클라이언트는 독립 프로세스로, 나머지 9개와 병렬로 순차적으로 요청을 보냅니다.

 python3 client.py --model stable_diffusion_xl --requests 10 --clients 10

알려진 이슈와 제약

  1. diffusion 백엔드는 기반이 된 demo와 달리 아직 선택적 refiner 모델을 지원하지 않아요. demo_txt2img_xl.py도 참고하세요.