ComfyUI-CPU / start.sh
R1000's picture
Update start.sh
2ce2467 verified
Raw History Blame Contribute Delete
6.78 kB
#!/usr/bin/env bash
set -Eeuo pipefail
COMFY="${COMFYUI_PATH:-/app/ComfyUI}"
# ------------------------------------------------------------
# Runtime directories
# ------------------------------------------------------------
# This is intentionally done before ComfyUI starts.
# ComfyUI 0.35.x creates /app/ComfyUI/user itself.
mkdir -p \
"$COMFY/user" \
"$COMFY/input" \
"$COMFY/output" \
"$COMFY/temp" \
"$COMFY/workflows" \
"$COMFY/models/unet" \
"$COMFY/models/checkpoints" \
"$COMFY/models/diffusion_models" \
"$COMFY/models/audio_encoders" \
"$COMFY/models/text_encoders" \
"$COMFY/models/vae"
# ------------------------------------------------------------
# ComfyUI Manager Security Setup
# ------------------------------------------------------------
MANAGER_CONFIG_DIR="$COMFY/user/default/ComfyUI-Manager"
# mkdir -p "$MANAGER_CONFIG_DIR"
# cat << 'EOF' > "$MANAGER_CONFIG_DIR/config.ini"
# [ComfyUI-Manager]
# security_level = weak
# privacy_mode = false
# EOF
# echo "[INFO] ComfyUI Manager security level set to weak."
# ------------------------------------------------------------
# Persistent storage
# ------------------------------------------------------------
# If HF Storage is mounted at /data, models survive Space restarts.
# Without persistent storage, downloaded models live in the container
# filesystem and may have to be downloaded again after a rebuild/restart.
PERSIST_ROOT="/data/comfyui"
if [ -d "/data" ] && [ -w "/data" ]; then
mkdir -p "$PERSIST_ROOT/models"
else
PERSIST_ROOT="$COMFY"
fi
MODEL_ROOT="$PERSIST_ROOT/models"
# ------------------------------------------------------------
# Model configuration
# ------------------------------------------------------------
# Define models to download.
# Format: "repo_id|filename|dest_subdir"
# dest_subdir should be one of: unet, text_encoders, vae, loras, controlnet, workflows, etc.
#
# You can override this list by setting the MODELS_TO_DOWNLOAD environment variable.
# Example: export MODELS_TO_DOWNLOAD="repo1|file1|unet;repo2|file2|vae"
if [ -n "${MODELS_TO_DOWNLOAD:-}" ]; then
IFS=';' read -r -a MODEL_LIST <<< "$MODELS_TO_DOWNLOAD"
else
MODEL_LIST=(
"vantagewithai/Krea-2-Turbo-GGUF|krea2_turbo-Q5_K_M.gguf|unet"
"unsloth/FLUX.2-klein-4B-GGUF|flux-2-klein-4b-Q5_K_M.gguf|unet"
"InsecureErasure/Krea2-Turbo-mixed-NVFP4|krea2_turbo_mixed_nvfp4.safetensors|diffusion_models"
"Comfy-Org/Qwen3-VL|text_encoders/qwen3vl_4b_fp8_scaled.safetensors|text_encoders"
"Comfy-Org/Qwen-Image_ComfyUI|split_files/vae/qwen_image_vae.safetensors|vae"
"realrebelai/KREA-2_GGUFs|Rebels KREA-2-TURBO.json|workflows"
"Comfy-Org/YuE2|checkpoints/yue2_3b_int8_convrot.safetensors|checkpoints"
"Comfy-Org/YuE2|audio_encoders/sheetsage2_bf16.safetensors|audio_encoders"
#"Sporer/flux2-klein-4b-nvfp4|flux-2-klein-4b-nvfp4.safetensors|diffusion_models"
"unsloth/FLUX.2-VAE|split_files/vae/flux2-vae.safetensors|vae"
# เพิ่มโมเดลอื่นๆ ได้ที่นี่ เช่น:
# "some-repo/some-model|path/to/model.safetensors|loras"audio_encoders
)
fi
# ------------------------------------------------------------
# Model directory links
# ------------------------------------------------------------
# Only replace an empty ComfyUI model directory.
# This avoids deleting any models supplied in the Space image.
link_model_dir() {
local name="$1"
local target="$COMFY/models/$name"
local source="$MODEL_ROOT/$name"
mkdir -p "$source"
if [ "$source" = "$target" ]; then
return
fi
if [ -L "$target" ]; then
return
fi
if [ -d "$target" ]; then
if [ -z "$(find "$target" -mindepth 1 -maxdepth 1 -print -quit 2>/dev/null)" ]; then
rmdir "$target"
ln -s "$source" "$target"
else
echo "[INFO] Keeping non-empty model directory: $target"
fi
fi
}
# Dynamically link model directories based on MODEL_LIST
UNIQUE_SUBDIRS=$(printf "%s\n" "${MODEL_LIST[@]}" | awk -F'|' '$3 != "" {print $3}' | grep -v "^workflows$" | sort -u)
for subdir in $UNIQUE_SUBDIRS; do
link_model_dir "$subdir"
done
echo "============================================================"
echo "ComfyUI Krea2 - Hugging Face CPU"
echo "============================================================"
python - <<'PY'
import os
import torch
print("PyTorch:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
print("CPU threads:", os.environ.get("OMP_NUM_THREADS"))
print("RAM limit is controlled by the Hugging Face Space hardware.")
PY
# ------------------------------------------------------------
# Hugging Face downloader
# ------------------------------------------------------------
download_hf() {
local repo="$1"
local file="$2"
local dest="$3"
if [ -s "$dest" ]; then
echo "[OK] Existing: $dest"
return 0
fi
echo "[DOWNLOAD] $repo :: $file"
python - "$repo" "$file" "$dest" <<'PY'
import os
import sys
from huggingface_hub import hf_hub_download
repo, filename, dest = sys.argv[1:4]
token = os.environ.get("HF_TOKEN") or os.environ.get("HUGGINGFACE_HUB_TOKEN")
path = hf_hub_download(
repo_id=repo,
filename=filename,
token=token,
local_dir=os.path.dirname(dest),
)
if os.path.abspath(path) != os.path.abspath(dest):
if os.path.exists(dest):
os.remove(dest)
os.replace(path, dest)
print("[OK] downloaded:", dest)
PY
}
# ------------------------------------------------------------
# Download models
# ------------------------------------------------------------
if [ "${KREA2_DOWNLOAD_MODELS:-1}" = "1" ]; then
for model_entry in "${MODEL_LIST[@]}"; do
[ -z "$model_entry" ] && continue
IFS='|' read -r repo file subdir <<< "$model_entry"
if [ "$subdir" = "workflows" ]; then
dest_dir="$COMFY/workflows"
else
dest_dir="$COMFY/models/$subdir"
fi
mkdir -p "$dest_dir"
dest_path="$dest_dir/$(basename "$file")"
download_hf "$repo" "$file" "$dest_path"
done
else
echo "[INFO] KREA2_DOWNLOAD_MODELS=0; model download skipped."
fi
# ------------------------------------------------------------
# CPU optimization
# ------------------------------------------------------------
export OMP_NUM_THREADS="${OMP_NUM_THREADS:-2}"
export MKL_NUM_THREADS="${MKL_NUM_THREADS:-2}"
export OPENBLAS_NUM_THREADS="${OPENBLAS_NUM_THREADS:-2}"
export NUMEXPR_NUM_THREADS="${NUMEXPR_NUM_THREADS:-2}"
export TOKENIZERS_PARALLELISM=false
cd "$COMFY"
echo "============================================================"
echo "Starting ComfyUI"
echo "============================================================"
exec python -u main.py \
--cpu \
--listen 0.0.0.0 \
--port "${PORT:-7860}" \
--output-directory "$COMFY/output"