Comment fonctionne un déploiement canari
Un déploiement canari envoie une petite part des utilisateurs vers un changement avant que tout le monde l’ait. Si le changement est mauvais, seuls quelques-uns rencontrent le défaut.
Commencer par une petite part est une bonne idée, mais il faut dire laquelle. Cette leçon rend la part exacte et fait de la décision une règle écrite avant la mise en ligne.
À la fin de cette leçon
Remarque
Je peux envoyer une petite part du trafic vers un changement et décider par une règle.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Canari | le petit groupe qui reçoit un changement en premier | |
| Part | le pourcentage d’utilisateurs dans le canari | 5 |
| Panier | un numéro fixe de 0 à 99 pour chaque utilisateur | |
| Promouvoir | donner le changement à plus d’utilisateurs | |
| Annuler | reprendre le changement | |
| Marge | de combien le canari peut être moins bon |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un panier fixe décide qui est dedans
Ne tirez pas les utilisateurs au hasard à chaque fois : une personne passerait de l’ancienne à la nouvelle version. Donnez à chaque utilisateur un panier de 0 à 99 qui ne change jamais.
Un utilisateur est dans le canari quand son panier est sous la part. Avec une part de 20, les paniers 0 à 19 sont dedans.
Exemple détaillé : cinq utilisateurs
| Utilisateur | Panier | Dedans à la part 5 | Dedans à la part 20 | Dedans à la part 50 |
|---|---|---|---|---|
| u7 | 4 | Oui | Oui | Oui |
| u9 | 18 | Non | Oui | Oui |
| u15 | 33 | Non | Non | Oui |
| u1 | 62 | Non | Non | Non |
| u10 | 98 | Non | Non | Non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur courante
Attention
Beaucoup pensent qu’un petit canari sans erreur prouve que le changement est sûr. Cinq utilisateurs qui envoient peu de requêtes ne prouvent presque rien. Fixez d’abord un nombre minimal de requêtes et attendez que le canari l’ait atteint.
Écrivez la règle avant le déploiement
Comparez le pourcentage d’erreurs du canari à celui de l’ancienne version, à la même étape. Employez la division entière, arrondie vers le bas.
Attendez si le canari a moins de 50 requêtes. Annulez si son pourcentage dépasse celui de l’ancienne version plus une marge de 2. Sinon, promouvez.
Exemple détaillé : trois étapes
| Part | Requêtes du canari | Erreurs du canari | Pourcentage ancien | Décision |
|---|---|---|---|---|
| 5 | 40 | 1 | 1 | Attendre, seulement 40 requêtes |
| 20 | 180 | 4 | 2 | Promouvoir, 2 ne dépasse pas 4 |
| 50 | 300 | 18 | 2 | Annuler, 6 dépasse 4 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Écrire l’assistant du modèle, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' ' return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire l’assistant du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function demander(messages, echantillon, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' const d = await res.json();' ' return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' return { texte: echantillon, entree: null, sortie: null, enregistre: true };' ' }' '}' 'module.exports = { demander };' >> model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du canari, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'function panier(utilisateur) {' ' let s = 0;' ' for (let i = 0; i < utilisateur.length; i++) s = s + utilisateur.charCodeAt(i);' ' return (s * 7) % 100;' '}' 'function dansCanari(utilisateur, part) { return panier(utilisateur) < part; }' 'const utilisateurs = [];' 'for (let i = 1; i <= 20; i++) utilisateurs.push(\"u\" + i);' > canari.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du canari, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const etapes = [' ' { part: 5, rc: 40, ec: 1, ra: 760, ea: 15 },' ' { part: 20, rc: 180, ec: 4, ra: 640, ea: 13 },' ' { part: 50, rc: 300, ec: 18, ra: 450, ea: 9 },' '];' 'function pourcent(e, n) { return Math.floor(e * 100 / n); }' 'function decider(s) {' ' if (s.rc < 50) return \"attendre\";' ' return pourcent(s.ec, s.rc) > pourcent(s.ea, s.ra) + 2 ? \"annuler\" : \"promouvoir\";' '}' >> canari.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du canari, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' [5, 20].forEach(function (part) {' ' console.log(\"part \" + part + \" : \" + utilisateurs.filter(function (u) { return dansCanari(u, part); }).join(\" \"));' ' });' ' for (const s of etapes) {' ' const d = decider(s);' ' console.log(\"étape \" + s.part + \" : canari \" + pourcent(s.ec, s.rc) + \" pour cent, ancienne \" + pourcent(s.ea, s.ra) + \" pour cent -> \" + d);' ' if (d === \"annuler\" || d === \"attendre\") break;' ' }' ' const q = \"En une phrase courte, pourquoi n’envoyer d’abord qu’un petit nombre d’utilisateurs vers un changement ?\";' ' const echantillon = \"Si le changement est mauvais, seuls quelques utilisateurs rencontrent le défaut et vous pouvez revenir vite en arrière.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> canari.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer le canari
docker exec -w /home/node/project agent node canari.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que le Run affiche
| Ligne | Ce qu’elle montre |
|---|---|
| part 5 : u7 | Le seul utilisateur du canari à 5 |
| part 20 : u7 u8 u9 u11 u12 u13 u20 | Sept utilisateurs. u7 est toujours dedans |
| étape 5 : canari 2 pour cent, ancienne 1 pour cent -> attendre | Moins de 50 requêtes : on attend |
| le modèle dit : ... | Une phrase du labo. Un échantillon enregistré si aucun modèle ne répond |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.