File size: 5,435 Bytes
ac23084
 
 
 
 
 
edb8974
 
 
 
ac23084
 
34480b6
edb8974
ac23084
edb8974
ac23084
 
 
 
 
 
edb8974
 
 
 
 
ac23084
 
edb8974
 
 
 
 
 
 
 
 
 
ac23084
 
 
 
edb8974
ac23084
 
edb8974
 
 
ac23084
 
edb8974
 
ac23084
 
edb8974
ac23084
 
edb8974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a07fd79
 
 
 
edb8974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a07fd79
 
edb8974
 
 
 
 
 
 
 
 
 
 
a07fd79
edb8974
 
 
 
ac23084
 
edb8974
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# setup.py

import os
import subprocess
import sys
from pathlib import Path
import yaml

# Adiciona a importação do hf_hub_download
from huggingface_hub import hf_hub_download

# --- Configuração ---
DEPS_DIR = Path("/data")
MODELS_ROOT = DEPS_DIR / "ltx_models" # Diretório centralizado para modelos

# URLs explícitas para os repositórios
REPOS_TO_CLONE = {
    "LTX-Video": "https://huggingface.co/spaces/Lightricks/ltx-video-distilled",
    "SeedVR_Space": "https://huggingface.co/spaces/ByteDance-Seed/SeedVR2-3B",
    "MMAudio": "https://github.com/hkchengrex/MMAudio.git"
}

def run_command(command, cwd=None, is_pip=False):
    """Executa um comando no terminal e exibe a saída em tempo real."""
    if is_pip:
        command = [sys.executable, "-m", "pip"] + command
        
    print(f"Executando: {' '.join(command)}")
    try:
        with subprocess.Popen(
            command, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
            text=True, encoding='utf-8', bufsize=1
        ) as process:
            for line in iter(process.stdout.readline, ''):
                print(line, end='')
            
            return_code = process.wait()
            if return_code != 0:
                raise subprocess.CalledProcessError(return_code, command)
    except subprocess.CalledProcessError as e:
        print(f"ERRO: O comando falhou com o código de saída {e.returncode}")
        sys.exit(1)
    except FileNotFoundError:
        print(f"ERRO: O comando '{command[0]}' não foi encontrado.")
        sys.exit(1)

def clone_repos():
    """ETAPA 1: Garante que todos os repositórios de código necessários existam."""
    print("--- ETAPA 1: Verificando e clonando repositórios de código ---")
    for repo_name, repo_url in REPOS_TO_CLONE.items():
        repo_path = DEPS_DIR / repo_name
        if repo_path.exists() and (repo_path / ".git").exists():
            print(f"Repositório '{repo_name}' já existe. Pulando.")
        else:
            print(f"Clonando '{repo_name}' de {repo_url}...")
            run_command(["git", "clone", "--depth", "1", "-q", repo_url, str(repo_path)])
            print(f"'{repo_name}' clonado com sucesso.")

def install_ltx_dependencies():
    """ETAPA 2: Instala as dependências Python do LTX-Video."""
    print("\n--- ETAPA 2: Instalando dependências Python do LTX-Video ---")
    ltx_repo_path = DEPS_DIR / "LTX-Video"
    if ltx_repo_path.exists():
        run_command(["install", "-e", ".[inference]"], cwd=str(ltx_repo_path), is_pip=True)
        print("Dependências do LTX-Video instaladas com sucesso.")
    else:
        print("ERRO CRÍTICO: Diretório LTX-Video não encontrado. Não foi possível instalar dependências.")
        sys.exit(1)

def download_ltx_models():
    """
    ETAPA 3: Verifica e baixa os modelos LTX necessários, lendo os configs
    do repositório já clonado.
    """
    print("\n--- ETAPA 3: Verificando e baixando modelos LTX ---")
    LTX_REPO_ID = "Lightricks/LTX-Video" # Repositório dos modelos no Hub
    #ltx_configs_dir = DEPS_DIR / "LTX-Video" / "configs"
    ltx_configs_dir = "/app/configs"


    if not ltx_configs_dir.is_dir():
        print(f"ERRO CRÍTICO: Diretório de configs '{ltx_configs_dir}' não encontrado. O clone do LTX-Video pode ter falhado.")
        sys.exit(1)

    required_model_files = set()
    for cfg_path in ltx_configs_dir.glob("*.yaml"):
        try:
            with open(cfg_path, 'r') as f:
                config = yaml.safe_load(f)
                if config and config.get("checkpoint_path"):
                    required_model_files.add(config["checkpoint_path"])
                if config and config.get("spatial_upscaler_model_path"):
                    required_model_files.add(config["spatial_upscaler_model_path"])
        except Exception as e:
            print(f"AVISO: Falha ao ler o arquivo de configuração {cfg_path}: {e}")

    if not required_model_files:
        print("AVISO: Nenhum arquivo de modelo foi encontrado nos arquivos de configuração. Verifique os configs.")
        return

    print(f"Modelos necessários encontrados: {required_model_files}")
    MODELS_ROOT.mkdir(exist_ok=True)
    
    for model_filename in required_model_files:
        local_path = MODELS_ROOT / model_filename
        if local_path.exists():
            print(f"Modelo '{model_filename}' já existe localmente. Pulando.")
        else:
            print(f"Baixando modelo '{model_filename}'...")
            try:
                hf_hub_download(
                    repo_id=LTX_REPO_ID,
                    filename=model_filename,
                    local_dir=str(MODELS_ROOT),
                    cache_dir=os.getenv("HF_HOME_CACHE"),
                    token=os.getenv("HF_TOKEN"),
                )
                print(f"'{model_filename}' baixado com sucesso.")
            except Exception as e:
                print(f"ERRO: Falha ao baixar '{model_filename}'. Verifique o nome do arquivo e a conexão. Erro: {e}")

def main():
    print("--- Iniciando Setup Completo do Ambiente ADUC-SDR ---")
    DEPS_DIR.mkdir(exist_ok=True)
    
    # Executa as etapas na ordem correta
    clone_repos()
    #install_ltx_dependencies()
    download_ltx_models()

    print("\n--- ✅ Setup do Ambiente Concluído com Sucesso! ---")
    print("Todos os repositórios, dependências e modelos estão prontos.")

if __name__ == "__main__":
    main()