ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

vLLM-Omni 部署 Stable Diffusion XL:SDXL Base 1.0 文生图离线推理与在线服务实战指南

vLLM-Omni 部署 Stable Diffusion XL:SDXL Base 1.0 文生图离线推理与在线服务实战指南 vLLM-Omni 部署 Stable Diffusion XLSDXL Base 1.0 文生图离线推理与在线服务实战指南【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni本文基于 recipes/StabilityAI/Stable-Diffusion-XL.md 编写介绍在 vLLM-Omni 框架中部署 Stability AI 的 SDXL Base 1.0 开源文生图模型的完整方案包括离线推理 CLI 的完整参数用法、基于 OpenAI 兼容 Images API 的在线服务启动与验证流程并结合仓库内 SDXL 管道与 UNet 源码讲解其双 CLIP 文本编码、条件注入added condition与无分类器引导CFG的底层实现。读完本文你将能在 Intel Arc BMGXPU或 24 GB 以上显存的 NVIDIA GPU 上用一条命令把 SDXL 跑起来并通过标准 HTTP API 对外提供图像生成服务。Recipe 概览模型、任务与服务形态该 Recipe配方文档针对单一模型stabilityai/stable-diffusion-xl-base-1.0给出两条主线TaskText-to-image文生图生成 1024×1024 的高质量图像Mode同时支持离线推理Offline inference与在线服务Online serving with the OpenAI-compatible images APIVendorStability AI模型由社区维护Maintainer: Community。适用场景当需要一个高质量、开放权重、对提示词遵循度强且生态成熟的开源文生图模型时SDXL Base 1.0 是非常典型的选择。根据 Recipe 中记录的实测数据其模型权重约6.5 GiB在单张 Intel Data Center GPU 上以 30 步去噪生成单张 1024×1024 图像约耗时7.5 秒并具备出色的写实photorealistic输出能力。硬件与环境准备Recipe 给出了两套经过验证的硬件环境二者共用同一份示例脚本examples/offline_inference/text_to_image/text_to_image.py。1× Intel Arc BMG GPUXPUOSLinuxPython3.10驱动 / 运行时Intel XPU 环境Intel Arc BMG GPUvLLM 版本与当前仓库 checkout 对应的 requirements 保持一致vLLM-Omni 版本使用你当前部署所在的 commit1× NVIDIA GPU24 GB 显存OSLinuxPython3.10驱动 / 运行时NVIDIA CUDA 环境Recipe 以 A100 为例其余版本要求同上Recipe 指出SDXL 约6.5 GiB的权重、在 1024×1024 且开启 CFG 时峰值显存约10 GiB因此单张 24 GB 显存的显卡如 RTX 3090/4090、A5000即可轻松容纳显存更紧张的 GPU 可借助--enable-cpu-offload在扩散阶段将文本编码器卸载到 CPU。离线推理完整命令与参数详解基础命令在仓库根目录执行python examples/offline_inference/text_to_image/text_to_image.py \ --model stabilityai/stable-diffusion-xl-base-1.0 \ --prompt a beautiful sunset over the ocean, photorealistic \ --height 1024 --width 1024 \ --num-inference-steps 30 \ --guidance-scale 7.5 \ --seed 42 \ --output sdxl_output.png运行结束后会在当前目录生成sdxl_output.png。该脚本是仓库内共享的文生图入口其参数定义位于 examples/offline_inference/text_to_image/text_to_image.py 的parse_args()L85-L399内部通过Omni引擎类vllm_omni.entrypoints.omni.Omni以modetext-to-image初始化并调用omni.generate()完成生成。核心参数说明参数类型默认值作用--modelstrQwen/Qwen-Image模型名或本地路径此处需指定stabilityai/stable-diffusion-xl-base-1.0--promptstra cup of coffee on the table图像生成的文本描述--negative-promptstrNone用于无分类器引导CFG的负向提示词--seedint142随机种子用于可复现的结果--height/--widthint1024/1024输出图像分辨率--num-inference-stepsint50扩散采样步数步数越多质量越高但越慢--guidance-scalefloat4.0无分类器引导强度--num-images-per-promptint1每个提示词生成图像数量多张时保存为output、output_1…--outputstrqwen_image_output.png输出 PNG 保存路径生成完成后脚本会打印耗时Total generation time并把OmniRequestOutput中的 NumPy 图像张量经numpy_to_pil归一化为 PIL 图像后落盘保存对应 text_to_image.py 的_normalize_images_for_save与 L772-L800 的保存逻辑。可选优化参数同样适用于 SDXL脚本为所有受支持的扩散模型统一提供了一批进阶开关SDXL 场景下值得关注的有--vae-use-slicing/--vae-use-tiling启用 VAE 切片 / 分块显著降低显存占用遇到 OOM 时优先尝试--enable-cpu-offload将扩散模型含文本编码器卸载至 CPU适合显存低于 24 GB 的 GPU--cfg-parallel-size 2在两卡及以上环境中开启 CFG 并行把正/负条件两条分支并行计算以加速--ulysses-degree/--ring-degreeUlysses / Ring 序列并行度用于多卡扩展序列维度--cache-backend cache_dit|tea_cache启用 DBCacheSCMTaylorSeer 或 TeaCache 缓存加速--lora-path/--lora-scale/--lora-backend加载 PEFT 格式 LoRA 适配器默认peft后端--quantization fp8|int8|bitsandbytes对 Transformer 部分做量化以压缩显存。提示这些参数的具体默认值、取值范围与约束均可直接查阅 text_to_image.py 中parse_args()的 help 文本--tensor-parallel-size、--enforce-eager等在未显式给出时遵循各阶段 deploy YAML 的取值。在线服务OpenAI 兼容 Images API启动服务vllm serve stabilityai/stable-diffusion-xl-base-1.0 --omni --port 8091--omni是 vLLM-Omni 启动全模态引擎的关键开关--port指定监听端口。这与仓库内共享的文生图启动脚本 examples/online_serving/text_to_image/run_server.sh 的调用方式一致该脚本默认模型为Qwen/Qwen-Image可通过MODEL环境变量覆盖。客户端请求与验证服务启动后向/v1/images/generations发送 POST 请求即可生成图像响应体中的b64_json为 base64 编码的图片数据curl -X POST http://localhost:8091/v1/images/generations \ -H Content-Type: application/json \ -d { model: stabilityai/stable-diffusion-xl-base-1.0, prompt: a cute cat sitting on a windowsill, highly detailed, sharp focus, negative_prompt: blurry, out of focus, low quality, guidance_scale: 7.5, n: 1, size: 1024x1024 } | python3 -c import json, base64, sys data json.load(sys.stdin) with open(output.png, wb) as f: f.write(base64.b64decode(data[data][0][b64_json])) print(saved output.png) 仓库内的轻量示例 examples/online_serving/text_to_image/run_curl_text_to_image.sh 也展示了同类用法用jqbase64 -d直接落盘为 PNG可作为无 Python 环境下的备选方案。验证要点离线推理检查输出图像文件是否存在且内容有效非空、可正常打开在线服务确认 HTTP 200 响应且data[0].b64_json解码后可写为有效 PNG。关键使用注意事项Recipe 明确记录了几条与 SDXL 生成质量强相关的约束negative_prompt仅在guidance_scale 1时生效推荐取值范围5.0–9.0默认分辨率 1024×1024另支持512×512、768×768显存参考模型权重约6.5 GiB1024×1024 开启 CFG 时峰值约10.9 GiBXPU 环境生成耗时1024×1024、30 步去噪约7.5 秒/张Intel Data Center GPU模型使用双 CLIP 文本编码器ViT-L/14 OpenCLIP ViT-bigG/14以获得更丰富的文本语义理解。源码级原理SDXL 在 vLLM-Omni 中的实现注册与模型发现SDXL 并非临时接入的“黑盒”而是 vLLM-Omni 扩散模型体系中的一等公民。在 vllm_omni/diffusion/registry.py 中模型以键sdxl注册到pipeline_sdxl模块L355-L356后处理函数以StableDiffusionXLPipeline为名注册对应get_sdxl_image_post_process_funcL615负责将扩散输出解码为最终图像。这解释了为何--model stabilityai/stable-diffusion-xl-base-1.0可以被自动识别并路由到正确的管道类。SDXL 管道pipeline_sdxl.pySDXL 的推理主流程实现在 vllm_omni/diffusion/models/sdxl/pipeline_sdxl.py 的StableDiffusionXLPipeline类中核心阶段包括双文本编码_get_clip_prompt_embeds与encode_prompt分别驱动两个文本编码器CLIP ViT-L/14 与 OpenCLIP ViT-bigG/14产出 prompt embeddings 与 pooled embeddings——这正是 Recipe 中“双 CLIP 文本编码器带来丰富文本理解”的实现落点条件注入_get_add_time_ids构造 SDXL 特有的 added conditionoriginal_size、crops_coords_top_left、target_size三类时间步 ID将目标尺寸与裁剪坐标信息注入 UNet 的added_cond_kwargs这也是 SDXL 相比 SD 1.x 支持“微调尺寸/裁剪”的关键机制潜空间初始化prepare_latents依据 batch size、潜空间通道数与 seed 对应的torch.Generator初始化噪声去噪循环diffuse在timesteps上迭代调用predict_noise当启用 CFG 时同时计算条件positive与无条件negative两条分支的噪声预测并按guidance_scale组合guidance_scale、num_timesteps、current_timestep等属性暴露给调度器/监控层interrupt提供中断钩子权重加载load_weights将 Hugging Face diffusers 格式的 checkpoint 映射进 vLLM-Omni 的权重加载管线。SDXL UNetsdxl_unet.py去噪主网络实现在 vllm_omni/diffusion/models/sdxl/sdxl_unet.py从类结构可以完整还原 SDXL 的经典 UNet 拓扑TimestepEmbedding时间步嵌入、Timestepssinusoidal 位置编码、AddedTimestepEmbedBlock将 pooled text embedding 与 time ids 融合为 added condition 嵌入、ResnetBlock2D、Attention/BasicTransformerBlock交叉注意力注入encoder_hidden_states即双 CLIP 的文本嵌入、以及编解码两路的DownBlock2D/CrossAttnDownBlock2D/UpBlock2D/CrossAttnUpBlock2D与瓶颈UNetMidBlock2DCrossAttn。此外_build_sdxl_sp_plan与_is_shardable_block表明该 UNet 已内置序列并行Sequence Parallel的分片规划能力可与--ulysses-degree、--ring-degree配合用于多卡扩展。与示例脚本的衔接text_to_image.py 在初始化Omni后通过build_text_to_image_prompt构造包含modalities: [image]与可选negative_prompt的请求体将height/width/seed/guidance_scale/num_inference_steps等写入OmniDiffusionSamplingParams最后经omni.generate()送入 SDXL 管道。这意味着你无需了解内部细节即可完成部署而需要深入调优时又能顺藤摸瓜找到上述源码。总结SDXL Base 1.0 在 vLLM-Omni 中拥有完整的落地路径离线推理一行命令即可产出 1024×1024 写实图像在线服务通过 OpenAI 兼容的/v1/images/generations端点接入标准生态双 CLIP 文本编码、added condition 条件注入、CFG 引导与序列并行等机制在 vllm_omni/diffusion/models/sdxl 中有完整实现可供研读。若你希望对比更新一代的扩散架构可参考同目录下的 Stable-Diffusion-3.5 与 Stable-Audio-Open Recipe或浏览 examples/offline_inference/text_to_image/README.md 中全部受支持模型与进阶参数。【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表