So feintunen Sie ein Llama-2 (7B), um ChatGPT zu schlagen

Auf Geschwindigkeit ausgelegt: ~ 10 ms Latenz, auch unter Last
Unglaublich schnelle Methode zum Erstellen, Verfolgen und Bereitstellen Ihrer Modelle!
- Verarbeitet mehr als 350 RPS auf nur 1 vCPU — kein Tuning erforderlich
- Produktionsbereit mit vollem Unternehmenssupport
Large Language Models (LLMs) werden immer leistungsfähiger und für eine Vielzahl von Aufgaben eingesetzt, darunter Chatbots, Textgenerierung und Frage-Antwort-Systeme. Das Training von LLMs kann jedoch teuer und ressourcenintensiv sein. In diesem Blogbeitrag zeigen wir Ihnen, wie Sie ein kleineres LLM (7B) feintunen können, um eine bessere Leistung als ChatGPT zu erzielen.
Fine-Tuning ist ein Prozess, bei dem ein LLM auf einem spezifischen Datensatz trainiert wird, um seine Leistung bei einer bestimmten Aufgabe zu verbessern. In diesem Fall werden wir ein 7B-LLM feintunen, um zwei Zahlen zu multiplizieren.
Beginnen wir also mit der Leistung verschiedener Large Language Models bei einer einfachen Multiplikationsaufgabe: 458*987 = 452046.
Zuerst schauen wir uns das kürzlich von Meta veröffentlichte Modell Llama-2-7B an. Wir haben Llama-2 auf TrueFoundry deployed und es mit den LangChain-Integrationen von TrueFoundry ausprobiert. Hier ist das Ergebnis dafür.

Wie wir deutlich sehen können, schneidet dieses Modell bei der Aufgabe nicht gut ab (was angesichts der Größe des Modells auch zu erwarten ist). Schauen wir uns an, wie die State-of-the-Art-Modelle bei derselben Aufgabe abschneiden:
Schauen wir uns das Ergebnis von ChatGPT (GPT-3.5 Turbo) an:

Nun liegt die Antwort (451.086) sehr nahe am tatsächlichen Ergebnis von 452.046, aber die Antwort ist nicht korrekt.
Versuchen wir es mit einem anderen Prompt (um eine schrittweise Berechnung durchzuführen und zu sehen, was passiert):
0:00/1×
ChatGPT mit individuellem Prompt für Multiplikation
Aber erneut kommt es zu einem falschen Ergebnis: 450.606 🤨
Versuchen wir schließlich das State-of-the-Art-Modell (GPT-4) und prüfen wir, wie es bei dieser Aufgabe abschneidet:

Es ist sehr nah am richtigen Ergebnis (452.046) und könnte für jeden korrekt aussehen. Aber eindeutig ist die Antwort falsch.
Warum schneiden LLMs bei einfachen Multiplikationsaufgaben schlecht ab?
Die Antwort auf diese Frage ist sehr einfach. Sie sind nicht dafür "trainiert".
LLMs werden auf riesigen Datensätzen aus Text und Code trainiert, aber diese Daten sind nicht immer so strukturiert, dass sie für mathematische Überlegungen hilfreich sind. Beispielsweise enthalten die Daten möglicherweise keine expliziten Darstellungen mathematischer Konzepte wie Addition, Subtraktion, Multiplikation und Division. Dies kann es für LLMs schwierig machen, zu lernen, wie diese Operationen korrekt ausgeführt werden.
Wir haben uns also gefragt, ob es möglich ist, ein LLM für die Ausführung mathematischer Operationen zu trainieren? Wir haben ein Experiment durchgeführt, und die Ergebnisse waren sehr vielversprechend!
Feintunen von Llama-2 7B zum Erlernen der Multiplikation
Kuratieren eines Datensatzes
Zu Beginn haben wir einen Datensatz mit 40.000 Zeilen an Prompts und Anweisungen kuratiert. Wir haben versucht, die genauen Schritte der schriftlichen Multiplikationsmethode nachzuahmen. Dabei werden Multiplikand und Multiplikator in ihre einzelnen Ziffern zerlegt, dann jede Ziffer des Multiplikanden mit jeder Ziffer des Multiplikators multipliziert und die Ergebnisse entsprechend ihren Stellenwerten platziert. Schließlich werden alle einzelnen Produkte addiert, um das Endergebnis zu erhalten.
Hier ist ein Beispiel-Prompt:
You are a helpful assistant providing detailed answers to multiplication questions. Ensure you provide a thorough explanation using the long multiplication method for the math problem given below.
If you don't know the answer to a question, please don't share false information. What is 5244 * 1932?
Und hier ist eine Beispiel-Antwort:
Here are the steps for multiplying 5244 * 1932 using the long multiplication method.
Step 1: Break 5244 into its individual digits: 5 (thousands place), 2 (hundreds place), 4 (tens place), and 4 (ones place).
Step 2: Similarly, break 1932 into its individual digits: 1 (thousands place), 9 (hundreds place), 3 (tens place), and 2 (ones place).
- 4 (from 1 place of first number) * 2 (from 1 place of second number) = 8 -> Shift it 0 places to the left (because we are multiplying with the 1 place of the second number) to get 8
- 4 (from 1 place of first number) * 3 (from 10 place of second number) = 12 -> Shift it 1 places to the left (because we are multiplying with the 10 place of the second number) to get 120
- 4 (from 1 place of first number) * 9 (from 100 place of second number) = 36 -> Shift it 2 places to the left (because we are multiplying with the 100 place of the second number) to get 3600
- 4 (from 1 place of first number) * 1 (from 1000 place of second number) = 4 -> Shift it 3 places to the left (because we are multiplying with the 1000 place of the second number) to get 4000
- 4 (from 10 place of first number) * 2 (from 1 place of second number) = 8 -> Shift it 1 places to the left (because we are multiplying with the 1 place of the second number) to get 80
- 4 (from 10 place of first number) * 3 (from 10 place of second number) = 12 -> Shift it 2 places to the left (because we are multiplying with the 10 place of the second number) to get 1200
- 4 (from 10 place of first number) * 9 (from 100 place of second number) = 36 -> Shift it 3 places to the left (because we are multiplying with the 100 place of the second number) to get 36000
- 4 (from 10 place of first number) * 1 (from 1000 place of second number) = 4 -> Shift it 4 places to the left (because we are multiplying with the 1000 place of the second number) to get 40000
- 2 (from 100 place of first number) * 2 (from 1 place of second number) = 4 -> Shift it 2 places to the left (because we are multiplying with the 1 place of the second number) to get 400
- 2 (from 100 place of first number) * 3 (from 10 place of second number) = 6 -> Shift it 3 places to the left (because we are multiplying with the 10 place of the second number) to get 6000
- 2 (from 100 place of first number) * 9 (from 100 place of second number) = 18 -> Shift it 4 places to the left (because we are multiplying with the 100 place of the second number) to get 180000
- 2 (from 100 place of first number) * 1 (from 1000 place of second number) = 2 -> Shift it 5 places to the left (because we are multiplying with the 1000 place of the second number) to get 200000
- 5 (from 1000 place of first number) * 2 (from 1 place of second number) = 10 -> Shift it 3 places to the left (because we are multiplying with the 1 place of the second number) to get 10000
- 5 (from 1000 place of first number) * 3 (from 10 place of second number) = 15 -> Shift it 4 places to the left (because we are multiplying with the 10 place of the second number) to get 150000
- 5 (from 1000 place of first number) * 9 (from 100 place of second number) = 45 -> Shift it 5 places to the left (because we are multiplying with the 100 place of the second number) to get 4500000
- 5 (from 1000 place of first number) * 1 (from 1000 place of second number) = 5 -> Shift it 6 places to the left (because we are multiplying with the 1000 place of the second number) to get 5000000
Now, add all these results together:
The sum of 8 + 120 + 3600 + 4000 + 80 + 1200 + 36000 + 40000 + 400 + 6000 + 180000 + 200000 + 10000 + 150000 + 4500000 + 5000000 = 10131408.
Anschließend haben wir ein Python-Skript geschrieben, das Prompt-Antwort-Paare generiert, indem es zufällig zwei Ziffern für die Multiplikation auswählt. So haben wir einen Datensatz mit 40.000 Zeilen kuratiert.
Feintunen des Modells
Sobald der Datensatz bereit ist, müssen wir das Modell feintunen.
Als Basismodell verwenden wir die von Meta feingetunte Chat-Variante (7 Milliarden Parameter) von Llama-2.
Wir haben das Fine-Tuning mittels QLoRA Fine-Tuning unter Verwendung der Bibliotheken BitsAndBytes und PEFT durchgeführt. Hier ist die LoRA-Konfiguration, die wir verwendet haben:
LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
],
)
Das Training auf einer A100 40GB GPU-Maschine dauerte für einen Datensatz von 40.000 Zeilen etwa 8 Stunden.
Schließlich haben wir das feingetunte Modell erneut auf TrueFoundry deployed, und hier sind die Ergebnisse:

Endlich!! Wir können sehen, dass das feingetunte Modell in der Lage ist, das Ergebnis korrekt zu berechnen.
Fazit
Obwohl Arithmetik keine Aufgabe ist, für die man typischerweise ein LLM nutzt, zeigt dieses Beispiel, wie ein "kleines" LLM (7B Parameter), das ordnungsgemäß für eine spezifische Aufgabe feingetunt wurde, die "großen" LLMs (wie GPT-3.5 Turbo mit 175B Parametern und GPT-4) bei einer spezialisierten Aufgabe übertreffen kann.
Die kleineren, feingetunten Modelle sind günstig im Inference-Betrieb, besser in spezialisierten Aufgaben und können einfach in Ihrer eigenen Cloud deployed werden!
Wir haben einen ausführlichen Blogbeitrag über das Fine-Tuning von Llama 2 geschrieben
TrueFoundry AI Gateway bietet eine Latenz von ~3—4 ms, verarbeitet mehr als 350 RPS auf einer vCPU, skaliert problemlos horizontal und ist produktionsbereit, während LiteLM unter einer hohen Latenz leidet, mit moderaten RPS zu kämpfen hat, keine integrierte Skalierung hat und sich am besten für leichte Workloads oder Prototyp-Workloads eignet.


















%20(28).webp)



.webp)
.webp)
.png)

.png)
.png)
.png)
.png)
.png)
.webp)
.webp)






