← Retour au blog

FinOps pour ML et GPU

Lucian BLETAN

Les projets de machine learning, en particulier ceux qui utilisent des GPU, peuvent rapidement devenir des gouffres financiers. Les coûts ne viennent pas seulement du temps de calcul pour l’entraînement, mais aussi du stockage des modèles et des données, et de l’infrastructure pour l’inférence. Appliquer des principes FinOps au ML, ce n’est pas brider l’innovation ; c’est éliminer le gaspillage pour maximiser le retour sur investissement de ces ressources coûteuses.

finops pour le ml

training

choix du gpu

taille de batch

fp16

checkpoints efficaces

serving

autoscaling des endpoints

int8

cpu vs gpu

stockage

politique de rétention

compression

nettoyage des datasets

prérequis

  • Étiquettes de coûts systématiques: Chaque job d’entraînement, endpoint d’inférence ou bucket de stockage doit être tagué avec le nom du projet et de l’équipe.
  • Accès aux logs d’usage: Pouvoir analyser la consommation des GPU, l’utilisation du stockage et les journaux de facturation.
  • Budgets et alertes: Avoir défini des budgets par projet et des alertes automatiques en cas de dérive.

idées clefs

  • Optimiser le calcul: Utiliser la précision mixte (FP16) peut diviser par deux le temps d’entraînement et la mémoire utilisée avec une perte de précision souvent négligeable.
  • Gérer les artefacts: Ne conserver que les checkpoints de modèle réellement utiles (ex: le meilleur et les 3 derniers) et compresser systématiquement les datasets et les embeddings.
  • Cibler le bon hardware: Ne pas utiliser un GPU cher pour une tâche qui peut tourner sur un CPU. L’inférence de nombreux modèles, après quantification, est souvent plus rentable sur CPU.

pas à pas

étape 1: étiqueter et mesurer

La première étape est de savoir qui consomme quoi. En taguant chaque ressource, vous pouvez créer des tableaux de bord pour allouer chaque euro dépensé.

-- Requête pour un dashboard de suivi des coûts GPU par projet et par mois
SELECT
    DATE_TRUNC(usage_start_time, MONTH) as mois,
    labels.project AS projet,
    labels.user AS utilisateur,
    SUM(cost) AS cout_total_eur,
    SUM(usage.amount_in_pricing_units) AS gpu_hours
FROM
    `votre_projet.billing.gcp_billing_export_v1_xxxx`
WHERE
    service.description LIKE '%GPU%'
    AND usage_start_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 MONTH)
GROUP BY 1, 2, 3
ORDER BY 1 DESC, 4 DESC;

étape 2: optimiser l’entraînement et l’inférence

Une fois que vous savez où part l’argent, vous pouvez agir sur le gaspillage de calcul.

  • Pour l’entraînement: Ajustez la taille du batch pour saturer la mémoire du GPU. Activez la précision mixte (fp16) dans votre framework (PyTorch, TensorFlow).
  • Pour l’inférence: Mettez en place de l’autoscaling sur vos endpoints pour passer à zéro instance quand il n’y a pas de trafic. Utilisez la quantification (int8) pour réduire la taille du modèle et le servir sur des CPU moins chers.

étape 3: gérer le cycle de vie des artefacts

Les modèles et les datasets peuvent occuper des téraoctets de stockage coûteux. Une politique de nettoyage est essentielle.

  • Checkpoints: Ne conservez que les N derniers checkpoints et le meilleur. Supprimez les autres automatiquement à la fin de chaque run.
  • Datasets: Stockez les datasets d’entraînement sur des classes de stockage moins chères (stockage “froid”) et mettez en place des règles de suppression automatique après X mois.
  • Modèles: Dé-enregistrez les anciennes versions de modèles qui ne sont plus en production depuis plus de 90 jours.

erreurs courantes et solutions

  • Symptôme: La facture GPU est élevée même le week-end, quand personne ne travaille.

    • Cause: Des instances de notebook ou d’entraînement qui tournent à vide.
    • Correctif: Mettre en place des scripts d’arrêt automatique (auto-shutdown) sur toutes les instances interactives après quelques heures d’inactivité.
  • Symptôme: Le coût de stockage S3/GCS augmente de manière linéaire chaque mois.

    • Cause: Accumulation de milliers de checkpoints de modèles et de datasets intermédiaires.
    • Correctif: Définir une politique de rétention stricte dans le code d’entraînement (ex: ne garder que 3 checkpoints). Utiliser les politiques de cycle de vie du stockage cloud pour archiver ou supprimer les anciennes données.
  • Symptôme: Des modèles sont entraînés sur des datasets énormes à chaque expérimentation.

    • Cause: Transferts massifs et redondants de données depuis le stockage central.
    • Correctif: Utiliser des caches locaux sur les machines d’entraînement (ex: FSx for Lustre sur AWS, ou un simple disque SSD). Ne télécharger la donnée qu’une seule fois pour plusieurs entraînements.

faq

  • L’optimisation des coûts ne risque-t-elle pas de ralentir la recherche ? Au contraire. L’objectif du FinOps n’est pas de brider, mais d’éliminer le gaspillage pur (ex: un GPU inactif) pour libérer du budget. Ce budget peut ensuite être réalloué à des expérimentations à plus forte valeur ajoutée.

  • Vaut-il mieux un CPU ou un GPU pour l’inférence en production ? Ça dépend du cas d’usage. Pour du traitement de masse à haut débit, un GPU est souvent plus efficace. Mais pour des prédictions unitaires à faible latence, un modèle quantifié (INT8) servi sur un CPU moderne est souvent bien plus rentable.