Fünfzig Studierende fragen gleichzeitig
Ein Modellserver ist ein Programm, das ein Modell im Speicher hält und viele Menschen bedient. Er stellt Anfragen in eine Warteschlange und fasst sie zu Stapeln zusammen.
Das ist wichtig, weil ein Chip, der immer nur eine Person bedient, alle anderen warten lässt. Stapeln hält einen Server schnell, wenn der Hörsaal voll ist.
Am Ende dieser Lektion
Notiz
Ich kann beschreiben, wie ein Server viele Anfragen zu Stapeln macht.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Warteschlange | Anfragen, die in der Reihenfolge ihres Eintreffens warten |
| Stapel | Anfragen, die gemeinsam beantwortet werden |
| Wartezeit | Zeit vom Eintreffen bis zum Start |
| Zeit bis zum ersten Wort | Wartezeit plus die Zeit für das erste Token |
| Durchsatz | wie viele Anfragen in einer festen Zeit fertig werden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Warteschlange füttert den Chip
Anfragen reihen sich in eine Warteschlange ein. Ist der Chip frei, nimmt der Server die eingetroffenen Anfragen und führt sie gemeinsam als einen Stapel aus.
In unserem Modell kostet ein Stapel 2 Takte zum Start plus die Arbeit seiner längsten Anfrage. Eine kurze Anfrage zu einem Stapel hinzuzufügen kostet daher fast nichts.
Dieselben fünf Anfragen, zwei Stapelgrößen
| Stapelgröße | Wartezeiten (a, b, c, d, e) | Mittlere Wartezeit |
|---|---|---|
| 1 | 0 5 9 16 14 | 8,80 |
| 3 | 0 5 4 3 5 | 3,40 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zwei Geschwindigkeiten: erstes Wort und Wörter je Sekunde
Die Zeit bis zum ersten Wort ist die Wartezeit plus die Zeit für das erste Token. Eine Person erlebt sie als Verzögerung. Der Durchsatz sagt, wie viele Anfragen in einer festen Zeit fertig werden. Ihn bezahlt der Betreiber.
Ein Stapel erhöht den Durchsatz. Aber eine kurze Anfrage im Stapel endet erst, wenn die längste endet, eine sehr lange Anfrage kann also die übrigen bremsen.
Ein häufiger Fehler
Warnung
Viele glauben, ein größerer Stapel sei immer besser. Ein größerer Stapel erhöht den Durchsatz, aber jeder Stapel dauert so lange wie seine längste Anfrage. Wählen Sie die Größe, indem Sie Wartezeiten und Durchsatz zusammen beobachten.
Modell-Helfer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modell-Helfer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' 'module.exports = { fragen };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warteschlangen-Simulator schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const anfragen = [[\"a\", 0, 4], [\"b\", 1, 3], [\"c\", 2, 6], [\"d\", 3, 2], [\"e\", 9, 3]];' 'function simulieren(liste, maxStapel) {' ' const aus = [];' ' let zeit = 0;' ' let naechste = 0;' ' while (naechste < liste.length) {' ' if (liste[naechste][1] > zeit) zeit = liste[naechste][1];' ' const stapel = [];' ' while (naechste < liste.length && stapel.length < maxStapel && liste[naechste][1] <= zeit) {' ' stapel.push(liste[naechste]);' ' naechste++;' ' }' > server.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warteschlangen-Simulator schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const ende = zeit + 2 + Math.max(...stapel.map(function (a) { return a[2]; }));' ' stapel.forEach(function (a) { aus.push({ id: a[0], warten: zeit - a[1], ende: ende }); });' ' zeit = ende;' ' }' ' return aus;' '}' >> server.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warteschlangen-Simulator schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function bericht(maxStapel) {' ' const zeilen = simulieren(anfragen, maxStapel);' ' const warten = zeilen.map(function (z) { return z.warten; });' ' const mittel = warten.reduce(function (a, b) { return a + b; }, 0) / warten.length;' ' console.log(\"Stapel \" + maxStapel + \": Wartezeiten \" + warten.join(\" \") + \", Mittel \" + mittel.toFixed(2) + \", fertig bei \" + zeilen[zeilen.length - 1].ende);' '}' >> server.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warteschlangen-Simulator schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' bericht(1);' ' bericht(3);' ' const q = \"In einem kurzen Satz: Warum fasst ein Server Anfragen zu einem Stapel zusammen?\";' ' const probe = \"Ein Stapel lässt den Chip mehrere Anfragen gleichzeitig bearbeiten, also werden in derselben Zeit mehr Menschen bedient.\";' ' const r = await fragen([{ role: \"user\", content: q }], probe, 60);' ' console.log(\"Das Modell sagte: \" + r.text);' '}' 'main();' >> server.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warteschlangen-Simulator ausführen
docker exec -w /home/node/project agent node server.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was der Run druckt
| Zeile | Was sie zeigt |
|---|---|
| Stapel 1: Wartezeiten 0 5 9 16 14, Mittel 8.80 ... | Einzeln: lange Wartezeiten |
| Stapel 3: Wartezeiten 0 5 4 3 5, Mittel 3.40 ... | Gebündelt: kürzere Wartezeiten |
| fertig bei 28 und 19 | Die ganze Schlange ist früher abgearbeitet |
| Das Modell sagte: ... | Ein Satz. Die Worte ändern sich bei jedem Lauf |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.