aducsdr commited on
Commit
0fd259e
·
verified ·
1 Parent(s): 02ba760

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -55
app.py CHANGED
@@ -1,55 +1,87 @@
1
- # Dockerfile (VERSÃO FINAL CORRIGIDA)
2
-
3
- # 1. COMEÇAR COM A BASE CORRETA: Uma imagem oficial da NVIDIA com CUDA 12.1.1 e as ferramentas de desenvolvimento (devel)
4
- FROM nvidia/cuda:12.1.1-devel-ubuntu22.04
5
-
6
- # 2. INSTALAR DEPENDÊNCIAS DO SISTEMA
7
- # Precisamos de wget para baixar o miniconda e git para clonar o repositório.
8
- # DEBIAN_FRONTEND=noninteractive evita que a instalação peça inputs.
9
- ENV DEBIAN_FRONTEND=noninteractive
10
- RUN apt-get update && apt-get install -y --no-install-recommends \
11
- wget \
12
- git \
13
- && apt-get clean \
14
- && rm -rf /var/lib/apt/lists/*
15
-
16
- # 3. INSTALAR O MINICONDA SOBRE A IMAGEM NVIDIA
17
- # Baixamos o instalador, executamos em modo silencioso (-b) no diretório /opt/conda (-p)
18
- # e depois limpamos o instalador.
19
- RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
20
- /bin/bash ~/miniconda.sh -b -p /opt/conda && \
21
- rm ~/miniconda.sh
22
-
23
- # 4. ADICIONAR CONDA AO PATH DO SISTEMA
24
- # Isso garante que os comandos 'conda' e 'pip' usarão a instalação que acabamos de fazer.
25
- ENV PATH /opt/conda/bin:$PATH
26
-
27
- # 5. CRIAR O AMBIENTE CONDA A PARTIR DO NOSSO ARQUIVO
28
- # Copiamos o environment.yml e deixamos o conda instalar as dependências principais.
29
- COPY environment.yml .
30
- RUN conda env create -f environment.yml
31
-
32
- # 6. INSTALAR FLASH_ATTN DENTRO DO AMBIENTE
33
- # Agora este comando vai funcionar, pois nvcc e CUDA_HOME estão presentes na imagem base.
34
- # 'conda run -n seedvr ...' executa o comando dentro do nosso ambiente específico.
35
- RUN conda run -n seedvr pip install "flash_attn==2.5.9.post1" --no-build-isolation
36
-
37
- # 7. DEFINIR O AMBIENTE CONDA COMO PADRÃO PARA O RESTO DO DOCKERFILE
38
- # Esta é a linha corrigida, em formato JSON válido e completo.
39
- SHELL ["conda", "run", "-n", "seedvr", "/bin/bash", "-c"]
40
-
41
- # 8. PREPARAR O APLICATIVO
42
- WORKDIR /app
43
- RUN git clone https://github.com/bytedance-seed/SeedVR.git
44
- WORKDIR /app/SeedVR
45
-
46
- # 9. BAIXAR O MODELO DURANTE A CONSTRUÇÃO
47
- # O comando huggingface-cli já está disponível no ambiente conda.
48
- RUN huggingface-cli download ByteDance-Seed/SeedVR2-3B --local-dir ckpts --local-dir-use-symlinks False
49
-
50
- # 10. COPIAR O CÓDIGO DO NOSSO APP
51
- COPY app.py .
52
-
53
- # 11. DEFINIR O COMANDO DE EXECUÇÃO
54
- # O comando 'python' já será o do ambiente 'seedvr'.
55
- CMD ["python", "app.py"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import subprocess
3
+ import os
4
+
5
+ # Não precisamos mais de nenhuma função de setup, clone ou pip install aqui!
6
+ # O Dockerfile cuidou de tudo.
7
+
8
+ def run_inference_app(video_file, seed_num):
9
+ if video_file is None:
10
+ return None, "Por favor, envie um arquivo de vídeo."
11
+
12
+ # O app roda de dentro do diretório /app/SeedVR, então os caminhos são relativos
13
+ input_folder = "inputs"
14
+ os.makedirs(input_folder, exist_ok=True)
15
+
16
+ # O Gradio nos um caminho temporário, vamos movê-lo para um local conhecido
17
+ input_video_path = os.path.join(input_folder, os.path.basename(video_file.name))
18
+ os.rename(video_file.name, input_video_path)
19
+
20
+ output_folder = "outputs"
21
+ os.makedirs(output_folder, exist_ok=True)
22
+
23
+ # Comando de inferência. O ambiente conda está "ativado" graças ao Dockerfile.
24
+ command = [
25
+ "torchrun", "--nproc-per-node=4",
26
+ "projects/inference_seedvr2_3b.py",
27
+ "--video_path", input_folder,
28
+ "--output_dir", output_folder,
29
+ "--seed", str(seed_num),
30
+ "--res_h", "320",
31
+ "--res_w", "512",
32
+ ]
33
+
34
+ log_output = "Iniciando a inferência...\n" + ' '.join(command) + "\n\n"
35
+
36
+ try:
37
+ process = subprocess.Popen(
38
+ command,
39
+ stdout=subprocess.PIPE,
40
+ stderr=subprocess.STDOUT,
41
+ text=True,
42
+ encoding='utf-8'
43
+ )
44
+
45
+ while True:
46
+ line = process.stdout.readline()
47
+ if not line:
48
+ break
49
+ log_output += line
50
+ print(line.strip())
51
+ yield None, log_output
52
+
53
+ process.wait()
54
+
55
+ if process.returncode != 0:
56
+ raise RuntimeError("O script de inferência falhou. Verifique os logs.")
57
+
58
+ result_files = [os.path.join(output_folder, f) for f in os.listdir(output_folder) if f.endswith('.mp4')]
59
+ if not result_files:
60
+ return None, log_output + "\n\nERRO: Nenhum vídeo foi gerado."
61
+
62
+ return result_files, log_output + "\n\nInferência concluída com sucesso!"
63
+
64
+ except Exception as e:
65
+ error_message = f"{log_output}\n\nOcorreu um erro: {str(e)}"
66
+ return None, error_message
67
+
68
+ with gr.Blocks() as demo:
69
+ gr.Markdown("# 🚀 Inferência SeedVR2 com Ambiente Conda")
70
+ gr.Markdown("Este ambiente foi construído com Conda usando um Dockerfile para máxima estabilidade.")
71
+
72
+ with gr.Row():
73
+ with gr.Column(scale=1):
74
+ video_input = gr.File(label="Vídeo de Entrada")
75
+ seed_input = gr.Number(label="Seed", value=123)
76
+ run_button = gr.Button("Gerar Vídeo", variant="primary")
77
+ with gr.Column(scale=2):
78
+ gallery_output = gr.Gallery(label="Vídeo de Saída", show_label=True)
79
+ log_display = gr.Textbox(label="Logs de Execução", lines=15, interactive=False, autoscroll=True)
80
+
81
+ run_button.click(
82
+ fn=run_inference_app,
83
+ inputs=[video_input, seed_input],
84
+ outputs=[gallery_output, log_display]
85
+ )
86
+
87
+ demo.launch()