Update setup_comfyui_wan22.sh
Browse files- setup_comfyui_wan22.sh +166 -104
setup_comfyui_wan22.sh
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
#!/usr/bin/env bash
|
| 2 |
-
#
|
| 3 |
-
# Script corrigido para instalação do ComfyUI com Wan 2.2
|
| 4 |
# Requisitos: Linux + Python3 + git + (opcional) NVCC/CUDA para SageAttention
|
| 5 |
|
| 6 |
set -Eeuo pipefail
|
|
@@ -23,7 +23,8 @@ log_error() { echo -e "${RED}[✗]${NC} $1"; }
|
|
| 23 |
# -----------------------------
|
| 24 |
# Configuráveis
|
| 25 |
# -----------------------------
|
| 26 |
-
|
|
|
|
| 27 |
COMFY_HOST="${COMFY_HOST:-0.0.0.0}"
|
| 28 |
COMFY_PORT="${COMFY_PORT:-8818}"
|
| 29 |
|
|
@@ -37,16 +38,30 @@ CIVITAI_TOKEN="${CIVITAI_TOKEN:-4fcb2834969399006a736ee402b061e5}"
|
|
| 37 |
|
| 38 |
# Configurações de performance
|
| 39 |
export HF_HUB_ENABLE_HF_TRANSFER=1
|
| 40 |
-
export HF_TRANSFER_CONCURRENCY=
|
| 41 |
-
export UV_SYSTEM_PYTHON=1
|
| 42 |
-
export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
|
| 43 |
|
| 44 |
# Detecção de CPU cores para compilação
|
| 45 |
CPU_CORES=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
# -----------------------------
|
| 52 |
# Setup inicial
|
|
@@ -93,68 +108,117 @@ clone_or_update() {
|
|
| 93 |
fi
|
| 94 |
}
|
| 95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
# -----------------------------
|
| 97 |
# Instalação principal
|
| 98 |
# -----------------------------
|
| 99 |
echo ""
|
| 100 |
log_info "========================================="
|
| 101 |
-
log_info " ComfyUI + Wan 2.2 Setup
|
| 102 |
-
log_info " CPU Cores: $CPU_CORES | Jobs: $
|
|
|
|
| 103 |
log_info "========================================="
|
| 104 |
echo ""
|
| 105 |
|
| 106 |
# [1/8] Atualizar pip e instalar ferramentas essenciais
|
| 107 |
log_info "[1/8] Atualizando pip e instalando ferramentas..."
|
| 108 |
python3 -m pip install --quiet --upgrade pip wheel setuptools >/dev/null 2>&1
|
| 109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
log_success "Ferramentas instaladas"
|
| 111 |
|
| 112 |
-
# [2/8] Instalar ComfyUI
|
| 113 |
log_info "[2/8] Instalando ComfyUI (GPU NVIDIA, fast deps)..."
|
| 114 |
|
| 115 |
-
#
|
| 116 |
if [ -f "$COMFY_DIR/main.py" ] && [ -d "$COMFY_DIR/models" ]; then
|
| 117 |
log_warn "ComfyUI já existe em $COMFY_DIR, pulando instalação base"
|
| 118 |
else
|
| 119 |
-
log_info "Instalando ComfyUI em
|
| 120 |
-
|
|
|
|
| 121 |
[ -d "$COMFY_DIR" ] && rm -rf "$COMFY_DIR"
|
| 122 |
|
| 123 |
-
# Instala ComfyUI
|
| 124 |
comfy --skip-prompt install --fast-deps --nvidia
|
| 125 |
|
| 126 |
-
# Verifica se instalou
|
| 127 |
if [ ! -f "$COMFY_DIR/main.py" ]; then
|
| 128 |
-
log_error "
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
fi
|
| 131 |
fi
|
| 132 |
|
| 133 |
-
# Criar estrutura de diretórios
|
| 134 |
MODELS_DIR="$COMFY_DIR/models"
|
| 135 |
-
log_info "Criando estrutura de diretórios..."
|
| 136 |
mkdir -p "$MODELS_DIR"/{diffusion_models,loras,vae,text_encoders,clip_vision,controlnet}
|
| 137 |
mkdir -p "$COMFY_DIR/custom_nodes"
|
| 138 |
mkdir -p "$TMPDL"/{wan22,wan21,controlnet}
|
| 139 |
|
| 140 |
-
log_success "ComfyUI pronto
|
| 141 |
|
| 142 |
# [3/8] Baixar modelos Wan 2.2
|
| 143 |
-
log_info "[3/8] Iniciando
|
| 144 |
(
|
| 145 |
set -Eeuo pipefail
|
| 146 |
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
split_files/diffusion_models/wan2.
|
| 150 |
-
split_files/
|
| 151 |
-
split_files/loras/wan2.
|
| 152 |
-
split_files/
|
| 153 |
-
split_files/
|
| 154 |
-
split_files/text_encoders/umt5_xxl_fp16.safetensors \
|
| 155 |
-
--local-dir "$TMPDL/wan22" \
|
| 156 |
-
--local-dir-use-symlinks False \
|
| 157 |
-
--resume-download
|
| 158 |
|
| 159 |
# Copiar para destino
|
| 160 |
cp -f "$TMPDL/wan22/split_files/diffusion_models/"*.safetensors "$MODELS_DIR/diffusion_models/" 2>/dev/null || true
|
|
@@ -171,12 +235,8 @@ log_info "[4/8] Baixando Wan 2.1 clip vision..."
|
|
| 171 |
(
|
| 172 |
set -Eeuo pipefail
|
| 173 |
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
split_files/clip_vision/clip_vision_h.safetensors \
|
| 177 |
-
--local-dir "$TMPDL/wan21" \
|
| 178 |
-
--local-dir-use-symlinks False \
|
| 179 |
-
--resume-download
|
| 180 |
|
| 181 |
cp -f "$TMPDL/wan21/split_files/clip_vision/"*.safetensors "$MODELS_DIR/clip_vision/" 2>/dev/null || true
|
| 182 |
|
|
@@ -189,11 +249,8 @@ log_info "[5/8] Baixando ControlNet Union..."
|
|
| 189 |
(
|
| 190 |
set -Eeuo pipefail
|
| 191 |
|
| 192 |
-
|
| 193 |
-
diffusion_pytorch_model_promax.safetensors
|
| 194 |
-
--local-dir "$TMPDL/controlnet" \
|
| 195 |
-
--local-dir-use-symlinks False \
|
| 196 |
-
--resume-download
|
| 197 |
|
| 198 |
cp -f "$TMPDL/controlnet/diffusion_pytorch_model_promax.safetensors" \
|
| 199 |
"$MODELS_DIR/controlnet/controlnet-union.safetensors"
|
|
@@ -209,37 +266,73 @@ log_info "[6/8] Baixando modelo do Civitai..."
|
|
| 209 |
|
| 210 |
cd "$MODELS_DIR/loras"
|
| 211 |
|
| 212 |
-
# URL correta
|
| 213 |
CIVITAI_URL="https://civitai.com/api/download/models/2122278?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=${CIVITAI_TOKEN}"
|
| 214 |
|
| 215 |
-
#
|
| 216 |
-
wget --content-disposition \
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
|
|
|
| 223 |
curl -L \
|
| 224 |
--retry 3 \
|
| 225 |
--connect-timeout 30 \
|
| 226 |
--progress-bar \
|
| 227 |
-o "flux_unleashed_v2.safetensors" \
|
| 228 |
"$CIVITAI_URL"
|
| 229 |
-
|
| 230 |
|
| 231 |
log_success " Modelo Civitai baixado"
|
| 232 |
) &
|
| 233 |
CIVITAI_PID=$!
|
| 234 |
|
| 235 |
-
# [7/8]
|
| 236 |
-
log_info "[7/8]
|
| 237 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 238 |
|
| 239 |
-
#
|
| 240 |
-
log_info "
|
|
|
|
| 241 |
|
| 242 |
-
#
|
|
|
|
| 243 |
(
|
| 244 |
set -Eeuo pipefail
|
| 245 |
CN_DIR="$COMFY_DIR/custom_nodes"
|
|
@@ -265,51 +358,19 @@ log_info "[8/8] Instalando custom nodes e SageAttention..."
|
|
| 265 |
["https://github.com/grmchn/ComfyUI-ProportionChanger"]="ComfyUI-ProportionChanger"
|
| 266 |
)
|
| 267 |
|
|
|
|
| 268 |
for url in "${!REPOS[@]}"; do
|
| 269 |
node_name="${REPOS[$url]}"
|
| 270 |
node_path="$CN_DIR/$node_name"
|
| 271 |
-
clone_or_update "$url" "$node_path"
|
| 272 |
done
|
|
|
|
| 273 |
|
| 274 |
log_success " Custom nodes instalados"
|
| 275 |
-
)
|
| 276 |
-
NODES_PID=$!
|
| 277 |
-
|
| 278 |
-
# SageAttention
|
| 279 |
-
(
|
| 280 |
-
set -Eeuo pipefail
|
| 281 |
-
|
| 282 |
-
# Verificar se CUDA está disponível
|
| 283 |
-
if command -v nvcc >/dev/null 2>&1; then
|
| 284 |
-
log_info " CUDA detectado, compilando SageAttention..."
|
| 285 |
-
|
| 286 |
-
python3 -m pip install --quiet "triton>=3.0.0" 2>/dev/null || true
|
| 287 |
-
|
| 288 |
-
# Clonar no diretório temporário primeiro
|
| 289 |
-
SAGE_DIR="$TMPDL/SageAttention"
|
| 290 |
-
if [ ! -d "$SAGE_DIR" ]; then
|
| 291 |
-
git clone --depth 1 https://github.com/thu-ml/SageAttention.git "$SAGE_DIR" --quiet
|
| 292 |
-
fi
|
| 293 |
-
|
| 294 |
-
cd "$SAGE_DIR"
|
| 295 |
-
python3 setup.py install 2>/dev/null || {
|
| 296 |
-
log_warn " SageAttention falhou na compilação, continuando sem ele"
|
| 297 |
-
}
|
| 298 |
-
|
| 299 |
-
# Testar se instalou
|
| 300 |
-
if python3 -c "import sageattention" 2>/dev/null; then
|
| 301 |
-
log_success " SageAttention instalado com sucesso"
|
| 302 |
-
else
|
| 303 |
-
log_warn " SageAttention não foi instalado corretamente"
|
| 304 |
-
fi
|
| 305 |
-
else
|
| 306 |
-
log_warn " CUDA não detectado, pulando SageAttention"
|
| 307 |
-
fi
|
| 308 |
-
) &
|
| 309 |
-
SAGE_PID=$!
|
| 310 |
|
| 311 |
-
# Aguardar
|
| 312 |
-
wait $
|
| 313 |
|
| 314 |
# Verificar instalação
|
| 315 |
log_info "Verificando instalação..."
|
|
@@ -351,14 +412,15 @@ echo ""
|
|
| 351 |
log_info "========================================="
|
| 352 |
if [ $ERROR_COUNT -eq 0 ]; then
|
| 353 |
log_success "Instalação concluída com sucesso!"
|
|
|
|
| 354 |
|
| 355 |
# Verificar se SageAttention está disponível
|
| 356 |
SAGE_FLAG=""
|
| 357 |
if python3 -c "import sageattention" 2>/dev/null; then
|
| 358 |
SAGE_FLAG="--use-sage-attention"
|
| 359 |
-
log_success "SageAttention disponível"
|
| 360 |
else
|
| 361 |
-
log_info "SageAttention não disponível
|
| 362 |
fi
|
| 363 |
|
| 364 |
echo ""
|
|
@@ -372,7 +434,7 @@ if [ $ERROR_COUNT -eq 0 ]; then
|
|
| 372 |
log_info "URL: http://localhost:$COMFY_PORT"
|
| 373 |
echo ""
|
| 374 |
|
| 375 |
-
# Mudar para o diretório do ComfyUI
|
| 376 |
cd "$COMFY_DIR"
|
| 377 |
exec comfy launch -- $SAGE_FLAG --listen "$COMFY_HOST" --port "$COMFY_PORT"
|
| 378 |
else
|
|
|
|
| 1 |
#!/usr/bin/env bash
|
| 2 |
+
# setup_comfyui_wan22_final.sh
|
| 3 |
+
# Script final corrigido para instalação do ComfyUI com Wan 2.2
|
| 4 |
# Requisitos: Linux + Python3 + git + (opcional) NVCC/CUDA para SageAttention
|
| 5 |
|
| 6 |
set -Eeuo pipefail
|
|
|
|
| 23 |
# -----------------------------
|
| 24 |
# Configuráveis
|
| 25 |
# -----------------------------
|
| 26 |
+
# IMPORTANTE: comfy-cli SEMPRE instala em /root/comfy/ComfyUI
|
| 27 |
+
COMFY_DIR="/root/comfy/ComfyUI" # Caminho fixo onde comfy-cli instala
|
| 28 |
COMFY_HOST="${COMFY_HOST:-0.0.0.0}"
|
| 29 |
COMFY_PORT="${COMFY_PORT:-8818}"
|
| 30 |
|
|
|
|
| 38 |
|
| 39 |
# Configurações de performance
|
| 40 |
export HF_HUB_ENABLE_HF_TRANSFER=1
|
| 41 |
+
export HF_TRANSFER_CONCURRENCY=16 # Aumentado para melhor performance
|
|
|
|
|
|
|
| 42 |
|
| 43 |
# Detecção de CPU cores para compilação
|
| 44 |
CPU_CORES=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
|
| 45 |
+
|
| 46 |
+
# Otimização para máquinas com muitos cores (como 112 cores)
|
| 47 |
+
if [ $CPU_CORES -gt 32 ]; then
|
| 48 |
+
# Para máquinas high-end, usar configurações agressivas
|
| 49 |
+
export MAX_JOBS=32 # Limite do CUDA
|
| 50 |
+
export EXT_PARALLEL=16 # Aumentado
|
| 51 |
+
export NVCC_APPEND_FLAGS="--threads 16" # Aumentado
|
| 52 |
+
COMPILE_JOBS=32
|
| 53 |
+
log_info "Detectado sistema high-end: $CPU_CORES cores, usando MAX_JOBS=$MAX_JOBS"
|
| 54 |
+
else
|
| 55 |
+
# Para máquinas normais
|
| 56 |
+
HALF_CORES=$((CPU_CORES / 2))
|
| 57 |
+
export MAX_JOBS=$HALF_CORES
|
| 58 |
+
export EXT_PARALLEL=4
|
| 59 |
+
export NVCC_APPEND_FLAGS="--threads 8"
|
| 60 |
+
COMPILE_JOBS=$HALF_CORES
|
| 61 |
+
fi
|
| 62 |
+
|
| 63 |
+
export UV_SYSTEM_PYTHON=1
|
| 64 |
+
export PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True"
|
| 65 |
|
| 66 |
# -----------------------------
|
| 67 |
# Setup inicial
|
|
|
|
| 108 |
fi
|
| 109 |
}
|
| 110 |
|
| 111 |
+
# Função para download com HF Transfer ou fallback
|
| 112 |
+
hf_download_with_fallback() {
|
| 113 |
+
local repo="$1"
|
| 114 |
+
shift # Remove primeiro argumento
|
| 115 |
+
local files=("$@") # Resto são os arquivos
|
| 116 |
+
local output_dir="$TMPDL/$(basename $repo)"
|
| 117 |
+
|
| 118 |
+
# Tentar primeiro com HF Transfer
|
| 119 |
+
if python3 -c "import hf_transfer" 2>/dev/null; then
|
| 120 |
+
log_info " → Usando HF Transfer (rápido) para $repo..."
|
| 121 |
+
HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download "$repo" \
|
| 122 |
+
"${files[@]}" \
|
| 123 |
+
--local-dir "$output_dir" \
|
| 124 |
+
--local-dir-use-symlinks False \
|
| 125 |
+
--resume-download 2>/dev/null || {
|
| 126 |
+
log_warn " HF Transfer falhou, tentando método padrão..."
|
| 127 |
+
HF_HUB_ENABLE_HF_TRANSFER=0 huggingface-cli download "$repo" \
|
| 128 |
+
"${files[@]}" \
|
| 129 |
+
--local-dir "$output_dir" \
|
| 130 |
+
--local-dir-use-symlinks False \
|
| 131 |
+
--resume-download
|
| 132 |
+
}
|
| 133 |
+
else
|
| 134 |
+
log_info " → Usando download padrão para $repo..."
|
| 135 |
+
huggingface-cli download "$repo" \
|
| 136 |
+
"${files[@]}" \
|
| 137 |
+
--local-dir "$output_dir" \
|
| 138 |
+
--local-dir-use-symlinks False \
|
| 139 |
+
--resume-download
|
| 140 |
+
fi
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
# -----------------------------
|
| 144 |
# Instalação principal
|
| 145 |
# -----------------------------
|
| 146 |
echo ""
|
| 147 |
log_info "========================================="
|
| 148 |
+
log_info " ComfyUI + Wan 2.2 Setup Final"
|
| 149 |
+
log_info " CPU Cores: $CPU_CORES | Compile Jobs: $COMPILE_JOBS"
|
| 150 |
+
log_info " ComfyUI Dir: $COMFY_DIR"
|
| 151 |
log_info "========================================="
|
| 152 |
echo ""
|
| 153 |
|
| 154 |
# [1/8] Atualizar pip e instalar ferramentas essenciais
|
| 155 |
log_info "[1/8] Atualizando pip e instalando ferramentas..."
|
| 156 |
python3 -m pip install --quiet --upgrade pip wheel setuptools >/dev/null 2>&1
|
| 157 |
+
|
| 158 |
+
# Instalar HF Transfer primeiro para downloads mais rápidos
|
| 159 |
+
python3 -m pip install --quiet --upgrade hf_transfer >/dev/null 2>&1 || true
|
| 160 |
+
|
| 161 |
+
# Depois instalar o resto
|
| 162 |
+
python3 -m pip install --quiet --upgrade comfy-cli "huggingface_hub>=0.23.0" aria2 >/dev/null 2>&1
|
| 163 |
log_success "Ferramentas instaladas"
|
| 164 |
|
| 165 |
+
# [2/8] Instalar ComfyUI
|
| 166 |
log_info "[2/8] Instalando ComfyUI (GPU NVIDIA, fast deps)..."
|
| 167 |
|
| 168 |
+
# Verificar se ComfyUI já existe no caminho correto
|
| 169 |
if [ -f "$COMFY_DIR/main.py" ] && [ -d "$COMFY_DIR/models" ]; then
|
| 170 |
log_warn "ComfyUI já existe em $COMFY_DIR, pulando instalação base"
|
| 171 |
else
|
| 172 |
+
log_info "Instalando ComfyUI (será instalado em /root/comfy/ComfyUI)..."
|
| 173 |
+
|
| 174 |
+
# Remove instalação parcial se existir
|
| 175 |
[ -d "$COMFY_DIR" ] && rm -rf "$COMFY_DIR"
|
| 176 |
|
| 177 |
+
# Instala ComfyUI (sempre vai para /root/comfy/ComfyUI)
|
| 178 |
comfy --skip-prompt install --fast-deps --nvidia
|
| 179 |
|
| 180 |
+
# Verifica se instalou no local correto
|
| 181 |
if [ ! -f "$COMFY_DIR/main.py" ]; then
|
| 182 |
+
log_error "ComfyUI não foi encontrado em $COMFY_DIR após instalação!"
|
| 183 |
+
log_info "Verificando outros locais possíveis..."
|
| 184 |
+
|
| 185 |
+
# Tentar encontrar onde foi instalado
|
| 186 |
+
for possible_path in "/root/comfy/ComfyUI" "$HOME/comfy/ComfyUI" "/workspace/ComfyUI"; do
|
| 187 |
+
if [ -f "$possible_path/main.py" ]; then
|
| 188 |
+
log_info "ComfyUI encontrado em: $possible_path"
|
| 189 |
+
COMFY_DIR="$possible_path"
|
| 190 |
+
break
|
| 191 |
+
fi
|
| 192 |
+
done
|
| 193 |
+
|
| 194 |
+
if [ ! -f "$COMFY_DIR/main.py" ]; then
|
| 195 |
+
log_error "Não foi possível encontrar ComfyUI instalado!"
|
| 196 |
+
exit 1
|
| 197 |
+
fi
|
| 198 |
fi
|
| 199 |
fi
|
| 200 |
|
| 201 |
+
# Criar estrutura de diretórios
|
| 202 |
MODELS_DIR="$COMFY_DIR/models"
|
| 203 |
+
log_info "Criando estrutura de diretórios em $MODELS_DIR..."
|
| 204 |
mkdir -p "$MODELS_DIR"/{diffusion_models,loras,vae,text_encoders,clip_vision,controlnet}
|
| 205 |
mkdir -p "$COMFY_DIR/custom_nodes"
|
| 206 |
mkdir -p "$TMPDL"/{wan22,wan21,controlnet}
|
| 207 |
|
| 208 |
+
log_success "ComfyUI pronto em: $COMFY_DIR"
|
| 209 |
|
| 210 |
# [3/8] Baixar modelos Wan 2.2
|
| 211 |
+
log_info "[3/8] Iniciando download dos modelos Wan 2.2..."
|
| 212 |
(
|
| 213 |
set -Eeuo pipefail
|
| 214 |
|
| 215 |
+
hf_download_with_fallback "$REPO_22" \
|
| 216 |
+
"split_files/diffusion_models/wan2.2_fun_control_low_noise_14B_fp8_scaled.safetensors" \
|
| 217 |
+
"split_files/diffusion_models/wan2.2_fun_control_high_noise_14B_fp8_scaled.safetensors" \
|
| 218 |
+
"split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors" \
|
| 219 |
+
"split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors" \
|
| 220 |
+
"split_files/vae/wan_2.1_vae.safetensors" \
|
| 221 |
+
"split_files/text_encoders/umt5_xxl_fp16.safetensors"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
|
| 223 |
# Copiar para destino
|
| 224 |
cp -f "$TMPDL/wan22/split_files/diffusion_models/"*.safetensors "$MODELS_DIR/diffusion_models/" 2>/dev/null || true
|
|
|
|
| 235 |
(
|
| 236 |
set -Eeuo pipefail
|
| 237 |
|
| 238 |
+
hf_download_with_fallback "$REPO_21" \
|
| 239 |
+
"split_files/clip_vision/clip_vision_h.safetensors"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 240 |
|
| 241 |
cp -f "$TMPDL/wan21/split_files/clip_vision/"*.safetensors "$MODELS_DIR/clip_vision/" 2>/dev/null || true
|
| 242 |
|
|
|
|
| 249 |
(
|
| 250 |
set -Eeuo pipefail
|
| 251 |
|
| 252 |
+
hf_download_with_fallback "$REPO_CN" \
|
| 253 |
+
"diffusion_pytorch_model_promax.safetensors"
|
|
|
|
|
|
|
|
|
|
| 254 |
|
| 255 |
cp -f "$TMPDL/controlnet/diffusion_pytorch_model_promax.safetensors" \
|
| 256 |
"$MODELS_DIR/controlnet/controlnet-union.safetensors"
|
|
|
|
| 266 |
|
| 267 |
cd "$MODELS_DIR/loras"
|
| 268 |
|
| 269 |
+
# URL correta completa
|
| 270 |
CIVITAI_URL="https://civitai.com/api/download/models/2122278?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=${CIVITAI_TOKEN}"
|
| 271 |
|
| 272 |
+
# Tentar com wget primeiro (melhor para nomes de arquivo)
|
| 273 |
+
if ! wget --content-disposition \
|
| 274 |
+
--tries=3 \
|
| 275 |
+
--timeout=60 \
|
| 276 |
+
--continue \
|
| 277 |
+
--progress=bar:force:noscroll \
|
| 278 |
+
"$CIVITAI_URL" 2>&1 | grep --line-buffered "%" | sed -u -e "s/^/ /"; then
|
| 279 |
+
|
| 280 |
+
log_warn " Wget falhou, tentando com curl..."
|
| 281 |
curl -L \
|
| 282 |
--retry 3 \
|
| 283 |
--connect-timeout 30 \
|
| 284 |
--progress-bar \
|
| 285 |
-o "flux_unleashed_v2.safetensors" \
|
| 286 |
"$CIVITAI_URL"
|
| 287 |
+
fi
|
| 288 |
|
| 289 |
log_success " Modelo Civitai baixado"
|
| 290 |
) &
|
| 291 |
CIVITAI_PID=$!
|
| 292 |
|
| 293 |
+
# [7/8] Instalar SageAttention (em paralelo com downloads)
|
| 294 |
+
log_info "[7/8] Preparando SageAttention (paralelo com downloads)..."
|
| 295 |
+
(
|
| 296 |
+
set -Eeuo pipefail
|
| 297 |
+
|
| 298 |
+
# Verificar se CUDA está disponível
|
| 299 |
+
if command -v nvcc >/dev/null 2>&1; then
|
| 300 |
+
log_info " CUDA detectado, instalando triton e preparando SageAttention..."
|
| 301 |
+
log_info " Usando configuração otimizada: MAX_JOBS=$MAX_JOBS, EXT_PARALLEL=$EXT_PARALLEL"
|
| 302 |
+
|
| 303 |
+
# Instalar triton primeiro
|
| 304 |
+
python3 -m pip install --quiet "triton>=3.0.0" 2>/dev/null || true
|
| 305 |
+
|
| 306 |
+
# Clonar SageAttention
|
| 307 |
+
SAGE_DIR="$TMPDL/SageAttention"
|
| 308 |
+
if [ ! -d "$SAGE_DIR" ]; then
|
| 309 |
+
git clone --depth 1 https://github.com/thu-ml/SageAttention.git "$SAGE_DIR" --quiet
|
| 310 |
+
fi
|
| 311 |
+
|
| 312 |
+
cd "$SAGE_DIR"
|
| 313 |
+
|
| 314 |
+
# Compilar com configurações otimizadas para muitos cores
|
| 315 |
+
log_info " Compilando SageAttention com $MAX_JOBS jobs paralelos..."
|
| 316 |
+
python3 setup.py install 2>&1 | grep -E "(Building|Compiling|Installing)" || true
|
| 317 |
+
|
| 318 |
+
# Testar se instalou
|
| 319 |
+
if python3 -c "import sageattention" 2>/dev/null; then
|
| 320 |
+
log_success " SageAttention instalado com sucesso"
|
| 321 |
+
else
|
| 322 |
+
log_warn " SageAttention não foi instalado corretamente"
|
| 323 |
+
fi
|
| 324 |
+
else
|
| 325 |
+
log_warn " CUDA não detectado, pulando SageAttention"
|
| 326 |
+
fi
|
| 327 |
+
) &
|
| 328 |
+
SAGE_PID=$!
|
| 329 |
|
| 330 |
+
# Aguardar downloads principais
|
| 331 |
+
log_info "Aguardando downloads principais (em paralelo com SageAttention)..."
|
| 332 |
+
wait $WAN22_PID $WAN21_PID $CN_PID $CIVITAI_PID
|
| 333 |
|
| 334 |
+
# [8/8] Instalar custom nodes (após downloads, mas ainda em paralelo com SageAttention)
|
| 335 |
+
log_info "[8/8] Instalando custom nodes..."
|
| 336 |
(
|
| 337 |
set -Eeuo pipefail
|
| 338 |
CN_DIR="$COMFY_DIR/custom_nodes"
|
|
|
|
| 358 |
["https://github.com/grmchn/ComfyUI-ProportionChanger"]="ComfyUI-ProportionChanger"
|
| 359 |
)
|
| 360 |
|
| 361 |
+
# Clonar todos em paralelo
|
| 362 |
for url in "${!REPOS[@]}"; do
|
| 363 |
node_name="${REPOS[$url]}"
|
| 364 |
node_path="$CN_DIR/$node_name"
|
| 365 |
+
clone_or_update "$url" "$node_path" &
|
| 366 |
done
|
| 367 |
+
wait
|
| 368 |
|
| 369 |
log_success " Custom nodes instalados"
|
| 370 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
|
| 372 |
+
# Aguardar SageAttention terminar
|
| 373 |
+
wait $SAGE_PID
|
| 374 |
|
| 375 |
# Verificar instalação
|
| 376 |
log_info "Verificando instalação..."
|
|
|
|
| 412 |
log_info "========================================="
|
| 413 |
if [ $ERROR_COUNT -eq 0 ]; then
|
| 414 |
log_success "Instalação concluída com sucesso!"
|
| 415 |
+
log_info "ComfyUI instalado em: $COMFY_DIR"
|
| 416 |
|
| 417 |
# Verificar se SageAttention está disponível
|
| 418 |
SAGE_FLAG=""
|
| 419 |
if python3 -c "import sageattention" 2>/dev/null; then
|
| 420 |
SAGE_FLAG="--use-sage-attention"
|
| 421 |
+
log_success "SageAttention disponível (compilado com $MAX_JOBS jobs)"
|
| 422 |
else
|
| 423 |
+
log_info "SageAttention não disponível"
|
| 424 |
fi
|
| 425 |
|
| 426 |
echo ""
|
|
|
|
| 434 |
log_info "URL: http://localhost:$COMFY_PORT"
|
| 435 |
echo ""
|
| 436 |
|
| 437 |
+
# Mudar para o diretório do ComfyUI e executar
|
| 438 |
cd "$COMFY_DIR"
|
| 439 |
exec comfy launch -- $SAGE_FLAG --listen "$COMFY_HOST" --port "$COMFY_PORT"
|
| 440 |
else
|