| |
| """ |
| Envia o DatasetDict local (pasta gerada por save_to_disk) para o Hugging Face Hub. |
| |
| Garante splits e colunas compatíveis com `load_dataset(repo_id)` em train.py. |
| |
| Uso: |
| cd ml/configs/huggingface_training_config |
| export HF_TOKEN=... |
| python scripts/push_dataset_to_hub.py |
| python scripts/push_dataset_to_hub.py /caminho/absoluto/para/eda_training_dataset |
| """ |
|
|
| from __future__ import annotations |
|
|
| import os |
| import sys |
| from pathlib import Path |
|
|
| from datasets import load_from_disk |
| from huggingface_hub import create_repo, whoami |
|
|
|
|
| def _repo_root() -> Path: |
| return Path(__file__).resolve().parents[4] |
|
|
|
|
| def _ensure_hf_token_from_dotenv() -> None: |
| if os.environ.get("HF_TOKEN") or os.environ.get("HUGGING_FACE_HUB_TOKEN"): |
| return |
| env_path = _repo_root() / ".env" |
| if not env_path.is_file(): |
| return |
| for raw in env_path.read_text(encoding="utf-8").splitlines(): |
| line = raw.strip() |
| if not line or line.startswith("#"): |
| continue |
| for prefix in ("HF_TOKEN=", "HUGGING_FACE_HUB_TOKEN="): |
| if line.startswith(prefix): |
| val = line[len(prefix) :].strip().strip('"').strip("'") |
| if val: |
| os.environ["HF_TOKEN"] = val |
| return |
|
|
|
|
| def _resolve_token() -> str | None: |
| return ( |
| os.environ.get("HF_TOKEN") |
| or os.environ.get("HUGGING_FACE_HUB_TOKEN") |
| or None |
| ) |
|
|
|
|
| def main() -> None: |
| _ensure_hf_token_from_dotenv() |
| token = _resolve_token() |
| if not token: |
| print( |
| "Defina HF_TOKEN ou HUGGING_FACE_HUB_TOKEN (token com escrita no Hub). " |
| "Crie em https://huggingface.co/settings/tokens ou adicione ao .env na raiz do repo.", |
| file=sys.stderr, |
| ) |
| if os.environ.get("HF_INFERENCE_ENDPOINT_TOKEN"): |
| print( |
| "Nota: HF_INFERENCE_ENDPOINT_TOKEN nao substitui HF_TOKEN para upload ao Hub.", |
| file=sys.stderr, |
| ) |
| sys.exit(1) |
|
|
| default_path = _repo_root() / "ml" / "datasets" / "eda_training_dataset" |
| disk_path = Path(sys.argv[1]).resolve() if len(sys.argv) > 1 else default_path |
|
|
| if not disk_path.is_dir(): |
| print(f"Pasta não encontrada: {disk_path}", file=sys.stderr) |
| sys.exit(1) |
|
|
| private = os.environ.get("HF_DATASET_PRIVATE", "true").lower() in ("1", "true", "yes") |
|
|
| try: |
| identity = whoami(token=token) |
| hub_user = identity.get("name") or "?" |
| print(f"Autenticado no Hub como: {hub_user}") |
| except Exception as exc: |
| print( |
| "Falha na autenticacao (token invalido ou expirado). " |
| "Gere um novo token em https://huggingface.co/settings/tokens com permissao Write.\n" |
| f"Detalhe: {exc}", |
| file=sys.stderr, |
| ) |
| sys.exit(1) |
|
|
| if os.environ.get("DATASET_REPO"): |
| repo_id = os.environ["DATASET_REPO"].strip() |
| else: |
| repo_id = f"{hub_user}/eda-training-dataset" |
| print( |
| "DATASET_REPO nao definido: a usar o teu espaco de utilizador " |
| f"(evita 401 se nao tiveres acesso a org beAnalytic).\n" |
| f" -> {repo_id}\n" |
| "Para a org beAnalytic (com permissao):\n" |
| " export DATASET_REPO=beAnalytic/eda-training-dataset" |
| ) |
|
|
| try: |
| create_repo( |
| repo_id=repo_id, |
| repo_type="dataset", |
| token=token, |
| private=private, |
| exist_ok=True, |
| ) |
| except Exception as exc: |
| print( |
| f"Nao foi possivel criar ou aceder ao dataset `{repo_id}`: {exc}\n" |
| "Se o repositorio e de uma organizacao (ex.: beAnalytic), a conta precisa de " |
| "ser membro com permissao de escrita, ou use um repo no teu utilizador:\n" |
| " export DATASET_REPO=O_TEU_USER/eda-training-dataset", |
| file=sys.stderr, |
| ) |
| sys.exit(1) |
|
|
| print(f"Carregando: {disk_path}") |
| ds = load_from_disk(str(disk_path)) |
| print(ds) |
| print(f"Enviando para {repo_id} (private={private})...") |
| ds.push_to_hub(repo_id, private=private, token=token) |
| print(f"Concluído: https://huggingface.co/datasets/{repo_id}") |
| print() |
| print("No treino (local ou Space), usa o mesmo repositorio de dataset:") |
| print(f" export DATASET_REPO={repo_id}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|