Spaces:
Running
Running
Download start.sh from R1000/ComfyUI-CPU: direct link, hf CLI and curl.
- Browser
- Download file 6.78 kB
-
https://huggingface.co/spaces/R1000/ComfyUI-CPU/resolve/main/start.sh
- Command line
-
hf download hf://spaces/R1000/ComfyUI-CPU/start.sh
-
curl -L -o start.sh https://huggingface.co/spaces/R1000/ComfyUI-CPU/resolve/main/start.sh
6.78 kB
| 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" |