计算机视觉/视频分析

在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像

扩散模型正在各行各业中改变创意工作流程。这些模型通过采用降噪扩散技术,将随机噪声逐步塑造为 AI 生成的艺术,从而根据简单的文本或图像输入生成令人惊叹的图像。这些模型可用于许多企业用例,例如为营销创建个性化内容、为照片中的物体生成想象力的背景、为游戏设计动态高质量环境和角色等。

虽然扩散模型是增强工作流程的有用工具,但在大规模部署时,这些模型会非常计算密集。在非专用硬件 (如 CPU) 上生成一批四张图像可能需要几分钟时间,这可能会阻碍创意流程,并且成为许多开发者满足严格服务级别协议 (SLA) 的障碍。

在本文中,我们将向您展示 NVIDIA AI 推理平台 可以专注于解决这些挑战,稳定 Diffusion XL(SDXL)。我们首先探讨企业在生产环境中部署 SDXL 时面临的常见挑战,然后深入探讨如何 Google Cloud 的 G2 实例NVIDIA L4 Tensor Core GPU, NVIDIA TensorRTNVIDIA Triton 推理服务器 可以帮助缓解这些挑战。我们介绍了如何 让我们增强,一家领先的 AI 计算机视觉初创公司,正在 NVIDIA AI 推理平台和 Google Cloud 上使用 SDXL,让企业能够一键创建引人注目的产品图像。最后,我们提供了一个分步教程,介绍如何在 Google Cloud 上使用 SDXL 进行经济高效的图像生成。

克服 SDXL 生产部署挑战

在任何 AI 生产环境中部署工作负载都带来了一系列挑战。这些挑战包括在现有的模型服务基础设施中部署模型,通过优化推理请求的批处理来提高吞吐量和延迟,并在预算限制的范围内保持基础设施成本。

然而,在生产环境中部署扩散模型面临显著挑战,因为它们依赖于卷积神经网络进行图像预处理和后处理操作,并且需要满足严格的企业服务级别协议(SLA)要求。

在本文中,我们将更深入地探讨这些方面,并探索如何利用 NVIDIA 全栈推理平台 来缓解这些问题。

利用 GPU 专用的 Tensor Core

Stable Diffusion 的核心是 U-Net 模型,它始于一个噪声图像 (一组随机数矩阵)。这些矩阵被切割成较小的子矩阵,然后应用一系列卷积 (数学运算),从而产生一个更加精细且噪音更少的输出。每次卷积都包含一次乘法和累加运算。这种降噪过程需要多次迭代,直到获得一个新的增强输出图像。

Multiple images show the gradual sharpening of focus objects.
图 1.Stable Diffusion 降噪过程

由于其计算复杂性,这个过程可以从特定类型的GPU核心中获得显著的好处,例如NVIDIA Tensor核心。这些专门的的核心从设计之初就是为了加速矩阵乘法累加运算,从而加快图像生成速度。

NVIDIA 通用 L4 GPU 拥有超过 200 个 Tensor Core,是企业希望在生产环境中部署 SDXL 的理想经济高效 AI 加速器。企业可以通过 Google Cloud 等云服务提供商访问 L4 GPU,第一个 CSP 通过其 G2 实例在云端提供 L4 GPU。

Picture of the L4 GPU on a black background.
图 2. NVIDIA L4 Tensor Core GPU

图像预处理和后处理自动化

在使用 SDXL 的实际企业应用程序中,该模型是包含其他计算机视觉模型和预处理和后处理图像编辑步骤的更广泛 AI 管线的一部分。

例如,如果使用 SDXL 为新产品发布活动创建背景场景,则可能需要在输入产品图像到 SDXL 模型以生成场景之前执行预备缩放预处理步骤。生成的 SDXL 图像输出也可能需要进一步的后期处理,例如使用图像放大器将分辨率提升到更高的分辨率,以便在市场营销活动中使用。

将这些各种预处理和后处理步骤整合到精简的 AI 工作流程中可以使用完整的 AI 推理模型服务器实现自动化,例如开源 Triton 推理服务器。这样一来,无需编写手动代码,也无需在计算环境中来回复制数据,从而消除了不必要的延迟,并节省了昂贵的计算和网络资源。

Diagram shows a pipeline that begins with preprocessing and ends with post-processing.
图 3.SDXL 作为更广泛的管线的一部分

通过使用 Triton 推理服务器来服务 SDXL 模型,您可以利用模型集成功能,以低代码方式定义如何将一个模型的输出作为下一个模型的输入。您可以选择在 CPU 上运行预处理和后处理步骤,在 GPU 上运行 SDXL 模型,也可以选择在 GPU 上运行整个管线,以实现超低延迟应用程序。无论您选择哪种方式,您都可以完全控制 SDXL 管线的端到端延迟。

生产环境的高效扩展

随着越来越多的企业致力于将 SDXL 整合到各个业务线中,处理用户请求的高效批处理和提高 GPU 利用率的挑战变得越来越复杂。这种复杂性来自于尽可能减少用户体验中的延迟,同时提高吞吐量以降低运营成本的需求。

使用开源 GPU 模型优化器(如 TensorRT)结合使用具有并发模型执行和动态批处理功能(如 Triton 推理服务器)的推理服务器,可以缓解这些挑战。

例如,考虑一下在与其他 TensorFlow 和 PyTorch 图像分类或特征提取 AI 模型并行运行 SDXL 模型的情况,尤其是在有大量客户请求的生产环境中。在这种情况下,SDXL 模型可以使用 TensorRT 进行编译,以优化模型以实现低延迟推理。

Triton 推理服务器还可以通过其动态批处理和并发推理功能,在各个模型中高效批量处理大量来自不同后端框架的请求,从而优化吞吐量,使企业能够借助更少的资源和更低的总体拥有成本满足用户需求。

Diagram shows NVIDIA Triton Inference Server per-model scheduling queues and Stable Diffusion XL served alongside other ML models with different backend frameworks.
图 4. NVIDIA Triton 在大规模生产环境中为多个 AI 模型提供服务

将普通产品照片转化为精美的营销素材

利用 NVIDIA AI 推理平台的强大功能,在生产环境中为 SDXL 提供支持的优秀示例包括 让我们增强。该领先的 AI 初创公司已在 NVIDIA Tensor Core GPU 上部署了超过 30 个 AI 模型,时间已超过 3 年,使用 Triton 推理服务器。

最近,Let’s Enhance 宣布推出最新产品 AI Photoshoot,该产品使用 SDXL 模型将普通的产品照片转换为电子商务网站和营销活动的精美视觉素材。

借助 Triton 推理服务器对各种框架和后端的强大支持,以及其动态批处理特征集,Let’s Enhance 创始人兼首席技术官 Vlad Pranskevichus 能够将 SDXL 模型无缝集成到现有的 AI 管线中,从而释放 ML 工程团队的时间,让他们能够专注于研发工作。

通过成功的概念验证,AI 图像增强初创公司发现,通过将其 SDXL 模型迁移到 Google Cloud G2 实例上的 NVIDIA L4 GPU 可以将成本降低 30%,并概述了在 2024 年中期完成多个管线迁移的路线图。

Compilation of four product mockups showcasing a cap bottle, pump bottle, jar, and chair. Each product mockup has two images: one with the object, and one with the object in front of an AI-generated background generated by Let’s Enhance.
图 5.使用 Let’s Enhance 全新 PhotoShoot 服务生成的产品图像

使用 L4 GPU 和 TensorRT 开始使用 SDXL

在下一节中,我们将展示如何在 Google Cloud 的 G2 实例上快速部署经过 TensorRT 优化的 SDXL,以获得出色的性价比。要在 Google Cloud 上使用 NVIDIA 驱动启动 VM 实例,请按照以下步骤操作。

选择以下机器配置选项:

  • 机器类型:g2-standard-8
  • CPU 平台:英特尔 Cascade Lake
  • 最低 CPU 平台:
  • 显示设备:禁用。
  • GPU: 1 个 NVIDIA L4

g2-standard-8 机型配备一个 NVIDIA L4 GPU 和四个 vCPU,而大型机型则配备 available 具体取决于所需的内存量。

选择以下启动磁盘选项,确保选择源镜像:

  • 类型:均衡的持久磁盘
  • 尺寸:500 GB
  • 区域:美国中部 1 区
  • 标签:
  • 用户:实例 1
  • 快照计划:无。
  • 来源图像:c0-deeplearning-common-gpu
  • 加密类型:由 Google 管理。
  • 一致性组:无。

NVIDIA Omniverse 平台通过 Google 深度学习 VM 提供了最新的 NVIDIA GPU 库。

VM 实例启动并运行后,在浏览器窗口中,选择连接, SSH, 打开,然后进行身份验证。此操作会在浏览器窗口中加载 SSH 终端。

使用以下步骤使用 TensorRT 优化的 Stable Diffusion XL 生成图像。

克隆 TensorRT OSS 资源库:

git clone https://github.com/NVIDIA/TensorRT.git -b release/9.2 --single-branch
cd TensorRT

安装 NVIDIA-docker 并启动 PyTorch 容器:

docker run --rm -it --gpus all -v $PWD:/workspace nvcr.io/nvidia/pytorch:24.01-py3 /bin/bash

安装最新的 TensorRT 版本:

python3 -m pip install --upgrade pip
python3 -m pip install --pre --upgrade --extra-index-url https://pypi.nvidia.com tensorrt

安装所需软件包:

export TRT_OSSPATH=/workspace
export HF_TOKEN=
cd $TRT_OSSPATH/demo/Diffusion
pip3 install -r requirements.txt

现在,运行经 TensorRT 优化的 Stable Diffusion XL 模型,输入“art deco,realistic”(艺术装饰,逼真) 提示:

python3 demo_txt2img_xl.py "art deco, realistic" --hf-token=$HF_TOKEN --version xl-1.0 --batch-size 1 --build-static-batch --num-warmup-runs 5 --seed 3 --verbose --use-cuda-graph

这会生成一张令人惊叹的图像,可以在 notebook 中查看:

from IPython.display import display
from PIL import Image
img = Image.open('output/xl_base-fp16-art_deco,_-1-xxxx.png')
display(img)
Output image features a symmetrical arrangement with a bed surrounded by two lamps on each side. The wall behind the bed features vertical golden stripes and a central alcove with a spherical light fixture above it, and the floor shows horizontal black and white stripes.
图 6.演示 Diffusion 教程生成的示例图像

恭喜!您已使用经 TensorRT 优化的 Stable Diffusion XL 生成样本图像。

为了提高吞吐量,您可以使用更大的机器类型,利用多达 8 个 L4 GPU,并在每个 GPU 上加载模型以实现高效并行处理。为了进一步加快推理速度,您可以调整降噪步长、图像分辨率或精度。例如,在前面的示例中,将降噪步长从 30 调整为 20,可将吞吐量提高 1.5 倍。

L4 GPU 在性价比方面表现出色,每美元可生成 1.4 倍的图像,NVIDIA A100 Tensor Core GPU 使其非常适合成本敏感型应用程序和离线批量图像生成。然而,相较于 L4,A100 或 H100 更适合延迟敏感型应用程序,可以分别将图像生成速度加快 3.8 倍和 7.9 倍。

推理期间的性能受到多种因素的影响,包括批量大小、分辨率、降噪步长和数据精度。欲获取更多优化和配置选项的信息,请查阅DemoDiffusion或 NVIDIA /TensorRT GitHub 资料库中的示例。

使用 Triton 推理服务器在生产环境中部署 SDXL

以下是如何在 g2-standard-32 机型上使用 Triton 推理服务器在生产环境中部署 SDXL 模型的方法。

克隆 Triton 推理服务器教程资源库:

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

构建 Triton 推理服务器扩散容器镜像:

./build.sh

在容器镜像中运行交互式 shell。以下命令启动容器并将当前目录作为工作空间挂载:

./run.sh

构建稳定 Diffusion XL TensorRT 引擎。这需要几分钟时间。

./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

启动 Triton 推理服务器。在本演示中,我们使用 EXPLICIT 模型控制模式来控制加载的 Stable Diffusion 版本。有关生产部署的更多信息,请参阅 安全部署注意事项

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

完成后,预期输出将如下所示:

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

在单独的交互式 shell 中,启动新的容器以运行示例 Triton 推理服务器客户端。以下命令启动容器并将当前目录作为工作空间挂载:

./run.sh

将提示发送至 Stable Diffusion XL:

python3 client.py --model stable_diffusion_xl --prompt "butterfly in new york, 4k, realistic" --save-image
Image shows a monarch butterfly in front of an urban landscape with tall buildings.
图 8.由提示“butterfly in new york,4k,realistic”(纽约的蝴蝶,4K,逼真) 生成的示例图像

恭喜!您已成功使用 Triton 部署 SDXL。

借助 Triton 推理服务器实现动态批处理

在基本 Triton 推理服务器启动并运行后,您现在可以增加max_batch_size启用动态批处理。

如果 Triton 推理服务器正在运行,请停止该服务器。可以在交互式 shell 中输入 CTRL-C 来停止该服务器。

编辑模型配置文件,./diffusion-models/stable_diffusion_xl/config.pbtxt,将批量大小增加到 2:

  • 之前: max_batch_size: 1
  • 最终效果:max_batch_size: 2

为批量大小为 2 的 TRT 引擎重建引擎。此过程需要几分钟。

./scripts/build_models.sh --model stable_diffusion_xl

完成后,预期输出将如下所示:

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

重启 Triton 推理服务器:

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

完成后,预期输出将如下所示:

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

向服务器发送并发请求。为了让服务器动态批量处理多个请求,必须有多个客户端同时发送请求。使用示例客户端,您可以增加客户端数量,以查看动态批量处理的优势。

python3 client.py --model stable_diffusion_xl --prompt "butterfly in new york, 4k, realistic" --clients 2 –requests 5

检查服务器日志和指标。启用动态批处理、并发请求和 info 级别记录后,示例将打印有关每个请求中包含的提示数量的 TensorRT 引擎的额外信息。

57291 │ I0229 20:36:23.017339 2146 model.py:184] Client Requests in Batch:2
57292 │ I0229 20:36:23.017428 2146 model.py:185] Prompts in Batch:2

总结

在 NVIDIA AI 推理平台上部署 SDXL 可为企业提供可扩展、可靠且经济高效的解决方案。

TensorRT 和 Triton 推理服务器均可解锁性能并简化生产就绪型部署,并包含在 NVIDIA AI Enterprise 中,可以在 Omniverse 应用中通过 Google Cloud Marketplace 获得。AI Enterprise 具有 NVIDIA 支持服务,并为支持 AI 推理的开源容器和框架提供企业级稳定性、安全性和可管理性。

企业开发者还可以选择使用 NVIDIA Picasso,这是一个专为视觉内容定制生成式 AI 打造的云平台。

SDXL 可作为 NVIDIA AI 基础模型 的一部分,通过 NGC 目录提供了一个易于使用的界面。您可以在不离开浏览器的情况下,直接试用 SDXL。

如需深入了解 NVIDIA 如何支持扩散模型推理管线,请访问 NVIDIA GTC 2024.

 

Tags