diff --git a/laptop_full_setup.sh b/laptop_full_setup.sh index b208ee8..d06174f 100755 --- a/laptop_full_setup.sh +++ b/laptop_full_setup.sh @@ -105,6 +105,19 @@ else IMG_DEFAULT="" fi +# ── InvokeAI precision (GPU-aware) ─────────────────────────────────────────── +# Ampere+ (compute 8.0+) supports bfloat16 natively for better precision. +# All modern NVIDIA GPUs support float16. Fall back to auto if unsure. +GPU_COMPUTE=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null \ + | head -1 | tr -d '.' || echo "0") +if [[ "$GPU_COMPUTE" -ge 80 ]]; then + INVOKEAI_PRECISION="bfloat16" # Ampere+ (RTX 30xx/40xx/50xx, A-series, H100) +elif [[ "$GPU_COMPUTE" -ge 60 ]]; then + INVOKEAI_PRECISION="float16" # Pascal+ (GTX 10xx, RTX 20xx, Tesla P40/V100) +else + INVOKEAI_PRECISION="auto" # Let InvokeAI decide +fi + # ── new vs update ───────────────────────────────────────────────────────────── IS_UPDATE=false [[ -f "$BASE/docker-compose.yml" ]] && IS_UPDATE=true @@ -1179,7 +1192,7 @@ IMGENV environment: - INVOKEAI_HOST=0.0.0.0 - INVOKEAI_PORT=9090 - - INVOKEAI_PRECISION=float16 + - INVOKEAI_PRECISION=$INVOKEAI_PRECISION deploy: resources: reservations: @@ -1470,6 +1483,21 @@ elif $INSTALL_AI; then info "Skipping model pull — run later: bash $BASE/pull-models.sh" fi +# ── Install image generation base model (GPU-aware) ────────────────────────── +if $INSTALL_AI && ($SVC_INVOKEAI || $SVC_COMFYUI) && $PULL_MODELS; then + section "Image Generation Models" + info "GPU: ${TOTAL_VRAM}GB VRAM → $IMG_TIER" + if [[ -n "$IMG_DEFAULT" ]]; then + info "Auto-installing recommended model: $IMG_DEFAULT" + info "Supported on your GPU: $IMG_MODELS" + bash "$SCRIPT_DIR/setup-image-models.sh" --auto + else + warn "Not enough VRAM for image generation models (need at least 4GB)" + fi +elif $INSTALL_AI && ($SVC_INVOKEAI || $SVC_COMFYUI); then + info "Skipping image model install — run later: bash $SCRIPT_DIR/setup-image-models.sh" +fi + # ── Start ZIM downloads (answer was captured upfront) ──────────────────────── if $SVC_KIWIX && [[ "$ZIM_CHOICE" != "3" ]]; then section "Starting ZIM Downloads" diff --git a/local-ai-setup.sh b/local-ai-setup.sh index 1c74674..5e6fc84 100755 --- a/local-ai-setup.sh +++ b/local-ai-setup.sh @@ -80,6 +80,17 @@ else IMG_DEFAULT="" fi +# ── InvokeAI precision (GPU-aware) ─────────────────────────────────────────── +GPU_COMPUTE=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null \ + | head -1 | tr -d '.' || echo "0") +if [[ "$GPU_COMPUTE" -ge 80 ]]; then + INVOKEAI_PRECISION="bfloat16" # Ampere+ (RTX 30xx/40xx/50xx, A-series) +elif [[ "$GPU_COMPUTE" -ge 60 ]]; then + INVOKEAI_PRECISION="float16" # Pascal+ (GTX 10xx, RTX 20xx, Tesla P40/V100) +else + INVOKEAI_PRECISION="auto" # Let InvokeAI decide +fi + section "Local AI Stack — $($IS_UPDATE && echo UPDATE || echo NEW INSTALL)" info "Base : $BASE" info "IP : $LOCAL_IP" @@ -124,7 +135,7 @@ fi # ── directories ─────────────────────────────────────────────────────────────── section "Directories" -for d in papers repos workspace index invokeai-data invokeai-outputs kiwix gitea portainer-data logs; do +for d in papers repos workspace index invokeai-data invokeai-outputs comfyui-data comfyui-output kiwix gitea portainer-data logs; do mkdir -p "$BASE/$d" done ok "Ready under $BASE" @@ -602,6 +613,9 @@ services: - WEBUI_AUTH=true - ENABLE_RAG_WEB_SEARCH=true - RAG_WEB_SEARCH_ENGINE=duckduckgo + - ENABLE_IMAGE_GENERATION=true + - IMAGE_GENERATION_ENGINE=comfyui + - COMFYUI_BASE_URL=http://comfyui:8188 depends_on: ollama: {condition: service_healthy} @@ -726,7 +740,26 @@ services: environment: - INVOKEAI_HOST=0.0.0.0 - INVOKEAI_PORT=9090 - - INVOKEAI_PRECISION=float16 + - INVOKEAI_PRECISION=$INVOKEAI_PRECISION + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + + comfyui: + image: ghcr.io/ai-dock/comfyui:latest + container_name: comfyui + restart: unless-stopped + ports: ["0.0.0.0:8188:8188"] + volumes: + - comfyui-models:/opt/ComfyUI/models + - $BASE/comfyui-output:/opt/ComfyUI/output + - $BASE/comfyui-data:/opt/ComfyUI/custom_nodes + environment: + - CLI_ARGS=--listen 0.0.0.0 deploy: resources: reservations: @@ -748,6 +781,7 @@ volumes: ollama-models: open-webui-data: invokeai-models: + comfyui-models: COMPOSE ok "docker-compose.yml" @@ -759,7 +793,7 @@ if command -v ufw &>/dev/null && [[ ! -f "$BASE/.ufw-done" ]] || $FORCE; then [[ "$LAN" =~ /[0-9]+$ ]] || LAN="${LAN}/24" for pc in "3000:Open WebUI" "11434:Ollama" "8001:RAG" "8002:MCP" \ "8000:ChromaDB" "8080:Aider" "8181:Kiwix" \ - "3001:Gitea" "2222:Gitea SSH" "9090:InvokeAI" \ + "3001:Gitea" "2222:Gitea SSH" "9090:InvokeAI" "8188:ComfyUI" \ "9000:Portainer" "9443:Portainer S"; do sudo ufw allow from "$LAN" to any port "${pc%%:*}" proto tcp comment "${pc##*:}" >/dev/null done @@ -777,7 +811,8 @@ docker compose up -d echo "" echo " Open WebUI → http://$LOCAL_IP:3000" echo " Aider UI → http://$LOCAL_IP:8080 (Claude Code-like editor)" -echo " InvokeAI → http://$LOCAL_IP:9090" +echo " InvokeAI → http://$LOCAL_IP:9090 (inpainting, img2img)" +echo " ComfyUI → http://$LOCAL_IP:8188 (chat-integrated image gen)" echo " Kiwix → http://$LOCAL_IP:8181 (run kiwix_download.sh first)" echo " Gitea → http://$LOCAL_IP:3001" echo " RAG → http://$LOCAL_IP:8001/health" @@ -900,6 +935,15 @@ if ! $IS_UPDATE && ! $NO_PULL; then echo "" read -rp "Pull Ollama models now? (~15-30 min) [Y/n]: " DO_PULL [[ "${DO_PULL,,}" != "n" ]] && bash "$BASE/pull-models.sh" + + # Install image generation base model (GPU-aware) + if [[ -n "$IMG_DEFAULT" ]] && [[ -x "$SCRIPT_DIR/setup-image-models.sh" ]]; then + echo "" + section "Image Generation Models" + info "GPU: ${TOTAL_VRAM}GB VRAM → $IMG_TIER" + info "Auto-installing recommended model: $IMG_DEFAULT" + bash "$SCRIPT_DIR/setup-image-models.sh" --auto + fi fi # ============================================================================= @@ -911,7 +955,8 @@ echo -e "${GREEN}${BOLD}━━━━━━━━━━━━━━━━━━ echo "" echo -e " ${CYAN}Open WebUI${NC} → http://$LOCAL_IP:3000" echo -e " ${CYAN}Aider UI${NC} → http://$LOCAL_IP:8080 (browser coding assistant)" -echo -e " ${CYAN}InvokeAI${NC} → http://$LOCAL_IP:9090" +echo -e " ${CYAN}InvokeAI${NC} → http://$LOCAL_IP:9090 (inpainting, img2img)" +echo -e " ${CYAN}ComfyUI${NC} → http://$LOCAL_IP:8188 (chat-integrated image gen)" echo -e " ${CYAN}Kiwix${NC} → http://$LOCAL_IP:8181" echo -e " ${CYAN}Gitea${NC} → http://$LOCAL_IP:3001" echo -e " ${CYAN}RAG${NC} → http://$LOCAL_IP:8001/health"