Diffusers documentation

Buat server

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Buat server

Pipeline dari Diffusers dapat digunakan sebagai mesin inferensi untuk server. Ia mendukung permintaan konkuren dan multithreaded untuk menghasilkan gambar yang mungkin diminta oleh beberapa pengguna secara bersamaan.

Panduan ini akan menunjukkan cara menggunakan StableDiffusion3Pipeline di server, tetapi silakan gunakan pipeline apa pun yang Anda inginkan.

Mulai dengan menavigasi ke folder examples/server dan menginstal semua dependensi.

pip install .
pip install -f requirements.txt

Jalankan server dengan perintah berikut.

python server.py

Server diakses di http://localhost:8000. Anda dapat curl model ini dengan perintah berikut.

curl -X POST -H "Content-Type: application/json" --data '{"model": "something", "prompt": "a kitten in front of a fireplace"}' http://localhost:8000/v1/images/generations

Jika Anda perlu memperbarui beberapa dependensi, Anda dapat menggunakan pip-tools atau uv. Sebagai contoh, perbarui dependensi dengan uv menggunakan perintah berikut.

uv pip compile requirements.in -o requirements.txt

Server dibangun dengan FastAPI. Endpoint untuk v1/images/generations ditunjukkan di bawah ini.

@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())

Fungsi generate_image didefinisikan sebagai asinkron dengan kata kunci async agar FastAPI mengetahui bahwa apa pun yang terjadi di dalam fungsi ini tidak akan selalu mengembalikan hasil secara langsung. Begitu mencapai titik di mana fungsi tersebut perlu menunggu Task lain, thread utama kembali untuk menjawab permintaan HTTP lainnya. Hal ini ditunjukkan dalam kode di bawah dengan kata kunci await.

output = await loop.run_in_executor(None, lambda: pipeline(image_input.prompt, generator = generator))

Pada titik ini, eksekusi fungsi pipeline ditempatkan pada thread baru, dan thread utama melakukan hal lain hingga hasil dikembalikan dari pipeline.

Aspek penting lain dari implementasi ini adalah membuat pipeline dari shared_pipeline. Tujuan di balik ini adalah untuk menghindari pemuatan model dasar lebih dari sekali ke GPU, sambil tetap memungkinkan setiap permintaan baru yang berjalan di thread terpisah memiliki generator dan scheduler-nya sendiri. Scheduler, khususnya, tidak thread-safe, dan akan menyebabkan error seperti: IndexError: index 21 is out of bounds for dimension 0 with size 21 jika Anda mencoba menggunakan scheduler yang sama di beberapa thread.

Update on GitHub