AvisSense / scripts /push_model_to_hub.py
rima ouchefoune
Commentaires pédagogiques détaillés sur tout le code
762c0d3
Raw
History Blame Contribute Delete
3.36 kB
"""
push_model_to_hub.py — Envoie le modèle fine-tuné sur le Hugging Face Hub.
===========================================================================
POURQUOI CE SCRIPT EXISTE :
Le modèle entraîné pèse ~270 Mo. GitHub refuse les fichiers de plus de
100 Mo : impossible de versionner les poids avec le code. La solution
standard de l'écosystème ML :
CODE -> GitHub (léger, versionné, revu en PR)
POIDS -> Hugging Face Hub (stockage de modèles, gratuit, versionné aussi)
Au déploiement, le Space lit la variable d'environnement MODEL_ID
(ex: "rima/avissense-distilcamembert") et télécharge les poids depuis
le Hub au démarrage de l'API. Code et poids voyagent séparément mais
se retrouvent en production.
PRÉREQUIS (une seule fois) :
1. Créer un compte sur https://huggingface.co
2. Créer un token d'accès : Settings > Access Tokens > type "Write"
(le type "Read" ne suffit pas : on veut ÉCRIRE sur le Hub)
3. Se connecter en local : huggingface-cli login (coller le token)
COMMENT LANCER (depuis la racine du projet) :
python scripts/push_model_to_hub.py --repo VOTRE_PSEUDO/avissense-distilcamembert
"""
# ─── IMPORTS ────────────────────────────────────────────────────────────────
import argparse # Lire le nom du repo en ligne de commande
import sys # Sortie propre en cas d'erreur
from pathlib import Path # Chemins portables
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# Même convention de chemins que les autres scripts
PROJECT_ROOT = Path(__file__).resolve().parent.parent
MODEL_DIR = PROJECT_ROOT / "model" / "sentiment_model"
def main():
parser = argparse.ArgumentParser(description="Pousse le modèle fine-tuné sur le HF Hub")
# required=True : pas de valeur par défaut volontairement — le nom du
# repo contient VOTRE pseudo, on ne peut pas le deviner.
parser.add_argument("--repo", required=True,
help="Nom du repo Hub, ex : rima/avissense-distilcamembert")
args = parser.parse_args()
# Vérification : le modèle doit avoir été entraîné avant d'être publié
if not MODEL_DIR.exists():
sys.exit(f"Erreur : modèle introuvable dans {MODEL_DIR}. Lancez d'abord train.py.")
# On recharge le modèle ET le tokenizer : les deux doivent être publiés
# ensemble (le Space aura besoin des deux pour faire des prédictions).
print(f"Chargement du modèle local depuis {MODEL_DIR} ...")
model = AutoModelForSequenceClassification.from_pretrained(str(MODEL_DIR))
tokenizer = AutoTokenizer.from_pretrained(str(MODEL_DIR))
# push_to_hub :
# - crée le repo sur le Hub s'il n'existe pas encore,
# - uploade les poids (~270 Mo, peut prendre quelques minutes),
# - utilise le token enregistré par `huggingface-cli login`.
print(f"Upload vers https://huggingface.co/{args.repo} ...")
model.push_to_hub(args.repo)
tokenizer.push_to_hub(args.repo)
print("Terminé ! Le modèle est en ligne sur le Hub.")
print(f"Sur le Space, réglez la variable : MODEL_ID = {args.repo}")
if __name__ == "__main__":
main()