Un hyperparamètre se choisit avant l’entraînement, un paramètre s’apprend pendant. La distinction se lit dans le code, et elle décide de ce que vous avez le droit de régler.
Un script ElasticNet qui n’affiche ses résultats que dans le terminal, puis les six lignes qui le rendent comparable, reproductible et prêt pour le registre de modèles.
MLflow est un outil, le MLOps un ensemble de pratiques. Ce que MLflow couvre du cycle de vie, ce qu’il laisse à d’autres, et pourquoi le MLOps n’est pas du DevOps.
Réentraîner n’est pas relancer le notebook. Choisir le déclencheur, la fenêtre de données et le critère de bascule — et ne jamais promouvoir un modèle parce qu’il est récent.
Un modèle qui récite ses données d’entraînement a besoin d’un frein. alpha en règle l’intensité, l1_ratio choisit entre Ridge et Lasso. Trop freiner nuit autant que pas assez.
Trois jours plus tard, personne ne sait quel réglage a donné 0,93. Ce qu’il faut enregistrer pour que deux essais soient comparables, et quand MLflow devient utile.
Docker fabrique l’image, Kubernetes la fait tourner. Suivre la chaîne du code jusqu’au navigateur — image, Pod, Deployment, Service, ConfigMap — et voir la place de chacun.
Changer une couleur ne devrait pas demander de reconstruire une image Docker. Le ConfigMap sort les réglages du code — avec un piège sur la mise à jour des Pods.
Une application Flask, un Dockerfile, trois fichiers YAML. Le trajet du code au navigateur, avec les vérifications qui prouvent que chaque objet fait son travail.
Pendant un rolling update, v1 et v2 tournent en même temps. La base doit donc être compatible avec les deux — et c’est l’ordre des opérations qui décide s’il y aura une panne.
Un Secret n’est pas chiffré, seulement encodé en base64. Où mettre un mot de passe, qui peut réellement le lire, et pourquoi Vault ne remplace pas le Secret mais l’alimente.
Les Pods changent d’adresse à chaque recréation. Le Service met un nom stable devant eux et répartit le trafic. Quand il ne répond rien, la cause est presque toujours la même.
Snowflake exécute avec son moteur propriétaire, Databricks avec Spark et Photon. Ce que la différence change vraiment, et le piège des replis silencieux de Photon.
reduceByKey impose le même type en entrée et en sortie, ce qui rend une moyenne impossible. Les trois agrégateurs qui lèvent cette contrainte.
Un cache mal placé ralentit un job. Les niveaux de persist, la différence RDD/DataFrame, l’unpersist oublié, et le cas où seul checkpoint suffit.
Deux méthodes au même argument, deux travaux différents. Démonstration avec glom(), le piège du coalesce(7) qui reste à 5, et la règle pour choisir.
Un RDD n’est pas une table, ni une List plus grosse. Ce que le distribué retire (index, évaluation immédiate), et en quoi Spark SQL diffère du SQL.
Une vue temporaire n’est ni une table, ni un cache. Sa portée, sa durée de vie, le préfixe global_temp qui piège tout le monde, et l’équivalent Scala de l’exemple PySpark.
Spark déduit le nombre de partitions des cœurs qu’il croit avoir. Le code pour afficher ce chiffre, d’où il vient, et le piège des deux réglages.
Quatre opérations qui se ressemblent et un choix qui change la facture cloud. Pourquoi reduceByKey bat groupByKey, et les pièges du tri de clés.
Oui, Spark relit tout le fichier pour deviner les types. Mais le vrai problème n’est pas la lenteur : c’est le type qui change et casse le pipeline sans erreur.
Un join qui met une heure au lieu de trois minutes, c’est la stratégie choisie. Broadcast, sort-merge, skew : quand chacun s’applique et comment forcer.
Comment écrire en Parquet ou Delta Lake sans noyer le stockage : partitionnement, taille des fichiers, et le moment où Delta devient indispensable.
Vos jobs tournent avec 200 partitions par défaut, et c’est presque toujours faux. La règle des 128 Mo, repartition, coalesce et l’AQE de Spark 3.
Une partition est une tâche potentielle, pas un cœur. L’exécution par vagues, et comment inspecter les partitions avec mapPartitionsWithIndex.
Trois API pour le même moteur, mais un seul optimiseur les comprend. Pourquoi le DataFrame gagne presque toujours, et les trois cas où le RDD reste indispensable.
Le word count de Spark décortiqué ligne par ligne en Scala : flatMap, map, reduceByKey, saveAsTextFile sur un cas concret, avec les pièges classiques.
Les tutoriels écrivent tantôt `sc.parallelize`, tantôt `spark.read` sans dire ce que sont ces objets. La différence, l’historique, et lequel utiliser.
On répète que Scala est plus rapide que PySpark. C’est vrai dans un cas précis et faux ailleurs. Ce qui se passe sous le capot, et comment choisir.
Une UDF est une boîte noire pour Catalyst : plus de codegen, plus de pushdown. Ce que vous perdez, et comment la remplacer par des fonctions natives.
Une image Java construite avec Maven pèse souvent un gigaoctet pour livrer un jar de quelques mégaoctets. Le build multi-étapes la ramène à sa taille utile.
Un Pod seul redémarre mal, ne passe pas à l’échelle et disparaît avec son nœud. Pourquoi le Deployment est la première ressource à apprendre.
Le state local fonctionne seul. À deux, il devient une course critique. Comment poser un backend S3 avec verrou DynamoDB, la base d’un vrai projet.
map, filter, select ne lancent aucun calcul. count, collect, write si. Comprendre la frontière transformation / action évite 80 % des mauvaises surprises en Spark.
No space left on device. Avant de tout supprimer, l’ordre exact des commandes qui disent ce qui remplit le disque — fichiers effacés encore ouverts inclus.
Dates incohérentes, doublons partiels, valeurs manquantes structurées : le nettoyage n’est pas une liste de méthodes, c’est une suite de choix à poser.
Indexer des logs ne sert à rien si la requête ne répond pas à un incident. Les trois requêtes à maîtriser en premier, et les pièges de mapping.