# Sunucu oluşturun

Diffusers' pipeline'leri, 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](/docs/diffusers/main/tr/api/pipelines/stable_diffusion/stable_diffusion_3#diffusers.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.

```py
pip install .
pip install -f requirements.txt
```

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

```py
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](https://github.com/jazzband/pip-tools) veya [uv](https://github.com/astral-sh/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](https://fastapi.tiangolo.com/async/) ile oluşturulmuştur. `v1/images/generations` uç noktası aşağıda gösterilmektedir.
```py
@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](https://fastapi.tiangolo.com/async/) anahtar sözcüğüyle asenkron olarak tanımlanır. Fonksiyon, başka bir [Task](https://docs.python.org/3/library/asyncio-task.html#asyncio.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](https://fastapi.tiangolo.com/async/#async-and-await) anahtar sözcüğüyle gösterilmektedir.
```py
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](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor) 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.

