amarorn commited on
Commit
a6fbb35
·
1 Parent(s): d0ac8a6

fix: restaurar arquivos essenciais do Space (README, Dockerfile, app.py, requirements.txt)

Browse files
Files changed (5) hide show
  1. .gitattributes +35 -0
  2. Dockerfile +42 -0
  3. README.md +73 -0
  4. app.py +94 -0
  5. requirements.txt +9 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM huggingface/transformers-pytorch-gpu:latest
2
+
3
+ WORKDIR /app
4
+
5
+ # Instalar dependências do sistema
6
+ # python-is-python3 cria automaticamente o symlink python -> python3
7
+ RUN apt-get update && apt-get install -y --no-install-recommends \
8
+ git \
9
+ python3 \
10
+ python3-pip \
11
+ python-is-python3 \
12
+ && rm -rf /var/lib/apt/lists/*
13
+
14
+ # Verificar que python está disponível (entrypoint do NVIDIA precisa)
15
+ RUN python --version && \
16
+ python3 --version && \
17
+ echo "✅ Python disponível: $(which python)"
18
+
19
+ # Instalar dependências Python
20
+ COPY requirements.txt .
21
+ RUN python3 -m pip install --no-cache-dir --upgrade pip && \
22
+ python3 -m pip install --no-cache-dir -r requirements.txt
23
+
24
+ # Copiar scripts de treinamento
25
+ COPY train.py /app/train.py
26
+ COPY app.py /app/app.py
27
+
28
+ # Criar diretório de logs
29
+ RUN mkdir -p /app/logs
30
+
31
+ # Configurar variáveis de ambiente padrão (podem ser sobrescritas)
32
+ ENV MODEL_NAME=microsoft/Phi-3-mini-4k-instruct
33
+ ENV DATASET_REPO=beAnalytic/eda-training-dataset
34
+ ENV OUTPUT_REPO=beAnalytic/eda-llm-model
35
+ ENV OMP_NUM_THREADS=1
36
+ ENV PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
37
+
38
+ # Executar treinamento
39
+ # Usar 'python' (que será o symlink para python3 criado acima)
40
+ # O entrypoint do NVIDIA espera 'python' estar disponível
41
+ CMD ["python", "/app/app.py"]
42
+
README.md ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: EDA Model Training
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ sdk_version: "latest"
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
11
+
12
+ # Treinamento do Modelo EDA
13
+
14
+ Este Space contém o script de treinamento para o modelo de Análise Exploratória de Dados (EDA).
15
+
16
+ ## Configuração
17
+
18
+ ### Variáveis de Ambiente Obrigatórias
19
+
20
+ **⚠️ IMPORTANTE**: Configure a variável de ambiente `HF_TOKEN` no Settings do Space para habilitar o push automático dos checkpoints para o Hub.
21
+
22
+ ### Variáveis de Ambiente
23
+
24
+ Configure as seguintes variáveis de ambiente no Settings do Space:
25
+
26
+ - **`HF_TOKEN`** (OBRIGATÓRIO): Seu token do HuggingFace com permissões de escrita
27
+ - Gere em: https://huggingface.co/settings/tokens
28
+ - Permissões necessárias: `write`
29
+ - Sem este token, o treinamento funcionará mas os checkpoints não serão enviados ao Hub
30
+
31
+ - `MODEL_NAME`: Modelo base (padrão: `microsoft/Phi-3-mini-4k-instruct`)
32
+ - `DATASET_REPO`: ID do dataset (padrão: `beAnalytic/eda-training-dataset`)
33
+ - `OUTPUT_REPO`: ID do modelo de saída (padrão: `beAnalytic/eda-llm-model`)
34
+
35
+ ### Como Configurar HF_TOKEN no Space
36
+
37
+ 1. Acesse: https://huggingface.co/spaces/beAnalytic/Training/settings
38
+ 2. Vá para a seção **"Repository secrets"**
39
+ 3. Clique em **"New secret"**
40
+ 4. Nome: `HF_TOKEN`
41
+ 5. Valor: Cole seu token do HuggingFace
42
+ 6. Clique em **"Add secret"**
43
+
44
+ **Nota**: O token será usado automaticamente pelo script durante o treinamento.
45
+
46
+ ### Execução
47
+
48
+ O script `train.py` será executado automaticamente quando o Space for iniciado.
49
+
50
+ ## Estrutura
51
+
52
+ - `train.py`: Script principal de treinamento
53
+ - `training_config.json`: Configurações de treinamento
54
+ - `requirements.txt`: Dependências Python
55
+
56
+ ## Monitoramento
57
+
58
+ Acompanhe o progresso do treinamento através dos logs do Space na aba "Logs".
59
+
60
+ ### TensorBoard
61
+
62
+ O TensorBoard está configurado e rodando na porta 6006 dentro do container. No HuggingFace Space com Docker SDK, apenas a porta 7860 é exposta publicamente, então o TensorBoard não é acessível diretamente via URL.
63
+
64
+ **Para visualizar métricas**:
65
+ - Durante o treinamento: Acompanhe os logs na aba "Logs"
66
+ - Após o treinamento: Baixe os logs de `./results/` e execute `tensorboard --logdir=./results` localmente
67
+ - Acesse: http://localhost:6006 (após baixar os logs)
68
+
69
+ Para mais detalhes, consulte [ACESSAR_TENSORBOARD.md](../huggingface_training_config/docs/ACESSAR_TENSORBOARD.md).
70
+
71
+ ## Resultados
72
+
73
+ O modelo treinado será salvo automaticamente no HuggingFace Hub no repositório especificado em `OUTPUT_REPO`.
app.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ App principal para execução no HuggingFace Space.
4
+ Este arquivo executa o treinamento do modelo EDA e inicia o TensorBoard.
5
+ """
6
+
7
+ import os
8
+ import subprocess
9
+ import sys
10
+ import threading
11
+ import time
12
+
13
+ def start_tensorboard():
14
+ """
15
+ Inicia o TensorBoard em background, verificando se já está rodando.
16
+ """
17
+ # Os logs do TensorBoard são salvos no output_dir (./results) quando report_to=["tensorboard"]
18
+ # Criar diretório de resultados se não existir
19
+ results_dir = os.path.join(os.path.dirname(__file__), "results")
20
+ os.makedirs(results_dir, exist_ok=True)
21
+
22
+ # Verificar se TensorBoard já está rodando na porta 6006
23
+ import socket
24
+ port_in_use = False
25
+ try:
26
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
27
+ result = sock.connect_ex(('0.0.0.0', 6006))
28
+ if result == 0:
29
+ port_in_use = True
30
+ sock.close()
31
+ except Exception:
32
+ pass
33
+
34
+ if port_in_use:
35
+ print("=" * 60)
36
+ print("⚠️ TensorBoard já está rodando na porta 6006")
37
+ print("=" * 60)
38
+ return
39
+
40
+ print("=" * 60)
41
+ print("Iniciando TensorBoard...")
42
+ print(f"Logdir: {results_dir}")
43
+ print("TensorBoard estará disponível na interface do HuggingFace Space")
44
+ print("=" * 60)
45
+
46
+ # Matar qualquer processo TensorBoard anterior (se houver)
47
+ os.system("pkill -f 'tensorboard.*6006' 2>/dev/null || true")
48
+ time.sleep(1)
49
+
50
+ # Iniciar TensorBoard em background
51
+ # IMPORTANTE: Os logs são salvos em ./results quando report_to=["tensorboard"]
52
+ # Porta 6006 é a porta padrão do TensorBoard
53
+ os.system("tensorboard --logdir=results --host=0.0.0.0 --port=6006 > /dev/null 2>&1 &")
54
+
55
+ # Aguardar um pouco para garantir que o TensorBoard iniciou
56
+ time.sleep(2)
57
+ print("✅ TensorBoard iniciado em background")
58
+
59
+ def main():
60
+ """
61
+ Executa o script de treinamento.
62
+ """
63
+ # Iniciar TensorBoard em thread separada
64
+ tensorboard_thread = threading.Thread(target=start_tensorboard, daemon=True)
65
+ tensorboard_thread.start()
66
+
67
+ print("=" * 60)
68
+ print("Iniciando treinamento do modelo EDA")
69
+ print("=" * 60)
70
+
71
+ script_path = os.path.join(os.path.dirname(__file__), "train.py")
72
+
73
+ if not os.path.exists(script_path):
74
+ print(f"❌ Erro: Arquivo {script_path} não encontrado!")
75
+ sys.exit(1)
76
+
77
+ try:
78
+ result = subprocess.run(
79
+ [sys.executable, script_path],
80
+ check=True,
81
+ capture_output=False,
82
+ )
83
+ print("\n✅ Treinamento concluído com sucesso!")
84
+ return result.returncode
85
+ except subprocess.CalledProcessError as e:
86
+ print(f"\n❌ Erro durante o treinamento: {e}")
87
+ sys.exit(e.returncode)
88
+ except KeyboardInterrupt:
89
+ print("\n⚠️ Treinamento interrompido pelo usuário")
90
+ sys.exit(130)
91
+
92
+ if __name__ == "__main__":
93
+ sys.exit(main())
94
+
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ torch>=2.0.0
2
+ transformers>=4.45.0
3
+ datasets>=2.14.0
4
+ peft>=0.8.0
5
+ accelerate>=0.27.0
6
+ bitsandbytes>=0.41.0
7
+ huggingface_hub>=0.20.0
8
+ tensorboard>=2.15.0
9
+