Spaces:
Runtime error
Runtime error
fix: restaurar arquivos essenciais do Space (README, Dockerfile, app.py, requirements.txt)
Browse files- .gitattributes +35 -0
- Dockerfile +42 -0
- README.md +73 -0
- app.py +94 -0
- 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 |
+
|