181 lines
5.1 KiB
Plaintext
181 lines
5.1 KiB
Plaintext
# Z-Image-Turbo on AMD BC-250 — Setup Documentation
|
||
|
||
## Overview
|
||
|
||
**Z-Image-Turbo** image generation server running on **AMD BC-250** (GFX1013 RDNA2, 24 CUs) via **Vulkan** (RADV/Mesa) on **CachyOS**.
|
||
|
||
| Component | Detail |
|
||
|-----------|--------|
|
||
| **GPU** | AMD BC-250 — 24 CUs, GFX1013 RDNA2, 16 GB shared GDDR6 |
|
||
| **Driver** | RADV (Mesa 25.3.4) via Vulkan 1.4.335 |
|
||
| **Backend** | Vulkan only (no ROCm) |
|
||
| **Server** | [stable-diffusion.cpp-restapi](https://github.com/fszontagh/stable-diffusion.cpp-restapi) |
|
||
| **OS** | CachyOS (Arch-based) |
|
||
|
||
## Models
|
||
|
||
| Model | File | Size | Location |
|
||
|-------|------|------|----------|
|
||
| Z-Image-Turbo | `z_image_turbo-Q5_K_S.gguf` | 4.9 GB | `~/sd-models/diffusion_models/` |
|
||
| Qwen3-4B Instruct | `Qwen3-4B-Instruct-2507-Q5_K_S.gguf` | 2.8 GB | `~/sd-models/llm/` |
|
||
| FLUX VAE | `ae.safetensors` | 320 MB | `~/sd-models/vae/` |
|
||
|
||
## Directory Structure
|
||
|
||
```
|
||
~/
|
||
├── stable-diffusion.cpp-restapi/
|
||
│ └── build/
|
||
│ ├── bin/sdcpp-restapi # Server binary (80 MB)
|
||
│ ├── config.json # Server configuration
|
||
│ └── webui/ # Vue.js WebUI
|
||
├── sd-models/
|
||
│ ├── diffusion_models/ # Main diffusion model GGUFs (Z-Image)
|
||
│ ├── checkpoints/ # Legacy checkpoint models
|
||
│ ├── vae/ # VAE models
|
||
│ ├── llm/ # LLM models (prompt enhancement)
|
||
│ ├── lora/ # LoRA adapters
|
||
│ ├── clip/ # CLIP models
|
||
│ ├── t5/ # T5 text encoders
|
||
│ ├── embeddings/ # Textual inversions
|
||
│ ├── controlnet/ # ControlNet models
|
||
│ ├── esrgan/ # Upscaler models
|
||
│ └── taesd/ # Tiny AutoEncoder models
|
||
├── sd-outputs/ # Generated images
|
||
├── start-zimage.sh # Quick start script
|
||
└── .config/systemd/user/
|
||
└── zimage.service # Systemd user service
|
||
```
|
||
|
||
## Quick Start
|
||
|
||
```bash
|
||
# Option 1: Manual start
|
||
~/start-zimage.sh
|
||
|
||
# Option 2: Systemd service
|
||
systemctl --user start zimage
|
||
```
|
||
|
||
Then open: **http://localhost:8080/ui**
|
||
|
||
## Usage
|
||
|
||
### WebUI
|
||
|
||
1. Open http://localhost:8080/ui
|
||
2. Go to **Models** → select `z_image_turbo-Q5_K_S.gguf`
|
||
3. Set VAE to `ae.safetensors`, LLM to `Qwen3-4B-Instruct-2507-Q5_K_S.gguf`
|
||
4. First load takes 20–40 seconds
|
||
5. Settings: **Steps 8**, **CFG 1.0**, **Euler** sampler
|
||
6. Start with 512×512 (~37 s), then try 1024×1024 (~80 s)
|
||
|
||
### API — Load Model
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8080/models/load \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"model_name": "z_image_turbo-Q5_K_S.gguf",
|
||
"model_type": "diffusion",
|
||
"vae": "ae.safetensors",
|
||
"llm": "Qwen3-4B-Instruct-2507-Q5_K_S.gguf"
|
||
}'
|
||
```
|
||
|
||
### API — Generate Image (512×512)
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8080/txt2img \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"prompt": "astronaut on mars, cinematic",
|
||
"width": 512,
|
||
"height": 512,
|
||
"steps": 8,
|
||
"cfg_scale": 1.0,
|
||
"sampler_name": "euler",
|
||
"scheduler": "smoothstep",
|
||
"seed": -1
|
||
}' --output image.png
|
||
```
|
||
|
||
## Systemd Service
|
||
|
||
```bash
|
||
# Enable auto-start on login
|
||
systemctl --user enable zimage
|
||
|
||
# Start / stop / restart
|
||
systemctl --user start zimage
|
||
systemctl --user stop zimage
|
||
systemctl --user restart zimage
|
||
|
||
# View logs
|
||
journalctl --user -u zimage -f
|
||
```
|
||
|
||
## Vulkan Environment Variables
|
||
|
||
| Variable | Value | Purpose |
|
||
|----------|-------|---------|
|
||
| `AMD_VULKAN_ICD` | `RADV` | Use Mesa RADV driver |
|
||
| `GGML_VK_FORCE_MAX_ALLOCATION_SIZE` | `536870912` | 512 MB max alloc (OOM prevention) |
|
||
| `RADV_PERFTEST` | `nggc` | NGG culling compute boost |
|
||
|
||
## Troubleshooting
|
||
|
||
### Slow generation (>20s at 1024×1024)
|
||
```bash
|
||
# Check logs for allocation failures
|
||
journalctl --user -u zimage -f
|
||
|
||
# Try reducing max allocation to 256 MB
|
||
export GGML_VK_FORCE_MAX_ALLOCATION_SIZE=268435456
|
||
|
||
# Try AMDVLK instead of RADV
|
||
sudo pacman -S amdvlk
|
||
export AMD_VULKAN_ICD=AMDVLK
|
||
```
|
||
|
||
### Vulkan not detecting GPU
|
||
```bash
|
||
# Verify Vulkan
|
||
vulkaninfo --summary | grep BC-250
|
||
|
||
# Force ICD file path
|
||
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.x86_64.json vulkaninfo
|
||
```
|
||
|
||
### Out of Memory (OOM)
|
||
- Use Q3_K_S quantization (smaller model)
|
||
- Set `batch_count: 1` in generation requests
|
||
- Reduce resolution to 512×512
|
||
|
||
### Monitor GPU
|
||
```bash
|
||
# GPU utilization
|
||
watch radeontop
|
||
|
||
# VRAM usage
|
||
cat /sys/class/drm/card0/device/mem_info_vram_used
|
||
```
|
||
|
||
## Build from Source (Reference)
|
||
|
||
```bash
|
||
cd ~/stable-diffusion.cpp-restapi
|
||
mkdir -p build && cd build
|
||
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DSD_VULKAN=ON -DSDCPP_WEBUI=ON
|
||
ninja -j$(nproc --all)
|
||
```
|
||
|
||
## Performance Expectations
|
||
|
||
| Resolution | Expected Time | Notes |
|
||
|------------|--------------|-------|
|
||
| 512×512 | ~37 seconds | Q5_K_S, 8 steps, Euler, Vulkan |
|
||
| 512×1024 | ~80 seconds | Q5_K_S, 8 steps, Euler, Vulkan |
|
||
| 1024×1024 | ~150 seconds | Q5_K_S, 8 steps, Euler, Vulkan |
|
||
| First load | 20–40 seconds | One-time on startup |
|