# Problemas comuns (Hugging Face EDA) ## Segurança: tokens - **Nunca** commite `HF_TOKEN` nem cole tokens em README ou código versionado. - Gere e revogue em `https://huggingface.co/settings/tokens`. - Antes de `hf upload`, procure segredos: `grep -r "hf_" . --include="*.md" --include="*.py"` no diretório de upload. - Script auxiliar: [`scripts/clean_tokens.sh`](../scripts/clean_tokens.sh) para limpar padrões antes de enviar ao Hub. ## 401 ao fazer `push_dataset_to_hub` / upload de dataset - **Token:** tem de ser um [token com Write](https://huggingface.co/settings/tokens) (não uses só token de inferência). - **Organização:** `beAnalytic/eda-training-dataset` só funciona se a conta do token for **membro da org** com permissão de escrita. Caso contrário, cria o dataset no teu utilizador e aponta o treino para esse repo: - `export DATASET_REPO=O_TEU_USER/eda-training-dataset` - Depois o mesmo valor em secrets do Space / `train.py`. - Confirma quem está autenticado: `huggingface-cli whoami` (com o mesmo token). ## Space: `Invalid user token` / 401 em `whoami` / `login` O secret **`HF_TOKEN`** no Space tem de ser um [token classico com permissao Write](https://huggingface.co/settings/tokens) (ou fine-grained com acesso de escrita aos repos necessarios). **Nao** uses `HF_INFERENCE_ENDPOINT_TOKEN` nem tokens so de leitura. Cola o valor **sem aspas**, uma linha, sem espacos a mais. Guarda e faz **Factory reboot** do Space. Se o erro mostrar `train.py` numa linha com `login` e o teu ficheiro local for diferente, **faz upload** dos ficheiros deste repositorio para o Space (`hf upload` ou git), porque o codigo em `https://huggingface.co/spaces/...` pode estar desatualizado. ## Space: `CUDA out of memory` (T4 / ~15GB) O modelo em **fp16** + **LoRA** com `max_length` alto e batch grande esgota VRAM no backward (a loss faz `logits.float()`, o que pesa com sequências longas). **Predefinidos neste projeto (Dockerfile / `train.py`):** `MAX_SEQ_LENGTH=256`, `PER_DEVICE_TRAIN_BATCH_SIZE=1`, `GRADIENT_ACCUMULATION_STEPS=8`, **gradient checkpointing** ativo, **`device_map={"": 0}`** numa única GPU (evita offload para CPU com `device_map="auto"`). Ajusta no Space (Settings → Variables) ou no `Dockerfile` se tiveres GPU maior. - Sobe `GRADIENT_ACCUMULATION_STEPS` em vez de `PER_DEVICE_TRAIN_BATCH_SIZE` para manter batch efetivo. - Aumenta `MAX_SEQ_LENGTH` só se houver VRAM (ex.: 384) com **um único** processo de treino na GPU. - `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True` já está no Dockerfile. ## Space: `Process XXXXX has X GiB memory` (vários PIDs na mesma GPU) O erro de OOM pode mostrar **vários processos** a usar VRAM ao mesmo tempo. Reinícios do Space sem libertar processos antigos podem acumular treinos. Faz **Factory reboot** do Space antes de voltar a treinar e, se ainda falhar, reduz `MAX_SEQ_LENGTH` ou aumenta a GPU no Hub. O `app.py` usa um **lock em ficheiro** (`space_lock.py`, por defeito `/tmp/eda_training_single.lock`) para que só **um** `train.py` corra de cada vez: arranques em paralelo ficam em fila em vez de partilharem a mesma GPU. ## Space: `libnvJitLink.so.12` / `.13` / bitsandbytes Este treino **não** usa quantização 4/8-bit; `requirements.txt` não inclui `bitsandbytes` e o `Dockerfile` faz `pip uninstall bitsandbytes` para evitar a imagem base a carregar uma wheel incompatível com `libnvJitLink`. Mantém-se `nvidia-cuda-nvjitlink-cu12` para outras dependências que possam precisar do linker. Se voltares a instalar `bitsandbytes` para QLoRA no futuro, alinha a versão CUDA com a imagem PyTorch. ## Space: `RuntimeError: operator torchvision::nms does not exist` Acontece quando **torch** e **torchvision** ficam incompatíveis (por exemplo `pip` atualiza o PyTorch por causa de `torch>=...` em `requirements.txt` sem reinstalar **torchvision** alinhado). O `transformers` 5.x importa caminhos que carregam `torchvision`; o erro aparece já no `import transformers` / `import peft`. **Neste repositório:** `requirements.txt` **não** fixa `torch` à parte (usa o PyTorch da imagem base); o `Dockerfile` corre `pip install --upgrade torchvision` depois das outras dependências. Faz **rebuild** do Space após atualizar. Se ainda falhar, no `Dockerfile` alinha o par **torch+torchvision** ao CUDA da imagem, por exemplo: ```dockerfile RUN pip install --no-cache-dir --upgrade torch torchvision --index-url https://download.pytorch.org/whl/cu121 ``` (Ajusta `cu121` ou `cu124` conforme a variante CUDA da imagem `huggingface/transformers-pytorch-gpu`.) ## Space: log mostra TensorBoard na 7860 antes do `train.py` Se vires mensagens como `Space de treinamento iniciado`, `Configuracao TensorBoard`, `TensorBoard ... 0.0.0.0:7860`, o `app.py` no Hub **nao** e o minimalista deste projeto (TensorBoard na porta publica do Space conflitua e pode causar `libgomp` / reinicios). Substitui pelo [`app.py`](../app.py) atual (so executa `train.py`) e volta a fazer build do Space. ## Space: TensorBoard na porta 7860 e reinicios em loop No Hugging Face Space a porta **7860** e a porta **publica** da aplicacao. Nao arranques TensorBoard em `0.0.0.0:7860` no mesmo processo que o treino: conflita com o router do Space e pode reiniciar o container. O fluxo recomendado neste projeto e **sem** TensorBoard no `app.py` (so `train.py`); as metricas ficam em ficheiros em `results/` e analisas offline (ver [METRICS.md](METRICS.md)). ## Space: `Outro treino ja esta rodando (lock ativo)` Indica um **ficheiro de lock** ou processo paralelo noutra versao do `app.py`. Remove o lock no repositorio do Space ou garante **um unico** processo de treino. Alinha o `app.py` do Space com o deste repositorio (`app.py` minimalista que so executa `train.py`). ## HF_TOKEN no Space Sintomas: `HF_TOKEN não encontrado`, push desabilitado, checkpoints só locais. 1. Space → Settings → Repository secrets → `HF_TOKEN` (permissão write). 2. Reiniciar o Space após mudar secrets. 3. Com token: treino deve autenticar e `push_to_hub` conforme `train.py`. Sem token: treino corre; faça upload manual de `./results` depois. ## Erro 401 Unauthorized (Trainer / Hub) Algumas versões do transformers tentam falar com o Hub mesmo com push desligado. Mitigações: - Configurar `HF_TOKEN` válido no Space, ou - Garantir treino sem push (variáveis e `train.py` coerentes com `push_to_hub=False`). Se persistir: atualizar `transformers`/`huggingface_hub` e verificar que não há token inválido em cache (`huggingface-cli logout` local). ## Upload bloqueado: token detetado nos ficheiros Mensagem do Hub sobre secrets em ficheiros. 1. Remover `hf_...` de README, `.env`, etc. 2. Editar no Hub ou novo commit sem o segredo. 3. Se o token expôs-se publicamente, **revogue-o** e crie outro. ## Cache / build do Space Se o Space usar cache de build antigo e não refletir código novo: - Settings → factory reboot ou rebuild; ou - Commit que invalide cache (ex.: comentário no `Dockerfile`). ## Divergência Git (clone do Space) ``` Your branch and 'origin/main' have diverged ``` ```bash git fetch origin git pull --rebase origin main # resolver conflitos, git add, git rebase --continue git push origin main ``` Evite `git push --force` salvo intenção explícita de sobrescrever o remoto. ## Variáveis de ambiente / `.env` no upload Não envie `.env` para o Hub. Use `--exclude` no `hf upload` ou `.gitignore`. ## ImportError: huggingface-hub vs transformers `transformers` 4.x exige `huggingface_hub<1`; ambiente com `huggingface_hub` 1.x precisa de `transformers>=5`. Ver `README.md` na pasta de config. ## `TypeError: ParquetWriter ... use_content_defined_chunking` Versões recentes de `datasets` ao fazer `push_to_hub` exigem **PyArrow 21 ou superior**. Atualize no mesmo ambiente do treino: ```bash pip install -U "pyarrow>=21.0.0" ``` O `requirements.txt` desta pasta já fixa essa dependência. ## Incompatibilidade numpy / pandas (sklearn) Erro `numpy.dtype size changed` ao importar `transformers`/`peft`: ```bash pip install --upgrade --force-reinstall numpy pandas scikit-learn ``` Ou ambiente virtual só para ML (`requirements.txt` desta pasta). ## Conflito com vLLM `vllm` costuma fixar `transformers<5`. Use um venv separado para treino HF e outro para vLLM. ## Aviso no Hub: empty or missing yaml metadata Aplica-se ao `README.md` do repositório (modelo, dataset ou Space): tem de existir um bloco no topo entre `---` e `---` com pelo menos metadados válidos (por exemplo `license`, `library_name` em repos de modelo criados após agosto de 2024). Para o LoRA EDA, copia o template [`README_MODEL_CARD.md`](../README_MODEL_CARD.md) para o README do repo de modelo no Hub. Para o Space Docker, o `README.md` do Space deve usar o frontmatter de [`SPACE_README.md`](../SPACE_README.md). Documentação: [Model Cards](https://huggingface.co/docs/hub/model-cards#model-card-metadata). ## Referência Fluxo completo: [PIPELINE.md](PIPELINE.md). Métricas: [METRICS.md](METRICS.md).