Diffusers 文档
创建服务器
加入 Hugging Face 社区
并获得增强的文档体验
开始使用
创建服务器
Diffusers 的流水线可以作为服务器的推理引擎。它支持并发和多线程请求,以生成可能同时被多个用户请求的图像。
本指南将向您展示如何在服务器中使用 StableDiffusion3Pipeline,但您可以随意使用任何您想要的流水线。
首先导航到 examples/server
文件夹并安装所有依赖项。
pip install . pip install -f requirements.txt
使用以下命令启动服务器。
python server.py
服务器访问地址为 https://:8000。您可以使用以下命令 curl 此模型。
curl -X POST -H "Content-Type: application/json" --data '{"model": "something", "prompt": "a kitten in front of a fireplace"}' http://:8000/v1/images/generations
如果需要升级某些依赖项,可以使用 pip-tools 或 uv。例如,使用以下命令通过 uv
升级依赖项。
uv pip compile requirements.in -o requirements.txt
该服务器使用 FastAPI 构建。v1/images/generations
的端点如下所示。
@app.post("/v1/images/generations")
async def generate_image(image_input: TextToImageInput):
try:
loop = asyncio.get_event_loop()
scheduler = shared_pipeline.pipeline.scheduler.from_config(shared_pipeline.pipeline.scheduler.config)
pipeline = StableDiffusion3Pipeline.from_pipe(shared_pipeline.pipeline, scheduler=scheduler)
generator = torch.Generator(device="cuda")
generator.manual_seed(random.randint(0, 10000000))
output = await loop.run_in_executor(None, lambda: pipeline(image_input.prompt, generator = generator))
logger.info(f"output: {output}")
image_url = save_image(output.images[0])
return {"data": [{"url": image_url}]}
except Exception as e:
if isinstance(e, HTTPException):
raise e
elif hasattr(e, 'message'):
raise HTTPException(status_code=500, detail=e.message + traceback.format_exc())
raise HTTPException(status_code=500, detail=str(e) + traceback.format_exc())
generate_image
函数被定义为异步函数,使用 async 关键字,以便 FastAPI 知道此函数中发生的一切不一定会立即返回结果。一旦它在函数中遇到需要等待其他 Task 的点,主线程就会返回响应其他 HTTP 请求。这在下面的代码中通过 await 关键字显示。
output = await loop.run_in_executor(None, lambda: pipeline(image_input.prompt, generator = generator))
此时,流水线函数的执行被放置到 新线程 上,主线程执行其他操作,直到流水线返回结果。
此实现中的另一个重要方面是从 shared_pipeline
创建一个 pipeline
。这样做的目的是避免将底层模型多次加载到 GPU 上,同时仍然允许在单独线程上运行的每个新请求拥有自己的生成器和调度器。特别是,调度器不是线程安全的,如果您尝试在多个线程上使用同一个调度器,它将导致诸如 IndexError: index 21 is out of bounds for dimension 0 with size 21
之类的错误。