Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -9,17 +9,15 @@ from huggingface_hub import hf_hub_download
|
|
9 |
import spaces
|
10 |
from typing import Union, Sequence, Mapping, Any
|
11 |
import logging
|
12 |
-
|
13 |
-
# Adicione se ainda não tiver
|
14 |
from nodes import NODE_CLASS_MAPPINGS, init_extra_nodes, SaveImage # <-- Node SaveImage
|
15 |
from comfy import model_management
|
16 |
import folder_paths
|
17 |
|
18 |
-
# Configurar logging para debug
|
19 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
20 |
logger = logging.getLogger(__name__)
|
21 |
|
22 |
-
#
|
23 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
24 |
sys.path.append(current_dir)
|
25 |
|
@@ -31,7 +29,7 @@ os.makedirs(output_dir, exist_ok=True)
|
|
31 |
os.makedirs(models_dir, exist_ok=True)
|
32 |
folder_paths.set_output_directory(output_dir)
|
33 |
|
34 |
-
# Configurar caminhos dos modelos e verificar estrutura
|
35 |
MODEL_FOLDERS = ["style_models", "text_encoders", "vae", "unet", "clip_vision"]
|
36 |
for model_folder in MODEL_FOLDERS:
|
37 |
folder_path = os.path.join(models_dir, model_folder)
|
@@ -39,7 +37,7 @@ for model_folder in MODEL_FOLDERS:
|
|
39 |
folder_paths.add_model_folder_path(model_folder, folder_path)
|
40 |
logger.info(f"Pasta de modelo configurada: {model_folder}")
|
41 |
|
42 |
-
#
|
43 |
logger.info(f"Python version: {sys.version}")
|
44 |
logger.info(f"Torch version: {torch.__version__}")
|
45 |
logger.info(f"CUDA disponível: {torch.cuda.is_available()}")
|
@@ -47,7 +45,7 @@ logger.info(f"Quantidade de GPUs: {torch.cuda.device_count()}")
|
|
47 |
if torch.cuda.is_available():
|
48 |
logger.info(f"GPU atual: {torch.cuda.get_device_name(0)}")
|
49 |
|
50 |
-
#
|
51 |
logger.info("Inicializando ComfyUI...")
|
52 |
try:
|
53 |
init_extra_nodes()
|
@@ -55,7 +53,7 @@ except Exception as e:
|
|
55 |
logger.warning(f"Aviso na inicialização de nós extras: {str(e)}")
|
56 |
logger.info("Continuando mesmo com avisos nos nós extras...")
|
57 |
|
58 |
-
#
|
59 |
def get_value_at_index(obj: Union[Sequence, Mapping], index: int) -> Any:
|
60 |
try:
|
61 |
return obj[index]
|
@@ -69,7 +67,7 @@ def verify_file_exists(folder: str, filename: str) -> bool:
|
|
69 |
logger.error(f"Arquivo não encontrado: {file_path}")
|
70 |
return exists
|
71 |
|
72 |
-
#
|
73 |
logger.info("Baixando modelos necessários...")
|
74 |
try:
|
75 |
hf_hub_download(
|
@@ -106,7 +104,7 @@ except Exception as e:
|
|
106 |
logger.error(f"Erro ao baixar modelos: {str(e)}")
|
107 |
raise
|
108 |
|
109 |
-
#
|
110 |
logger.info("Inicializando modelos...")
|
111 |
try:
|
112 |
with torch.no_grad():
|
@@ -169,7 +167,7 @@ except Exception as e:
|
|
169 |
logger.error(f"Erro ao inicializar modelos: {str(e)}")
|
170 |
raise
|
171 |
|
172 |
-
#
|
173 |
@spaces.GPU
|
174 |
def generate_image(
|
175 |
prompt, input_image, lora_weight, guidance, downsampling_factor,
|
@@ -246,35 +244,15 @@ def generate_image(
|
|
246 |
vae=VAE_MODEL[0]
|
247 |
)
|
248 |
|
249 |
-
#
|
250 |
logger.info("Salvando imagem via node SaveImage...")
|
251 |
-
|
252 |
-
# 1. Pegue a saída do decode (tensor)
|
253 |
-
decoded_tensor = decoded[0] # se 'decoded' for um dict/tuple, ajuste conforme preciso
|
254 |
-
|
255 |
-
# 2. Instancia o SaveImage
|
256 |
saveimage_node = NODE_CLASS_MAPPINGS["SaveImage"]()
|
257 |
-
|
258 |
-
# 3. Usa o método save_images
|
259 |
-
# 'filename_prefix' é o prefixo do arquivo de saída
|
260 |
result_dict = saveimage_node.save_images(
|
261 |
-
filename_prefix="
|
262 |
images=decoded_tensor
|
263 |
)
|
264 |
-
|
265 |
-
# 4. Normalmente, o node 'save_images' retorna um dicionário contendo:
|
266 |
-
# {
|
267 |
-
# 'ui': {
|
268 |
-
# 'images': [
|
269 |
-
# {'filename': 'FluxRedux_12345.png', 'subfolder': ''},
|
270 |
-
# ...
|
271 |
-
# ]
|
272 |
-
# },
|
273 |
-
# ...
|
274 |
-
# }
|
275 |
-
# Assim, para pegar o nome do arquivo salvo:
|
276 |
saved_path = os.path.join(output_dir, result_dict["ui"]["images"][0]["filename"])
|
277 |
-
|
278 |
logger.info(f"Imagem salva em: {saved_path}")
|
279 |
return saved_path
|
280 |
|
|
|
9 |
import spaces
|
10 |
from typing import Union, Sequence, Mapping, Any
|
11 |
import logging
|
|
|
|
|
12 |
from nodes import NODE_CLASS_MAPPINGS, init_extra_nodes, SaveImage # <-- Node SaveImage
|
13 |
from comfy import model_management
|
14 |
import folder_paths
|
15 |
|
16 |
+
# 1. Configurar logging para debug
|
17 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
18 |
logger = logging.getLogger(__name__)
|
19 |
|
20 |
+
# 2. Configuração de Caminhos e Imports
|
21 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
22 |
sys.path.append(current_dir)
|
23 |
|
|
|
29 |
os.makedirs(models_dir, exist_ok=True)
|
30 |
folder_paths.set_output_directory(output_dir)
|
31 |
|
32 |
+
# 4. Configurar caminhos dos modelos e verificar estrutura
|
33 |
MODEL_FOLDERS = ["style_models", "text_encoders", "vae", "unet", "clip_vision"]
|
34 |
for model_folder in MODEL_FOLDERS:
|
35 |
folder_path = os.path.join(models_dir, model_folder)
|
|
|
37 |
folder_paths.add_model_folder_path(model_folder, folder_path)
|
38 |
logger.info(f"Pasta de modelo configurada: {model_folder}")
|
39 |
|
40 |
+
# 5. Diagnóstico CUDA
|
41 |
logger.info(f"Python version: {sys.version}")
|
42 |
logger.info(f"Torch version: {torch.__version__}")
|
43 |
logger.info(f"CUDA disponível: {torch.cuda.is_available()}")
|
|
|
45 |
if torch.cuda.is_available():
|
46 |
logger.info(f"GPU atual: {torch.cuda.get_device_name(0)}")
|
47 |
|
48 |
+
# 6. Inicialização do ComfyUI
|
49 |
logger.info("Inicializando ComfyUI...")
|
50 |
try:
|
51 |
init_extra_nodes()
|
|
|
53 |
logger.warning(f"Aviso na inicialização de nós extras: {str(e)}")
|
54 |
logger.info("Continuando mesmo com avisos nos nós extras...")
|
55 |
|
56 |
+
# 7. Helper Functions
|
57 |
def get_value_at_index(obj: Union[Sequence, Mapping], index: int) -> Any:
|
58 |
try:
|
59 |
return obj[index]
|
|
|
67 |
logger.error(f"Arquivo não encontrado: {file_path}")
|
68 |
return exists
|
69 |
|
70 |
+
# 8. Download de Modelos
|
71 |
logger.info("Baixando modelos necessários...")
|
72 |
try:
|
73 |
hf_hub_download(
|
|
|
104 |
logger.error(f"Erro ao baixar modelos: {str(e)}")
|
105 |
raise
|
106 |
|
107 |
+
# 9. Inicialização dos Modelos
|
108 |
logger.info("Inicializando modelos...")
|
109 |
try:
|
110 |
with torch.no_grad():
|
|
|
167 |
logger.error(f"Erro ao inicializar modelos: {str(e)}")
|
168 |
raise
|
169 |
|
170 |
+
# 10. Função de Geração
|
171 |
@spaces.GPU
|
172 |
def generate_image(
|
173 |
prompt, input_image, lora_weight, guidance, downsampling_factor,
|
|
|
244 |
vae=VAE_MODEL[0]
|
245 |
)
|
246 |
|
247 |
+
# Salvar Imagem
|
248 |
logger.info("Salvando imagem via node SaveImage...")
|
249 |
+
decoded_tensor = decoded[0]
|
|
|
|
|
|
|
|
|
250 |
saveimage_node = NODE_CLASS_MAPPINGS["SaveImage"]()
|
|
|
|
|
|
|
251 |
result_dict = saveimage_node.save_images(
|
252 |
+
filename_prefix="Flux_",
|
253 |
images=decoded_tensor
|
254 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
255 |
saved_path = os.path.join(output_dir, result_dict["ui"]["images"][0]["filename"])
|
|
|
256 |
logger.info(f"Imagem salva em: {saved_path}")
|
257 |
return saved_path
|
258 |
|