Diffusers documentation
Crear un servidor
Crear un servidor
Los pipelines de Diffusers pueden utilizarse como motor de inferencia para un servidor. Admite solicitudes concurrentes y multihilo para generar imágenes que pueden ser solicitadas por varios usuarios al mismo tiempo.
Esta guía te mostrará cómo usar StableDiffusion3Pipeline en un servidor, pero puedes usar el pipeline que prefieras.
Comience navegando hasta la carpeta examples/server e instale todas las dependencias.
pip install . pip install -f requirements.txt
Inicie el servidor con el siguiente comando.
python server.py
El servidor se accede en http://localhost:8000. Puedes hacer una solicitud a este modelo con el siguiente comando.
curl -X POST -H "Content-Type: application/json" --data '{"model": "something", "prompt": "a kitten in front of a fireplace"}' http://localhost:8000/v1/images/generationsSi necesitas actualizar algunas dependencias, puedes usar pip-tools o uv. Por ejemplo, actualiza las dependencias con uv usando el siguiente comando.
uv pip compile requirements.in -o requirements.txtEl servidor se construye con FastAPI. El punto de acceso para v1/images/generations se muestra a continuación.
@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") # or "mps", "xpu", "cpu"
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())La función generate_image se define como asíncrona con la palabra clave async para que FastAPI sepa que lo que ocurre en esta función no devolverá necesariamente un resultado de inmediato. Una vez que llega a un punto de la función en el que necesita esperar a otra Task, el hilo principal vuelve a responder otras solicitudes HTTP. Esto se muestra en el siguiente código con la palabra clave await.
output = await loop.run_in_executor(None, lambda: pipeline(image_input.prompt, generator = generator))En este punto, la ejecución de la función de pipeline se coloca en un nuevo hilo, y el hilo principal realiza otras tareas hasta que se devuelve un resultado desde pipeline.
Otro aspecto importante de esta implementación es la creación de un pipeline a partir de shared_pipeline. El objetivo de esto es evitar cargar el modelo subyacente en la GPU más de una vez, permitiendo al mismo tiempo que cada nueva solicitud que se ejecuta en un hilo separado tenga su propio generador y programador. En particular, el programador no es seguro para hilos, y provocará errores como: IndexError: index 21 is out of bounds for dimension 0 with size 21 si se intenta usar el mismo programador en varios hilos.