¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo un servidor agrupa peticiones

Después de esta lección: Puedo describir cómo un servidor convierte muchas peticiones en lotes.

Lección de 70 min7 comandosLaboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

Cincuenta personas preguntan a la vez

Un servidor de modelos es un programa que mantiene un modelo en memoria y responde a mucha gente. Pone las peticiones en una cola y las agrupa en lotes.

Importa porque un chip que atiende a una persona cada vez deja esperando a las demás. Agrupar es la manera de que un servidor siga rápido con la sala llena.

Al final de esta lección

Nota

Puedo describir cómo un servidor convierte muchas peticiones en lotes.

Palabras clave

PalabraQué significa
Colapeticiones que esperan en el orden en que llegaron
Lotepeticiones que se responden juntas
Esperatiempo desde que llega hasta que empieza
Primera palabrala espera más lo que tarda el primer token
Caudalcuántas peticiones terminan en un tiempo dado

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una cola alimenta el chip

Las peticiones se unen a una cola. Cuando el chip queda libre, el servidor toma las peticiones que han llegado y las ejecuta juntas como un lote.

En nuestro modelo, un lote cuesta 2 ciclos para empezar más el trabajo de su petición más larga. Añadir una petición corta a un lote casi no cuesta nada.

Cinco peticiones y dos tamaños de lote

Tamaño del loteEsperas (a, b, c, d, e)Espera media
10 5 9 16 148,80
30 5 4 3 53,40

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Dos velocidades: primera palabra y caudal

La primera palabra es la espera más lo que tarda el primer token. Es lo que una persona siente como retraso. El caudal es cuántas peticiones terminan en un tiempo dado. Es lo que paga el dueño.

Un lote sube el caudal. Pero una petición corta de un lote termina cuando termina la más larga, así que una petición larguísima puede frenar a las demás.

Un error frecuente

Advertencia

Mucha gente cree que un lote mayor es siempre mejor. Un lote mayor sube el caudal, pero cada lote dura lo que su petición más larga. Elige el tamaño mirando a la vez las esperas y el caudal.

Escribe el ayudante del modelo, parte 1

Comando
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

Comando
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 simulador de la cola, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const reqs = [[\"a\", 0, 4], [\"b\", 1, 3], [\"c\", 2, 6], [\"d\", 3, 2], [\"e\", 9, 3]];' 'function simulate(list, maxBatch) {' '  const out = [];' '  let time = 0;' '  let next = 0;' '  while (next < list.length) {' '    if (list[next][1] > time) time = list[next][1];' '    const batch = [];' '    while (next < list.length && batch.length < maxBatch && list[next][1] <= time) {' '      batch.push(list[next]);' '      next++;' '    }' > serve.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 simulador de la cola, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' '    const end = time + 2 + Math.max(...batch.map(function (r) { return r[2]; }));' '    batch.forEach(function (r) { out.push({ id: r[0], wait: time - r[1], end: end }); });' '    time = end;' '  }' '  return out;' '}' >> serve.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 simulador de la cola, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function report(maxBatch) {' '  const rows = simulate(reqs, maxBatch);' '  const waits = rows.map(function (r) { return r.wait; });' '  const mean = waits.reduce(function (a, b) { return a + b; }, 0) / waits.length;' '  console.log(\"lote \" + maxBatch + \": esperas \" + waits.join(\" \") + \", media \" + mean.toFixed(2) + \", termina en \" + rows[rows.length - 1].end);' '}' >> serve.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 simulador de la cola, parte 4

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  report(1);' '  report(3);' '  const q = \"En una frase corta, ¿por qué un servidor agrupa las peticiones en un lote?\";' '  const sample = \"Un lote deja que el chip trabaje con varias peticiones a la vez, así se atiende a más gente en el mismo tiempo.\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 60);' '  console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> serve.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 simulador de la cola

Comando
docker exec -w /home/node/project agent node serve.js

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Qué imprime el Run

LíneaQué muestra
lote 1: esperas 0 5 9 16 14, media 8.80 ...Una a una: esperas largas
lote 3: esperas 0 5 4 3 5, media 3.40 ...Agrupadas: esperas más cortas
termina en 28 y 19Toda la cola se despeja antes
el modelo dijo: ...Una frase. Las palabras cambian en cada ejecución

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Sobre este laboratorio y su código: Laboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.