Cómo funciona un despliegue canario
Un despliegue canario envía una parte pequeña de los usuarios a un cambio antes de que lo reciba todo el mundo. Si el cambio es malo, solo unos pocos notan el fallo.
Funciona cuando los mismos usuarios están en el canario siempre. Además necesita una regla para decidir, escrita antes de lanzar el cambio.
Al final de esta lección
Nota
Puedo enviar una parte pequeña del tráfico a un cambio y decidir con una regla.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Canario | el grupo pequeño que recibe un cambio primero | |
| Parte | el porcentaje de usuarios que está en el canario | 5 |
| Cubo | un número fijo de 0 a 99 para cada usuario | |
| Promover | dar el cambio a más usuarios | |
| Revertir | quitar el cambio otra vez | |
| Margen | cuánto peor puede ser el canario |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un cubo fijo decide quién entra
No elijas usuarios al azar cada vez, o una persona salta entre la versión antigua y la nueva. Da a cada usuario un cubo de 0 a 99 que nunca cambie.
Un usuario está en el canario cuando su cubo es menor que la parte. Con una parte de 20, entran los cubos del 0 al 19.
Ejemplo resuelto: cinco usuarios
| Usuario | Cubo | Dentro con parte 5 | Dentro con parte 20 | Dentro con parte 50 |
|---|---|---|---|---|
| u7 | 4 | Sí | Sí | Sí |
| u9 | 18 | No | Sí | Sí |
| u15 | 33 | No | No | Sí |
| u1 | 62 | No | No | No |
| u10 | 98 | No | No | No |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que un canario pequeño sin errores prueba que el cambio es seguro. Cinco usuarios con pocas peticiones prueban muy poco. Fija antes un mínimo de peticiones y espera hasta que el canario lo alcance.
Escribe la regla antes del despliegue
Compara el porcentaje de errores del canario con el de la versión antigua en la misma etapa. Usa la división entera, redondeada hacia abajo.
Espera si el canario tiene menos de 50 peticiones. Revierte si su porcentaje supera el de la antigua más un margen de 2. Si no, promueve.
Ejemplo resuelto: tres etapas
| Parte | Peticiones del canario | Errores del canario | Porcentaje antiguo | Decisión |
|---|---|---|---|---|
| 5 | 40 | 1 | 1 | Esperar, solo 40 peticiones |
| 20 | 180 | 4 | 2 | Promover, 2 no supera 4 |
| 50 | 300 | 18 | 2 | Revertir, 6 supera 4 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Escribe el ayudante del modelo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el ayudante del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, 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(\"estado \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el script del canario, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'function bucket(user) {' ' let s = 0;' ' for (let i = 0; i < user.length; i++) s = s + user.charCodeAt(i);' ' return (s * 7) % 100;' '}' 'function inCanary(user, share) { return bucket(user) < share; }' 'const users = [];' 'for (let i = 1; i <= 20; i++) users.push(\"u\" + i);' > canary.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el script del canario, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const stages = [' ' { share: 5, cn: 40, ce: 1, bn: 760, be: 15 },' ' { share: 20, cn: 180, ce: 4, bn: 640, be: 13 },' ' { share: 50, cn: 300, ce: 18, bn: 450, be: 9 },' '];' 'function pct(e, n) { return Math.floor(e * 100 / n); }' 'function decide(s) {' ' if (s.cn < 50) return \"esperar\";' ' return pct(s.ce, s.cn) > pct(s.be, s.bn) + 2 ? \"revertir\" : \"promover\";' '}' >> canary.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el script del canario, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' [5, 20].forEach(function (share) {' ' console.log(\"parte \" + share + \": \" + users.filter(function (u) { return inCanary(u, share); }).join(\" \"));' ' });' ' for (const s of stages) {' ' const d = decide(s);' ' console.log(\"etapa \" + s.share + \": canario \" + pct(s.ce, s.cn) + \" por ciento, antigua \" + pct(s.be, s.bn) + \" por ciento -> \" + d);' ' if (d === \"revertir\" || d === \"esperar\") break;' ' }' ' const q = \"En una frase corta, ¿por qué enviar un cambio solo a pocos usuarios al principio?\";' ' const sample = \"Si el cambio es malo, solo unos pocos notan el fallo y se puede deshacer rápido.\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> canary.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta el canario
docker exec -w /home/node/project agent node canary.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que imprime el Run
| Línea | Qué muestra |
|---|---|
| parte 5: u7 | El único usuario del canario con 5 |
| parte 20: u7 u8 u9 u11 u12 u13 u20 | Siete usuarios. u7 sigue dentro |
| etapa 5: canario 2 por ciento, antigua 1 por ciento -> esperar | Menos de 50 peticiones, así que se espera |
| el modelo dijo: ... | Una frase del laboratorio. Una muestra grabada si ningún modelo responde |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.