Diffusers documentation

Sunucu oluşturun

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

Sunucu oluşturun

Diffusers'ın pipelines bir sunucu için çıkarım motoru olarak kullanılabilir. Aynı anda birden fazla kullanıcı tarafından istenebilecek görselleri üretmek için eşzamanlı ve çok iş parçacıklı istekleri destekler.

Bu kılavuz, bir sunucuda StableDiffusion3Pipeline kullanmanın nasıl yapılacağını gösterecektir, ancak istediğiniz herhangi bir pipeline'ı kullanmakta serbestsiniz.

examples/server klasörüne giderek başlayın ve tüm bağımlılıkları yükleyin.

pip install .
pip install -f requirements.txt

Sunucuyu aşağıdaki komutla başlatın.

python server.py

Sunucuya http://localhost:8000 adresinden erişilir. Bu modele aşağıdaki komutla curl ile istek gönderebilirsiniz.

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

Bazı bağımlılıkları yükseltmeniz gerekiyorsa pip-tools veya uv kullanabilirsiniz. Örneğin, bağımlılıkları aşağıdaki komutu kullanarak uv ile yükseltin.

uv pip compile requirements.in -o requirements.txt

Sunucu FastAPI ile oluşturulmuştur. v1/images/generations uç noktası aşağıda gösterilmektedir.

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

generate_image fonksiyonu, FastAPI'nin bu fonksiyondaki işlemlerin hemen bir sonuç döndürmeyebileceğini bilmesi için async anahtar sözcüğüyle asenkron olarak tanımlanır. Fonksiyon, başka bir Task'i beklemesi gereken bir noktaya ulaştığında ana iş parçacığı, diğer HTTP isteklerine yanıt vermeye geri döner. Bu durum, aşağıdaki kodda await anahtar sözcüğüyle gösterilmektedir.

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

Bu noktada, pipeline işlevinin çalıştırılması yeni bir iş parçacığına aktarılır ve ana iş parçacığı, pipeline tarafından bir sonuç dönene kadar diğer işlemleri gerçekleştirir.

Bu uygulamanın bir diğer önemli yönü, shared_pipeline üzerinden bir pipeline oluşturmaktır. Bunun amacı, alttaki modelin GPU'ya birden fazla kez yüklenmesini önlerken, ayrı bir iş parçacığında çalışan her yeni isteğin kendi üreteci ve zamanlayıcısına sahip olmasını sağlamaktır. Özellikle zamanlayıcı iş parçacığı güvenli değildir ve aynı zamanlayıcının birden fazla iş parçacığında kullanılmaya çalışılması durumunda IndexError: index 21 is out of bounds for dimension 0 with size 21 gibi hatalara neden olur.

Update on GitHub