adbrasi commited on
Commit
a65ad2a
·
verified ·
1 Parent(s): 5c54e17

Upload comfywan_optimized4.sh

Browse files
Files changed (1) hide show
  1. comfywan_optimized4.sh +436 -0
comfywan_optimized4.sh ADDED
@@ -0,0 +1,436 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # ============================================================================
4
+ # Instalador Dinâmico para ComfyUI
5
+ # Instala o ComfyUI e suas dependências no diretório atual.
6
+ # ============================================================================
7
+
8
+ set -e
9
+ set -o pipefail
10
+
11
+ # ============================================================================
12
+ # CONFIGURAÇÕES GLOBAIS
13
+ # ============================================================================
14
+
15
+ # URL do workflow a ser baixado
16
+ readonly WORKFLOW_URL="https://huggingface.co/adbrasi/akarris_trainer/resolve/main/Wan_GenerationBase.json"
17
+
18
+ # --- Caminhos Dinâmicos ---
19
+ # Define o diretório de instalação como o diretório atual onde o script é executado
20
+ readonly INSTALL_BASE_DIR="$(pwd)"
21
+ # O ComfyUI será instalado em uma subpasta "ComfyUI"
22
+ readonly WORKSPACE_DIR="$INSTALL_BASE_DIR/ComfyUI"
23
+ # O arquivo de workflow será salvo na raiz do diretório de instalação
24
+ readonly WORKFLOW_FILENAME="workflow.json"
25
+ readonly WORKFLOW_FILE="$INSTALL_BASE_DIR/$WORKFLOW_FILENAME"
26
+
27
+ # ============================================================================
28
+ # FUNÇÕES DE UTILIDADE
29
+ # ============================================================================
30
+
31
+ log_info() {
32
+ echo "INFO: $1" >&2
33
+ }
34
+
35
+ log_warning() {
36
+ echo "WARNING: $1" >&2
37
+ }
38
+
39
+ log_error() {
40
+ echo "ERROR: $1" >&2
41
+ }
42
+
43
+ command_exists() {
44
+ command -v "$1" >/dev/null 2>&1
45
+ }
46
+
47
+ # ============================================================================
48
+ # FUNÇÃO DE LIMPEZA
49
+ # ============================================================================
50
+
51
+ cleanup_existing_installation() {
52
+ log_info "Verificando instalações existentes em: $WORKSPACE_DIR"
53
+
54
+ if [ -d "$WORKSPACE_DIR" ]; then
55
+ log_warning "Diretório existente encontrado: $WORKSPACE_DIR"
56
+ log_info "Removendo a instalação existente para evitar conflitos..."
57
+ rm -rf "$WORKSPACE_DIR"
58
+ log_info "Diretório removido."
59
+ else
60
+ log_info "Nenhuma instalação anterior encontrada no local. Continuando..."
61
+ fi
62
+ }
63
+
64
+ # ============================================================================
65
+ # INSTALAÇÃO DO COMFY-CLI
66
+ # ============================================================================
67
+
68
+ install_comfy_cli() {
69
+ log_info "Instalando/atualizando comfy-cli..."
70
+
71
+ python3 -m pip install --upgrade comfy-cli || {
72
+ log_error "Falha ao instalar comfy-cli"
73
+ exit 1
74
+ }
75
+
76
+ # Verifica se o 'comfy' está no PATH
77
+ if ! command_exists comfy; then
78
+ if [ -d "$HOME/.local/bin" ] && [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
79
+ export PATH="$HOME/.local/bin:$PATH"
80
+ log_info "Adicionado $HOME/.local/bin ao PATH para esta sessão."
81
+ fi
82
+
83
+ if ! command_exists comfy; then
84
+ log_error "Comando 'comfy' não encontrado no PATH após a instalação."
85
+ log_error "Verifique se '$HOME/.local/bin' está em seu PATH."
86
+ exit 1
87
+ fi
88
+ fi
89
+
90
+ log_info "comfy-cli version: $(comfy --version 2>/dev/null || echo 'desconhecida')"
91
+ }
92
+
93
+ # ============================================================================
94
+ # INSTALAÇÃO DO COMFYUI
95
+ # ============================================================================
96
+
97
+ install_comfyui() {
98
+ log_info "Instalando ComfyUI em: $WORKSPACE_DIR"
99
+
100
+ # Instala ComfyUI com dependências rápidas
101
+ comfy --workspace "$WORKSPACE_DIR" --skip-prompt install --nvidia || {
102
+ log_error "Falha ao instalar ComfyUI"
103
+ exit 1
104
+ }
105
+
106
+ log_info "ComfyUI instalado com sucesso."
107
+ }
108
+
109
+ # ============================================================================
110
+ # INSTALAÇÃO DO HUGGINGFACE HUB E HF_TRANSFER
111
+ # ============================================================================
112
+
113
+ install_hf_tools() {
114
+ log_info "Instalando HuggingFace Hub CLI e hf_transfer..."
115
+
116
+ python3 -m pip install -U "huggingface_hub[cli]" || {
117
+ log_error "Falha ao instalar huggingface_hub[cli]"
118
+ exit 1
119
+ }
120
+
121
+ python3 -m pip install hf_transfer || {
122
+ log_error "Falha ao instalar hf_transfer"
123
+ exit 1
124
+ }
125
+
126
+ log_info "HuggingFace tools instalados com sucesso."
127
+ }
128
+
129
+ # ============================================================================
130
+ # FUNÇÃO DE DOWNLOAD DE ARQUIVO
131
+ # ============================================================================
132
+
133
+ download_file() {
134
+ local url="$1"
135
+ local dest_dir="$2"
136
+ local filename="${3:-}" # Opcional: nome do arquivo de saída
137
+
138
+ log_info "Baixando: $url -> $dest_dir"
139
+
140
+ # Garante que o diretório de destino exista
141
+ mkdir -p "$dest_dir"
142
+
143
+ local output_opts=()
144
+ local curl_opts=()
145
+ if [ -n "$filename" ]; then
146
+ output_opts=("-O" "$filename")
147
+ curl_opts=("-o" "$filename")
148
+ else
149
+ # Usa --content-disposition para obter o nome do arquivo do cabeçalho
150
+ output_opts=("--content-disposition")
151
+ curl_opts=("-O" "-J")
152
+ fi
153
+
154
+ if command_exists aria2c; then
155
+ # aria2c lida com o nome do arquivo automaticamente com -o
156
+ local aria_output_opt=()
157
+ if [ -n "$filename" ]; then
158
+ aria_output_opt=("-o" "$filename")
159
+ fi
160
+ aria2c -x 16 -s 16 -k 1M --dir="$dest_dir" "${aria_output_opt[@]}" "$url" || {
161
+ log_warning "aria2c falhou, tentando com wget..."
162
+ if command_exists wget; then
163
+ wget -P "$dest_dir" "${output_opts[@]}" "$url" || {
164
+ log_warning "wget falhou, tentando com curl..."
165
+ (cd "$dest_dir" && curl -L "${curl_opts[@]}" "$url") || {
166
+ log_error "Falha ao baixar $url com todas as ferramentas."
167
+ return 1
168
+ }
169
+ }
170
+ else
171
+ (cd "$dest_dir" && curl -L "${curl_opts[@]}" "$url") || {
172
+ log_error "Falha ao baixar $url com curl."
173
+ return 1
174
+ }
175
+ fi
176
+ }
177
+ elif command_exists wget; then
178
+ wget -P "$dest_dir" "${output_opts[@]}" "$url" || {
179
+ log_warning "wget falhou, tentando com curl..."
180
+ (cd "$dest_dir" && curl -L "${curl_opts[@]}" "$url") || {
181
+ log_error "Falha ao baixar $url com curl."
182
+ return 1
183
+ }
184
+ }
185
+ elif command_exists curl; then
186
+ (cd "$dest_dir" && curl -L "${curl_opts[@]}" "$url") || {
187
+ log_error "Falha ao baixar $url com curl."
188
+ return 1
189
+ }
190
+ else
191
+ log_error "Nenhuma ferramenta de download (aria2c, wget, curl) encontrada."
192
+ return 1
193
+ fi
194
+
195
+ log_info "Download concluído: $url"
196
+ return 0
197
+ }
198
+
199
+ # ============================================================================
200
+ # DOWNLOAD DO WORKFLOW
201
+ # ============================================================================
202
+
203
+ download_workflow() {
204
+ log_info "Baixando o workflow de: $WORKFLOW_URL"
205
+ download_file "$WORKFLOW_URL" "$INSTALL_BASE_DIR" "$WORKFLOW_FILENAME" || {
206
+ log_error "Falha ao baixar o arquivo do workflow."
207
+ exit 1
208
+ }
209
+
210
+ if [ ! -f "$WORKFLOW_FILE" ]; then
211
+ log_error "O arquivo do workflow não foi baixado com sucesso."
212
+ exit 1
213
+ fi
214
+
215
+ log_info "Workflow baixado com sucesso."
216
+ }
217
+
218
+ # ============================================================================
219
+ # DEPENDÊNCIAS DO WORKFLOW E CUSTOM NODES
220
+ # ============================================================================
221
+
222
+ install_custom_nodes_and_deps() {
223
+ log_info "Instalando custom nodes e dependências..."
224
+
225
+ # Instala dependências do workflow primeiro
226
+ if [ -f "$WORKFLOW_FILE" ]; then
227
+ log_info "Instalando dependências do workflow..."
228
+ comfy --workspace "$WORKSPACE_DIR" node install-deps --workflow="$WORKFLOW_FILE" || {
229
+ log_warning "Algumas dependências do workflow podem ter falhado ao instalar."
230
+ }
231
+ else
232
+ log_warning "Arquivo de workflow não encontrado para instalar dependências."
233
+ fi
234
+
235
+ # Lista de custom nodes para instalar
236
+ local custom_nodes=(
237
+ "https://github.com/LAOGOU-666/Comfyui-Memory_Cleanup"
238
+ "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes"
239
+ "https://github.com/kijai/ComfyUI-KJNodes"
240
+ "https://github.com/kijai/ComfyUI-WanVideoWrapper.git"
241
+ )
242
+
243
+ for node_url in "${custom_nodes[@]}"; do
244
+ log_info "Instalando custom node: $node_url"
245
+ comfy --workspace "$WORKSPACE_DIR" node install "$node_url" || {
246
+ log_warning "Falha ao instalar custom node: $node_url"
247
+ }
248
+ done
249
+
250
+ log_info "Instalação de custom nodes e dependências concluída."
251
+ }
252
+
253
+ # ============================================================================
254
+ # INSTALAÇÃO DO SAGEATTENTION (OTIMIZADO PARA EXECUTAR PRIMEIRO EM BACKGROUND)
255
+ # ============================================================================
256
+
257
+ install_sageattention() {
258
+ log_info "Iniciando instalação do SageAttention em background (otimizado)..."
259
+
260
+ (
261
+ log_info "Clonando repositório SageAttention..."
262
+ if [ -d "SageAttention" ]; then
263
+ rm -rf SageAttention
264
+ fi
265
+
266
+ git clone https://github.com/thu-ml/SageAttention.git
267
+ cd SageAttention
268
+
269
+ log_info "Instalando SageAttention (isso pode demorar 5+ minutos)..."
270
+ python3 setup.py install
271
+
272
+ log_info "SageAttention instalado com sucesso!"
273
+
274
+ # Criar arquivo de flag para indicar que a instalação terminou
275
+ touch "$INSTALL_BASE_DIR/.sageattention_ready"
276
+
277
+ ) &
278
+
279
+ local sage_pid=$!
280
+ log_info "Instalação do SageAttention iniciada em background. PID: $sage_pid"
281
+
282
+ return 0
283
+ }
284
+
285
+ # ============================================================================
286
+ # DOWNLOAD DE MODELOS
287
+ # ============================================================================
288
+
289
+ download_models() {
290
+ log_info "Iniciando downloads de modelos em background..."
291
+
292
+ # --- Criação de Diretórios ---
293
+ mkdir -p "$WORKSPACE_DIR/models/diffusion_models"
294
+ mkdir -p "$WORKSPACE_DIR/models/clip_vision"
295
+ mkdir -p "$WORKSPACE_DIR/models/vae"
296
+ mkdir -p "$WORKSPACE_DIR/models/text_encoders"
297
+
298
+ # --- Lista de Modelos ---
299
+ local models=(
300
+ "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-Anisora-I2V-480P-14B_fp16.safetensors:$WORKSPACE_DIR/models/diffusion_models"
301
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors:$WORKSPACE_DIR/models/vae"
302
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors:$WORKSPACE_DIR/models/text_encoders"
303
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors:$WORKSPACE_DIR/models/text_encoders"
304
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/clip_vision/clip_vision_h.safetensors:$WORKSPACE_DIR/models/clip_vision"
305
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/diffusion_models/wan2.1_i2v_480p_14B_fp8_e4m3fn.safetensors:$WORKSPACE_DIR/models/diffusion_models"
306
+ "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-Anisora-I2V-480P-14B_fp8_e4m3fn.safetensors:$WORKSPACE_DIR/models/diffusion_models"
307
+ )
308
+
309
+ # --- Inicia os Downloads em Background ---
310
+ for model_info in "${models[@]}"; do
311
+ IFS=':' read -r url dest_dir <<< "$model_info"
312
+ (
313
+ download_file "$url" "$dest_dir"
314
+ ) &
315
+ done
316
+
317
+ log_info "Downloads de modelos iniciados em background."
318
+ return 0
319
+ }
320
+
321
+ # ============================================================================
322
+ # AGUARDAR PROCESSOS EM BACKGROUND
323
+ # ============================================================================
324
+
325
+ wait_for_background_tasks() {
326
+ log_info "Aguardando a conclusão de todos os processos em background (SageAttention e downloads)..."
327
+
328
+ local pids
329
+ pids=$(jobs -p)
330
+
331
+ if [ -z "$pids" ]; then
332
+ log_info "Nenhum processo em background para aguardar."
333
+ # Verifica o flag do SageAttention como fallback
334
+ if [ -f "$INSTALL_BASE_DIR/.sageattention_ready" ]; then
335
+ rm -f "$INSTALL_BASE_DIR/.sageattention_ready"
336
+ log_info "SageAttention já estava pronto."
337
+ fi
338
+ return 0
339
+ fi
340
+
341
+ log_info "Processos em background para aguardar: $pids"
342
+
343
+ local has_errors=0
344
+ for job in $pids; do
345
+ if ! wait "$job"; then
346
+ log_warning "Processo em background (PID: $job) falhou."
347
+ has_errors=1
348
+ fi
349
+ done
350
+
351
+ # Remove o arquivo de flag do SageAttention se existir
352
+ if [ -f "$INSTALL_BASE_DIR/.sageattention_ready" ]; then
353
+ rm -f "$INSTALL_BASE_DIR/.sageattention_ready"
354
+ fi
355
+
356
+ if [ "$has_errors" -eq 1 ]; then
357
+ log_warning "Alguns processos em background falharam. Verifique os logs."
358
+ else
359
+ log_info "Todos os processos em background foram concluídos com sucesso."
360
+ fi
361
+
362
+ return "$has_errors"
363
+ }
364
+
365
+ # ============================================================================
366
+ # INICIAR O COMFYUI
367
+ # ============================================================================
368
+
369
+ launch_comfyui() {
370
+ log_info "Iniciando ComfyUI na porta 8818 com SageAttention e preview latent2rgb..."
371
+ log_info "Workspace do ComfyUI: $WORKSPACE_DIR"
372
+ log_info "Arquivo de workflow disponível em: $WORKFLOW_FILE"
373
+ log_info "Para usar o workflow, arraste e solte o arquivo '$WORKFLOW_FILENAME' na interface do ComfyUI."
374
+ log_info "Acesse o ComfyUI em: http://127.0.0.1:8818 (ou o IP da sua máquina)"
375
+
376
+ # Inicia o ComfyUI com SageAttention e preview latent2rgb
377
+ exec comfy --workspace "$WORKSPACE_DIR" launch -- --fast --listen 0.0.0.0 --port 8818 --use-sage-attention --preview-method latent2rgb
378
+ }
379
+
380
+ # ============================================================================
381
+ # EXECUÇÃO PRINCIPAL
382
+ # ============================================================================
383
+
384
+ main() {
385
+ # Passo 1: OTIMIZAÇÃO - Iniciar SageAttention PRIMEIRO (processo mais longo)
386
+ log_info "================================================="
387
+ log_info "Iniciando SageAttention em background (processo mais longo)..."
388
+ log_info "================================================="
389
+ install_sageattention
390
+
391
+ log_info "Iniciando instalação principal enquanto SageAttention instala..."
392
+ log_info "================================================="
393
+
394
+ # Passo 2: Limpar instalações existentes
395
+ cleanup_existing_installation
396
+
397
+ # Passo 3: Instalar comfy-cli
398
+ install_comfy_cli
399
+
400
+ # Passo 4: Instalar HuggingFace tools
401
+ install_hf_tools
402
+
403
+ # Passo 5: Instalar ComfyUI
404
+ install_comfyui
405
+
406
+ # Passo 6: OTIMIZAÇÃO - Iniciar downloads de modelos em background
407
+ log_info "================================================="
408
+ log_info "Iniciando downloads de modelos em background..."
409
+ log_info "================================================="
410
+ download_models
411
+
412
+ # Passo 7: Baixar o workflow
413
+ download_workflow
414
+
415
+ # Passo 8: Instalar custom nodes e dependências
416
+ install_custom_nodes_and_deps
417
+
418
+ # Passo 9: Aguardar a conclusão de TODAS as tarefas em background
419
+ wait_for_background_tasks
420
+
421
+ # Passo 10: Iniciar o ComfyUI
422
+ log_info "================================================="
423
+ log_info "Instalação concluída com sucesso!"
424
+ log_info "================================================="
425
+ launch_comfyui
426
+ }
427
+
428
+ # ============================================================================
429
+ # EXECUÇÃO DO SCRIPT
430
+ # ============================================================================
431
+
432
+ # Captura interrupções (Ctrl+C)
433
+ trap 'log_error "Script interrompido pelo usuário."; kill $(jobs -p) 2>/dev/null; exit 1' INT TERM
434
+
435
+ # Executa a função principal
436
+ main "$@"