Das Zauberwort für eine dramatische Kostenreduktion bei LLM Inference lautet: Caching. Ähnlich wie beim Caching anderer Daten in Computersystemen geht es auch hier um das temporäre Zwischenspeichern von oft gebrauchten Informationen. Bei LLMs geht es um das Zwischenspeichern von Matrixmultiplikationen.
LLMs und Caching
Eine detaillierte und theoretisch tiefgehende Erklärung wie genau das Caching bei LLMs funktioniert, würde hier den Rahmen des Artikels sprengen. Daher hier der Versuch einer abstrakten, vereinfachten Erklärung.
Betrachtet man die Funktionsweise von LLMs, so lesen diese den eingegebenen Kontext ein, um daraus folgend das nächste Token zu bestimmen. Dieses neue Token wird dann dafür genutzt, weitere Multiplikationen durchzuführen und zu weiteren neuen Token zu gelangen.
Schickt man nun die gleiche Anfrage erneut, wird auch das Ergebnis der Matrixmultiplikation für das erste Token das gleiche sein, aber auch Zwischenschritte davor haben die gleichen Ergebnisse. Dies führt dazu, dass eine strikte Erweiterung des Kontexts immer zu den gleichen Teilergebnissen in den Matrixmultiplikationen führt. In Abbildung 1 wird dies veranschaulicht.
Der selbe Kontext, führt bei der Berechnung immer zu gleichen Zwischenergebnissen. Dies können wir nutzen, um Berechnungsschritte zu sparen.
Bei einem einfachen Chatverlauf baut sich so gezwungenermaßen der Kontext Stück für Stück auf und die einzelnen Teilergebnisse sind immer gleich und so kann das Ergebnis der letzten Berechnung als Ausgangsbasis dafür genutzt werden, neue Tokens schneller zu bestimmen.
Prompt und Context Engineering unter Beachtung von Caching
Zur vereinfachten Visualisierung bietet OpenAI eine sehr schöne Grafik an:
Quelle: https://platform.openai.com/docs/guides/prompt-caching
So ist es nicht entscheidend, wie viel des Kontexts übereinstimmt, die entscheidende Eigenschaft ist, dass das Präfix stimmt. Die Abbildung zeigt, dass beim Cache Miss zwar ein Großteil des Kontexts übereinstimmen kann, aber wenn nur das erste Token unterschiedlich ist, reicht dies, um eine komplett neue Matrixmultiplikation zu erfordern. Beim Cache-Hit ist zwar das Ende des Kontexts ein anderes, der Anfang ist aber gleich, dadurch können die gleichen Zwischenergebnisse genutzt werden. Daraus folgende, ist einer der gravierendsten Fehler beim Prompting, um für ein gutes Logging als erstes in den Kontext einen Timestamp hinzuzufügen.
Schaue ich zurück auf einen meiner letzten Use Cases, bei denen wir LLMs genutzt haben, so war die Aufgabe, Daten aus einem Ausgangsformat in ein Zielformat zu transformieren. Schreibt man dies wörtlich auf, dann ergibt sich abstrakt folgende Grafik:
Ein einfaches Umstrukturieren ermöglicht es, den Kontext länger identisch zu halten. Das Zielformat A hatte in unserem Projekt mehr als 1000 Token, während der Datenpunkt, der sich immer geändert hat, nur 100 Tokens lang war.
Der umstrukturierte Prompt hat die gleichen Informationen beinhaltet und auch die Ergebnisse nicht verändert, wir konnten aber auf die Vorteile von Caching zurückgreifen.
Caching bei den Hyperscalern
Was sind nun diese Vorteile des Caching? Der Titel dieses Artikels legt es nahe: die großen Cloud-Anbieter geben euch (zum Zeitpunkt des Schreibens dieses Artikels) eine Kostenreduktion von bis zu 90 % je nach Anbieter und Modell.
Der infrastrukturelle Aufwand, der hierfür betrieben wird, zeigt auch nochmal deutlich, wie signifikant diese Eigenschaft ist. Denn um davon zu profitieren, müssen die Requests des Nutzers gezielt zu den selben Server-Teilen geroutet werden, da die Ergebnisse der Matrixmultiplikation gefunden werden müssen. Hierfür wird ein Hash des Prefixes gespeichert und beim Routing verwendet. Die Cache-Ergebnisse werden meist im Minutenbereich vorgehalten, die sich bei einem Treffer erneuern.
Betrachtet man nun gewöhnliche Use Cases die heute mit LLMs umgesetzt werden, so wird auch klar, warum sich dieser Aufwand und die Kostenreduktion für die Anbieter lohnt. Bei einer möglichen Kontextlänge von bis zu einer Millionen Token mancher Modelle (zum Vergleich, die gesamte Herr der Ringe Trilogie im Englischen hat etwas mehr als 360.000 Token), werden diese Systeme genutzt, um große Textdateien zu analysieren und darauf zu antworten. Stelle ich nun drei Fragen zu derart großen Dateien, würde, ohne Caching, jedes Mal der gesamte Kontext berechnet werden müssen. Caching umgeht das ganze, da das Ergebnis des gesamten Präfix bereits vorbereitet ist. Eine immense Reduktion von Strom und Zeit. Da kommen wir auch zum zweiten Vorteil. Die Zeit bis zum ersten berechneten Token reduziert sich somit auch signifikant, wodurch schnellere Ergebnisse erzielt werden können.
Zwar zahlt man für Token, die nicht mehr im Cache liegen (also der Teil, der anders ist bei der neuen Anfrage), sowie den Output, weiterhin volle Koste. Wenn aber Use Cases wie weiter oben beschrieben, oder Agentensysteme die ihren Kontext sehr schnell iterativ vergrößern, um komplexe Aufgaben zu lösen, vorliegen, dann ist meist der Input in das LLM der größte Kostentreiber.
Unten in den weiterführenden Links sind die passenden Artikel der Hyperscaler aufgelistet, die erklären, wie man Caching auf deren Plattformen am besten nutzen kann. Auch gibt es die Möglichkeit in vLLM, also mit selbstgehosteten Modellen, auf diese Eigenschaft zuzugreifen, um so die eigenen Stromkosten, aber auch Zeitaufwände zu reduzieren.
Schluss
Zusammengefasst lässt sich also sagen, dass ein bewusstes Prompting genutzt werden kann, um Kosten signifikant zu reduzieren. Hierfür muss man manchmal auch intuitive Ideen zum Aufbau eines Prompts neu überdenken, um sicherzustellen, dass die Reihenfolge des Textes möglichst lang identisch bleibt. So lassen sich dann Kosten signifikant reduzieren, aber auch schnellere Ergebnisse erzielen. Das ganze meist auch ohne irgendwelche Effekte auf die Qualität der Antworten.
Weitere Informationen:
Micrsoft Azure: https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/prompt-caching
AWS: https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html
GoogleCloud: https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-overview
vLLM: https://docs.vllm.ai/en/stable/design/prefix_caching.html
Weitere Beiträge
von Daniel Töws
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Blog-Autor*in
Daniel Töws
Software Developer
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.