# Deploy model endpoint for Stable Diffusion v2.1
In this tutorial, we will create a model endpoint for Stability AI’s **Stable Diffusion v2.1** model.
The tutorial focuses on:
* Step-by-step model endpoint creation and image generation
* Creating a model endpoint with custom model weights
* Supported parameters for image generation
For this tutorial, we’ll use the **Stable Diffusion v2.1** pre-built container. The advantage of using this is that the API handler is automatically created — no need to build one manually.
---
## A guide on model endpoint creation and image generation
### Step 1: Create a model endpoint for Stable Diffusion v2.1
1. Go to the [AI Platform](https://tir.e2enetworks.com).
2. Select a project.
3. Navigate to **Model Endpoints**.
4. Click **Create Endpoint**.
5. Choose the **Stable-Diffusion v2.1** model card under **Choose Framework**.
6. Pick a suitable GPU plan. You can keep default values for replicas, disk size, and endpoint details.
7. Add environment variables if required, otherwise proceed.
8. Skip custom model weights for now; we’ll use the default ones. (See [Creating model endpoint with custom model weights](#creating-model-endpoint-with-custom-model-weights) if needed.)
9. Complete endpoint creation.
---
### Step 2: Generate your API token
The model endpoint API requires an **auth token**.
1. Go to the **API Tokens** section in your project.
2. Click **Create Token** or use an existing one.
3. Copy the generated **Auth Token** — you’ll use it in the next step.
---
### Step 3: Generate images using text prompts
Once your model endpoint is **Ready**, test it using the **Sample API Request** shown on the model details page.
1. Launch a **Instance** with **PyTorch** or **StableDiffusion** image.
2. Open Jupyter Labs → start a new notebook `untitled.ipynb`.
3. Paste the Python **Sample API Request** from the endpoint.
4. Replace `$AUTH_TOKEN` with your actual token.
5. Run the cell to generate results.
The endpoint will return tensors (PyTorch format) representing images. To visualize them:
Click to expand code
```python
import torch
import torchvision.transforms as transforms
def display_images(tensor_image_data_list):
'''convert PyTorch Tensors to PIL Image'''
for tensor_data in tensor_image_data_list:
tensor_image = torch.tensor(tensor_data.get("data"))
pil_img = transforms.ToPILImage()(tensor_image)
pil_img.show()
# Uncomment to save images
# pil_img.save(tensor_data.get("name"))
if response.status_code == 200:
display_images(response.json().get("predictions"))
```
Your Stable Diffusion endpoint is now up and running!
You can modify text prompts or parameters to explore different image generations. See [Supported parameters for image generation](#supported-parameters-for-image-generation) for more details.
---
## Creating model endpoint with custom model weights
To use custom model weights for Stable Diffusion v2.1:
1. Download the [Stable-Diffusion-2-1 model](https://huggingface.co/stabilityai/stable-diffusion-2-1).
2. Upload it to your **Model Bucket (EOS)**.
3. Create an endpoint pointing to the uploaded weights.
### Step 1.1: Define a model in the dashboard
1. Go to the [AI Platform](https://tir.e2enetworks.com).
2. Choose your project.
3. Navigate to **Models** → **Create Model**.
4. Name it (e.g., `stable-diffusion`).
5. Select **Model Type: Custom**.
6. Click **CREATE**.
7. Note the details of the created EOS bucket.
8. Copy the **Setup Host** command from **Setup MinIO CLI**.
---
### Step 1.2: Start a new Instance
1. Go to **Notebooks** and launch one using **Diffusers Image**.
2. Choose a GPU plan (recommended).
3. In Jupyter Labs, open **Terminal**.
4. Run the copied **MinIO CLI Host setup** command.
5. Confirm `mc` CLI is ready.
---
### Step 1.3: Download Stable Diffusion v2.1 model
Click to expand code
```python
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
model_id = "stabilityai/stable-diffusion-2-1"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe = pipe.to("cuda" if torch.cuda.is_available() else "cpu")
```
```bash
pip install diffusers transformers accelerate scipy safetensors
```
Run a quick test:
```python
prompt = "a photograph of an astronaut riding a horse"
image = pipe(prompt).images[0]
image.show()
```
---
## Step 2: Upload the model to EOS
Click to expand code
```bash
cd $HOME/.cache/huggingface/hub/models--stabilityai--stable-diffusion-2-1/snapshots
mc cp -r * stable-diffusion/stable-diffusion-854588
```
```bash
ls $HOME/.cache/huggingface/hub
```
---
## Step 3: Create an endpoint for your model
Return to the dashboard → **Model Endpoints** → **Create Endpoint**.
Select the model from your EOS bucket. If your model isn’t in the root directory, provide the path containing `model_index.json`.
## Supported parameters for image generation
Each request can include additional parameters to control image output.
**prompt** (str or list) — Text input guiding image generation.
```json
{
"prompt": [
"a photo of an astronaut riding a horse",
"a photo of a cat playing football"
]
}
```
**height / width** (int, defaults to 768) — Image dimensions in pixels.
```json
{
"prompt": "a photo of an astronaut riding a horse",
"height": 512,
"width": 1024
}
```
**num_images_per_prompt** (int, defaults to 1) — Number of images to generate per prompt.
```json
{
"prompt": ["horse", "cat"],
"num_images_per_prompt": 2
}
```
**generator** (list[int]) — Random seed for deterministic output.
```json
{
"prompt": ["horse", "cat"],
"generator": [1024, 700]
}
```
**num_inference_steps** (int, defaults to 50) — Denoising steps for quality control.
```json
{
"prompt": "horse",
"generator": [2000],
"num_inference_steps": 80
}
```
**negative_prompt** (str or list) — Prompts specifying what not to include in the image.
```json
{
"prompt": "a horse riding an astronaut",
"negative_prompt": "brown colored horse"
}
```
**guidance_scale** (float, defaults to 7.5) — Adjusts adherence to the prompt.
```json
{
"prompt": "a photo of an astronaut riding a horse",
"guidance_scale": 11
}
```
**guidance_rescale** (float, defaults to 0.7) — Adjusts overexposure correction.
```json
{
"prompt": "horse",
"generator": [2000],
"guidance_rescale": 0.3
}
```
---
## Troubleshooting and best practices
* Verify MinIO credentials before upload.
* Ensure sufficient GPU resources before deployment.
* Use smaller prompts or lower inference steps for testing.
* If API calls fail, check logs under endpoint details.
* Keep `guidance_scale` between 6–9 for balanced image quality.
---