Kleinere Zahlen, kleineres Modell
Ein Modell zu quantisieren heißt, jede seiner Zahlen mit weniger Bit zu speichern, damit es weniger Speicher braucht. Der Preis ist, dass jede Zahl gerundet wird.
Das ist wichtig, weil Runden der Weg ist, ein großes Modell auf einen kleinen Rechner zu pressen. Sie sollten wissen, was das Pressen kostet, bevor Sie dem Ergebnis trauen.
Am Ende dieser Lektion
Notiz
Ich kann sagen, was verloren geht, wenn Zahlen kleiner werden.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Quantisieren | Zahlen auf wenige feste Stufen runden |
| Stufe | einer der Werte, auf die eine Zahl gerundet wird |
| Skala | der größte Betrag in der Tabelle |
| Fehler | der Abstand zwischen einer Zahl und ihrer gerundeten Kopie |
| Ausreißer | ein Wert, der viel größer ist als die übrigen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Weniger Bit heißt weniger Stufen
Mit 8 Bit kann eine Zahl auf 255 Stufen liegen. Mit 4 Bit sind es nur 15, mit 2 Bit nur 3. Jede Zahl wandert zur nächsten Stufe.
Zum Wählen der Stufen teilen Sie jeden Wert durch die Skala (den größten Betrag), multiplizieren mit der obersten Stufe und runden. Um eine Zahl zurückzubekommen, kehren Sie die Schritte um.
Acht Zahlen bei vier Genauigkeiten
| Bit | Stufen | Behaltene ganze Zahlen | Schlimmster Fehler |
|---|---|---|---|
| 8 | 255 | 127 -59 10 71 -124 44 -7 90 | 0,0031 |
| 4 | 15 | 7 -3 1 4 -7 2 0 5 | 0,0586 |
| 3 | 7 | 3 -1 0 2 -3 1 0 2 | 0,12 |
| 2 | 3 | 1 0 0 1 -1 0 0 1 | 0,42 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wo Runden am meisten wehtut
Kleine Zahlen leiden zuerst. Bei 4 Bit wurde der Wert -0,05 zu 0 und war damit verloren. Bei 2 Bit wurden vier der acht Zahlen zu 0.
Ein einziger Ausreißer schadet allen. Ist ein Wert 9,0, dann ist die Skala 9,0, jede Stufe liegt weit auseinander, und alle kleinen Zahlen runden auf 0.
Ein häufiger Fehler
Warnung
Viele glauben, weniger Bit mache alles nur ein wenig unschärfer. Es ist nicht gleichmäßig. Kleine Zahlen können verschwinden, und ein Ausreißer kann die ganze Tabelle verderben. Messen Sie immer den Fehler, bevor Sie einer quantisierten Tabelle trauen.
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.
Quantisierer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const werte = [0.9, -0.42, 0.07, 0.5, -0.88, 0.31, -0.05, 0.64];' 'function quantisieren(liste, bits) {' ' const spitze = Math.pow(2, bits - 1) - 1;' ' const skala = Math.max(...liste.map(Math.abs));' ' return liste.map(function (w) { return Math.floor(w / skala * spitze + 0.5); });' '}' > quant.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.
Quantisierer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function wiederherstellen(q, liste, bits) {' ' const spitze = Math.pow(2, bits - 1) - 1;' ' const skala = Math.max(...liste.map(Math.abs));' ' return q.map(function (n) { return n * skala / spitze; });' '}' >> quant.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.
Quantisierer schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function schlimmster(liste, bits) {' ' const zurueck = wiederherstellen(quantisieren(liste, bits), liste, bits);' ' let s = 0;' ' liste.forEach(function (w, i) { s = Math.max(s, Math.abs(w - zurueck[i])); });' ' return s;' '}' >> quant.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.
Quantisierer schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const bits of [8, 4, 3, 2]) {' ' console.log(bits + \" Bit: \" + quantisieren(werte, bits).join(\" \") + \" | schlimmster Fehler \" + schlimmster(werte, bits).toFixed(4));' ' }' ' console.log(\"mit einer 9.0 dazu, 4 Bit, schlimmster Fehler \" + schlimmster(werte.concat([9.0]), 4).toFixed(4));' ' const q = \"In einem kurzen Satz: Was geht verloren, wenn Zahlen mit weniger Bit gespeichert werden?\";' ' const probe = \"Jede Zahl wird auf eine nahe Stufe gerundet, also gehen kleine Unterschiede zwischen den Zahlen verloren.\";' ' const r = await fragen([{ role: \"user\", content: q }], probe, 60);' ' console.log(\"Das Modell sagte: \" + r.text);' '}' 'main();' >> quant.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.
Quantisierer ausführen
docker exec -w /home/node/project agent node quant.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 |
|---|---|
| 8 Bit: ... schlimmster Fehler 0.0031 | Fast nichts geht verloren |
| 4 Bit: 7 -3 1 4 -7 2 0 5 ... | Aus 0,05 wurde 0 |
| 2 Bit: ... schlimmster Fehler 0.4200 | Die meisten kleinen Werte sind weg |
| mit einer 9.0 dazu ... | Ein Ausreißer macht den Fehler groß |
| Das Modell sagte: ... | Ein Satz. Die Worte ändern sich bei jedem Lauf |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.