Adds AI_PROVIDER=local_gpu — a fully self-contained GPU inference engine
using HuggingFace Diffusers that requires zero InvokeAI/ComfyUI setup.
All existing providers (InvokeAI, ComfyUI, OpenAI, Replicate) remain intact
and can be mixed with local GPU via per-operation overrides.
New features:
- GPU auto-detection (CUDA/NVIDIA, MPS/Apple Silicon, CPU fallback)
- VRAM-tiered model selection:
ultra ≥16 GB → SDXL inpaint + SDXL base
high 8-16 GB → SDXL inpaint + SDXL base
medium 4-8 GB → SD 2.x inpaint + SD 2.1
low <4 GB → SD 2.x (small)
- Auto-download model weights to HuggingFace disk cache at startup
(background task; first request loads from local disk, not internet)
- LRU pipeline cache evicts oldest GPU pipeline when VRAM limit reached
- Per-operation model overrides via HF_MODEL_INPAINT / HF_MODEL_TXT2IMG etc.
- Optional HF_TOKEN for gated/private HuggingFace models
New files:
- backend/app/services/gpu_detect.py — GPU detection + tier/model mapping
- backend/app/services/local_diffusion.py — Diffusers provider + LRU cache
- backend/app/routers/gpu_status.py — GET /api/gpu/status, POST /api/gpu/prefetch
- backend/requirements.gpu.txt — Diffusers ecosystem deps (GPU only)
- docker-compose.gpu.yml — NVIDIA GPU compose (one-command startup)
- Dockerfile.gpu — pytorch/pytorch:2.1.0-cuda12.1 base image
- scripts/gpu_setup.py — Startup GPU info logger
Modified:
- backend/app/config.py — local_gpu settings added
- backend/app/services/remote_provider.py — local_gpu registered as provider
- backend/app/routers/ai_tools.py — /api/config exposes GPU tier + caps
- backend/app/main.py — GPU router + background prefetch task
- backend/entrypoint.sh — runs gpu_setup.py at container start
- .env.example — local_gpu documented as first option
Quick start with GPU:
docker compose -f docker-compose.gpu.yml up --build
https://claude.ai/code/session_01WVDg7amsy1TTtxvpku7bcM
197 lines
11 KiB
Bash
197 lines
11 KiB
Bash
# =============================================================================
|
||
# AI Photo Edit - Environment Configuration
|
||
# =============================================================================
|
||
#
|
||
# SETUP INSTRUCTIONS:
|
||
# 1. Copy this file to .env: cp .env.example .env
|
||
# 2. Get API key from Replicate (see below)
|
||
# 3. Paste your key in the REPLICATE_API_KEY line
|
||
# 4. Rebuild: docker-compose up -d --build
|
||
#
|
||
# =============================================================================
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 1: Choose AI Provider
|
||
# =============================================================================
|
||
# Options: local_gpu, mock, openai, stability, replicate, invokeai, comfyui
|
||
#
|
||
# local_gpu = FREE, runs on YOUR GPU — best option if you have an NVIDIA card
|
||
# (use docker-compose.gpu.yml — models auto-download on first use)
|
||
# mock = Free, returns original image unchanged (UI testing only)
|
||
# openai = DALL-E 3 / gpt-image-1 (~$0.02-0.04/image)
|
||
# stability = Stability AI SDXL (~$0.01/image)
|
||
# replicate = Multiple models (~$0.002-0.03/image)
|
||
# invokeai = Self-hosted InvokeAI running on another machine
|
||
# comfyui = Self-hosted ComfyUI running on another machine
|
||
#
|
||
# GPU QUICK-START:
|
||
# docker compose -f docker-compose.gpu.yml up --build
|
||
# (AI_PROVIDER defaults to local_gpu in that compose file)
|
||
# =============================================================================
|
||
|
||
AI_PROVIDER=replicate
|
||
|
||
# ── Local GPU settings (only relevant when AI_PROVIDER=local_gpu) ────────────
|
||
# Auto-download HuggingFace models on first request (true/false)
|
||
AUTO_DOWNLOAD_MODELS=true
|
||
# Max diffusion pipelines to keep loaded in GPU memory (each is 2–7 GB)
|
||
LOCAL_GPU_MAX_PIPELINES=2
|
||
# HuggingFace token — only needed for gated/private models
|
||
#HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
# Override auto-selected model for any operation (leave blank = auto by VRAM tier)
|
||
#HF_MODEL_INPAINT=your-org/your-inpaint-model
|
||
#HF_MODEL_TXT2IMG=your-org/your-txt2img-model
|
||
#HF_MODEL_IMG2IMG=your-org/your-img2img-model
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
# Per-operation provider overrides (optional — blank means use AI_PROVIDER above)
|
||
# Example: use OpenAI for text-to-image (best quality) but InvokeAI for everything else
|
||
#AI_PROVIDER_TXT2IMG=openai
|
||
#AI_PROVIDER_INPAINT=invokeai
|
||
#AI_PROVIDER_IMG2IMG=invokeai
|
||
#AI_PROVIDER_OUTPAINT=invokeai
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 2: Get Your API Key
|
||
# =============================================================================
|
||
#
|
||
# ╔═══════════════════════════════════════════════════════════════════════════╗
|
||
# ║ REPLICATE (RECOMMENDED) ║
|
||
# ╠═══════════════════════════════════════════════════════════════════════════╣
|
||
# ║ ║
|
||
# ║ 1. Go to: https://replicate.com ║
|
||
# ║ 2. Click "Sign in" (use GitHub, Google, or email) ║
|
||
# ║ 3. Go to: https://replicate.com/account/api-tokens ║
|
||
# ║ 4. Click "Create token" ║
|
||
# ║ 5. Copy the token (starts with "r8_") ║
|
||
# ║ 6. Paste it below after REPLICATE_API_KEY= ║
|
||
# ║ ║
|
||
# ║ FREE TIER: New accounts get some free credits to try models! ║
|
||
# ║ PRICING: ~$0.002-0.03 per image depending on model ║
|
||
# ║ ║
|
||
# ╚═══════════════════════════════════════════════════════════════════════════╝
|
||
|
||
REPLICATE_API_KEY=r8_PASTE_YOUR_KEY_HERE
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# OPENAI (cloud, dall-e-3 / gpt-image-1)
|
||
# Get key at: https://platform.openai.com/api-keys
|
||
# AI_PROVIDER=openai
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
#OPENAI_MODEL=dall-e-3
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# INVOKEAI (self-hosted, best for Flux/SDXL)
|
||
# Run InvokeAI on your local machine or NAS, point URL here.
|
||
# AI_PROVIDER=invokeai
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#INVOKEAI_URL=http://192.168.1.x:9090
|
||
#INVOKEAI_DEFAULT_MODEL=flux-dev
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# COMFYUI (self-hosted, workflow JSON API)
|
||
# AI_PROVIDER=comfyui
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#COMFYUI_URL=http://192.168.1.x:8188
|
||
#COMFYUI_DEFAULT_MODEL=v1-5-pruned-emaonly.ckpt
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# STABILITY AI (Alternative)
|
||
# Get key at: https://platform.stability.ai/account/keys
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#STABILITY_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 3: Model Selection (OPTIONAL - for advanced users)
|
||
# =============================================================================
|
||
#
|
||
# By default, the system AUTO-SELECTS the best model based on your prompt:
|
||
# - Prompt contains "remove/erase/delete" → Uses LaMa (fast removal)
|
||
# - Prompt contains "face/hands/person" → Uses Realistic Vision
|
||
# - Everything else → Uses SDXL Inpaint
|
||
#
|
||
# To FORCE a specific model, uncomment ONE line below:
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
|
||
# REPLICATE_MODEL=sdxl-inpaint # General purpose, good quality (~$0.01)
|
||
# REPLICATE_MODEL=lama # Object removal ONLY (~$0.002, fastest)
|
||
# REPLICATE_MODEL=realistic-vision # Faces, hands, skin (~$0.02)
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# IMPORTANT: About Flux and other text-to-image models
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#
|
||
# Models like "black-forest-labs/flux-kontext-pro" are TEXT-TO-IMAGE models.
|
||
# They generate NEW images from text, they DON'T edit existing images.
|
||
#
|
||
# For EDITING (inpainting), you need models that accept:
|
||
# - An existing image
|
||
# - A mask showing what to change
|
||
# - A prompt describing the change
|
||
#
|
||
# WORKS for editing: DOESN'T work for editing:
|
||
# ✓ sdxl-inpaint ✗ flux-kontext-pro (text-to-image)
|
||
# ✓ lama ✗ flux-dev (text-to-image)
|
||
# ✓ realistic-vision ✗ ideogram (text-to-image)
|
||
#
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
|
||
# Stability AI model selection (if using AI_PROVIDER=stability)
|
||
#STABILITY_MODEL=sdxl # Options: sdxl, sd15, sd21
|
||
|
||
|
||
# =============================================================================
|
||
# SECURITY (Change this in production!)
|
||
# =============================================================================
|
||
|
||
SECRET_KEY=change-this-to-a-long-random-string-in-production
|
||
|
||
|
||
# =============================================================================
|
||
# ADVANCED SETTINGS (Usually don't need to change)
|
||
# =============================================================================
|
||
|
||
# CORS origins (comma-separated)
|
||
CORS_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:3080,http://localhost
|
||
|
||
# Database path
|
||
DATABASE_URL=sqlite:///./data/ai_photo_edit.db
|
||
|
||
# Auto-download SAM model on startup (true/false)
|
||
# When true (default): Downloads SAM model (~375MB) on first startup for offline Smart Select
|
||
# When false: Skips download, Smart Select uses Replicate API (requires REPLICATE_API_KEY)
|
||
AUTO_DOWNLOAD_SAM=true
|
||
|
||
# Allow users to select model per-edit
|
||
ALLOW_MODEL_OVERRIDE=true
|
||
|
||
|
||
# =============================================================================
|
||
# TROUBLESHOOTING
|
||
# =============================================================================
|
||
#
|
||
# PROBLEM: "405 Method Not Allowed" errors
|
||
# FIX: Rebuild container: docker-compose build --no-cache && docker-compose up -d
|
||
#
|
||
# PROBLEM: "REPLICATE_API_KEY not configured"
|
||
# FIX: 1. Make sure .env file exists (not just .env.example)
|
||
# 2. Make sure REPLICATE_API_KEY has your actual key
|
||
# 3. Restart: docker-compose down && docker-compose up -d
|
||
#
|
||
# PROBLEM: Edits don't change the image
|
||
# FIX: Check AI_PROVIDER isn't set to "mock"
|
||
#
|
||
# PROBLEM: "rembg not installed"
|
||
# FIX: Rebuild: docker-compose build --no-cache backend
|
||
#
|
||
# PROBLEM: Smart Select uses flood-fill instead of AI
|
||
# FIX: Smart Select needs REPLICATE_API_KEY for SAM model
|
||
#
|
||
# CHECK LOGS: docker-compose logs -f backend
|
||
#
|
||
# =============================================================================
|