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

Upload comfywan_optimized3.sh

Browse files
Files changed (1) hide show
  1. comfywan_optimized3.sh +435 -0
comfywan_optimized3.sh ADDED
@@ -0,0 +1,435 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 paralelo..."
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
+ local pids=()
299
+
300
+ # --- Lista de Modelos ---
301
+ local models=(
302
+ "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-Anisora-I2V-480P-14B_fp16.safetensors:$WORKSPACE_DIR/models/diffusion_models"
303
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors:$WORKSPACE_DIR/models/vae"
304
+ "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"
305
+ "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"
306
+ "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"
307
+ "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"
308
+ "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan2_1-Anisora-I2V-480P-14B_fp8_e4m3fn.safetensors:$WORKSPACE_DIR/models/diffusion_models"
309
+ )
310
+
311
+ # --- Inicia os Downloads em Background ---
312
+ for model_info in "${models[@]}"; do
313
+ IFS=':' read -r url dest_dir <<< "$model_info"
314
+ (
315
+ download_file "$url" "$dest_dir"
316
+ ) &
317
+ pids+=($!)
318
+ done
319
+
320
+ log_info "Downloads de modelos iniciados em paralelo. PIDs: ${pids[*]}"
321
+
322
+ # --- Aguarda a Conclusão ---
323
+ local has_errors=0
324
+ log_info "Aguardando conclusão dos downloads de modelos..."
325
+ for pid in "${pids[@]}"; do
326
+ if ! wait "$pid"; then
327
+ log_warning "Download em background (PID: $pid) falhou."
328
+ has_errors=1
329
+ fi
330
+ done
331
+
332
+ if [ "$has_errors" -eq 1 ]; then
333
+ log_warning "Alguns downloads de modelos falharam. Verifique os logs."
334
+ else
335
+ log_info "Todos os downloads de modelos foram concluídos com sucesso."
336
+ fi
337
+
338
+ return "$has_errors"
339
+ }
340
+
341
+ # ============================================================================
342
+ # AGUARDAR SAGEATTENTION
343
+ # ============================================================================
344
+
345
+ wait_for_sageattention() {
346
+ log_info "Verificando instalação do SageAttention..."
347
+
348
+ # Aguarda até que o arquivo de flag seja criado
349
+ while [ ! -f "$INSTALL_BASE_DIR/.sageattention_ready" ]; do
350
+ log_info "SageAttention ainda instalando... aguardando 30 segundos"
351
+ sleep 30
352
+ done
353
+
354
+ # Remove o arquivo de flag
355
+ rm -f "$INSTALL_BASE_DIR/.sageattention_ready"
356
+
357
+ log_info "SageAttention está pronto!"
358
+ }
359
+
360
+ # ============================================================================
361
+ # INICIAR O COMFYUI
362
+ # ============================================================================
363
+
364
+ launch_comfyui() {
365
+ log_info "Iniciando ComfyUI na porta 8818 com SageAttention e preview latent2rgb..."
366
+ log_info "Workspace do ComfyUI: $WORKSPACE_DIR"
367
+ log_info "Arquivo de workflow disponível em: $WORKFLOW_FILE"
368
+ log_info "Para usar o workflow, arraste e solte o arquivo '$WORKFLOW_FILENAME' na interface do ComfyUI."
369
+ log_info "Acesse o ComfyUI em: http://127.0.0.1:8818 (ou o IP da sua máquina)"
370
+
371
+ # Inicia o ComfyUI com SageAttention e preview latent2rgb
372
+ exec comfy --workspace "$WORKSPACE_DIR" launch -- --fast --listen 0.0.0.0 --port 8818 --use-sage-attention --preview-method latent2rgb
373
+ }
374
+
375
+ # ============================================================================
376
+ # EXECUÇÃO PRINCIPAL
377
+ # ============================================================================
378
+
379
+ main() {
380
+
381
+ # Passo 8: OTIMIZAÇÃO - Iniciar SageAttention PRIMEIRO (processo mais longo)
382
+ log_info "================================================="
383
+ log_info "Iniciando SageAttention em background (processo mais longo - ~5+ minutos)..."
384
+ log_info "Enquanto isso, continuaremos com as outras instalações..."
385
+ log_info "================================================="
386
+ install_sageattention
387
+
388
+
389
+ log_info "Iniciando instalação dinâmica do ComfyUI..."
390
+ log_info "Diretório de instalação base: $INSTALL_BASE_DIR"
391
+ log_info "================================================="
392
+
393
+ # Passo 1: Limpar instalações existentes no diretório alvo
394
+ cleanup_existing_installation
395
+
396
+ # Passo 2: Instalar comfy-cli
397
+ install_comfy_cli
398
+
399
+ # Passo 3: Instalar HuggingFace tools
400
+ install_hf_tools
401
+
402
+ # Passo 4: Instalar ComfyUI
403
+ install_comfyui
404
+
405
+ # Passo 5: Baixar o workflow
406
+ download_workflow
407
+
408
+ # Passo 6: Instalar custom nodes e dependências do workflow
409
+ install_custom_nodes_and_deps
410
+
411
+ # Passo 7: Iniciar downloads de modelos (processo longo)
412
+ log_info "================================================="
413
+ log_info "Iniciando downloads de modelos..."
414
+ log_info "================================================="
415
+ download_models
416
+
417
+ # Passo 8: Aguardar SageAttention (que provavelmente ainda estará rodando)
418
+ wait_for_sageattention
419
+
420
+ # Passo 9: Iniciar o ComfyUI
421
+ log_info "================================================="
422
+ log_info "Instalação concluída com sucesso!"
423
+ log_info "================================================="
424
+ launch_comfyui
425
+ }
426
+
427
+ # ============================================================================
428
+ # EXECUÇÃO DO SCRIPT
429
+ # ============================================================================
430
+
431
+ # Captura interrupções (Ctrl+C)
432
+ trap 'log_error "Script interrompido pelo usuário."; kill $(jobs -p) 2>/dev/null; exit 1' INT TERM
433
+
434
+ # Executa a função principal
435
+ main "$@"