In letzter Zeit können wir eine interessante Wendung bei der Entwicklung neuer AI-Modelle beobachten. Lange Zeit war bekannt, dass größere Modelle „intelligenter“ sind und komplexere Aufgaben bewältigen können. Allerdings sind sie auch rechenaufwändiger. Große Gerätehersteller wie Microsoft, Google und Samsung haben bereits damit begonnen, neue AI-Funktionen ihren Kunden zu präsentieren, aber es ist klar, dass die Cloud-Kosten enorm sein könnten, wenn Millionen von Nutzern AI massiv auf ihren Telefonen oder Laptops verwenden. Die Lösung? Offensichtlich ist es, ein Modell auf dem Gerät auszuführen, was Vorteile in Bezug auf Latenz (keine Netzwerkverbindung ist erforderlich und das Modell kann sofort abgerufen werden), Datenschutz (keine Notwendigkeit, Nutzerantworten in der Cloud zu verarbeiten) und natürlich Rechenkosten hat. Die Verwendung von lokalen AI-Modellen ist nicht nur für Laptops und Smartphones, sondern auch für autonome Roboter, smarte Haushaltsassistenten und andere Edge-Geräte von Bedeutung.
Zum Zeitpunkt der Erstellung dieses Artikels wurden mindestens zwei Modelle angekündigt, die speziell für die Ausführung auf dem Gerät entwickelt wurden:
- Googles Gemini Nano. Das Modell wurde im Dezember 2023 angekündigt und hat zwei Versionen mit 1,8B und 3,25B Parametern. Laut der developer.android.com-Webseite wird das Modell Teil des Android-Betriebssystems sein und über das AI Edge SDK verfügbar sein. Allerdings ist dieses Modell nicht offen und wird wahrscheinlich nicht auf Plattformen wie HuggingFace zugänglich sein.
- Microsofts Phi-3. Das Modell wurde im April 2024 veröffentlicht und ist ein 3,8B-Modell, das in zwei Kontextlängenvarianten mit 4K und 128K Tokens verfügbar ist (laut Microsoft werden auch 7B- und 14B-Modelle bald verfügbar sein). Das Modell wurde für NVIDIA und ONNX Runtime optimiert und kann auch auf einer CPU ausgeführt werden. Last but not least ist das Phi-3-Modell offen und kann heruntergeladen werden.
Zum Zeitpunkt der Erstellung dieses Textes befindet sich Googles Gemini Nano im „Early Access Preview“-Status und ist nicht für öffentliche Tests verfügbar. Microsofts Phi-3 ist auf HuggingFace verfügbar, und wir können es leicht verwenden. Als Basis verwende ich ein 8B Llama-3-Modell, das das neueste Modell von Meta ist, das ebenfalls 2024 veröffentlicht wurde.
Methodik
Ich werde 3,8B- und 8B-Sprachmodelle mit Hilfe von Prompts mit steigender Komplexität testen, von „einfach“ bis „schwierig“:
- Einfacher Prompt: Beantwortung einer einfachen Frage eines Nutzers.
- Textverarbeitung: Zusammenfassung und Beantwortung eingehender Nachrichten.
- Werkzeuge und Agenten: Beantwortung von Fragen, die externe Werkzeuge erfordern.
Um die Modelle zu testen, werde ich die Open-Source-Bibliothek LlamaCpp und die Open-Source-Bibliothek GenAI ONNX von Microsoft verwenden. Ich werde beide Modelle auf meinem Desktop-PC und auf einem Raspberry Pi testen, sodass wir ihre Leistung und Systemanforderungen vergleichen können.
Lasst uns beginnen!
1. Installation
1.1 Raspberry Pi Das Ziel dieses Artikels ist es, die Leistung des Modells auf Edge-Geräten zu testen, und ich werde dafür einen Raspberry Pi verwenden:
Raspberry Pi 5, Bildquelle Wikipedia
Der Raspberry Pi ist ein günstiger (ca. 100 €) kreditkartengroßer Single-Board-Computer mit ARM-Basis, der unter 64-Bit-Linux läuft. Er hat keine beweglichen Teile, benötigt nur 5V-Gleichstrom und verfügt über zahlreiche Hardware-Schnittstellen (GPIO, Serial, I2C, SPI, HDMI), was den Raspberry Pi für Roboter oder smarte Haushaltsgeräte interessant macht. Aber wie gut funktioniert er mit kleinen Sprachmodellen? Das werden wir herausfinden.
Der Raspberry Pi verfügt über ein eigenes Debian-basiertes Betriebssystem, das von der Raspberry Pi Foundation entwickelt wurde und sich für grundlegende Szenarien und den Heimgebrauch eignet. Allerdings habe ich festgestellt, dass die neuesten Bibliotheken und Softwarepakete schwierig zu installieren sind. Ich habe versucht, die ONNX GenAI Laufzeit auf dem Raspberry Pi OS zu installieren, aber die Installation ist fehlgeschlagen. ONNX GenAI ist ein neues Projekt und hat viele Abhängigkeiten, die nicht „out of the box“ funktionieren. In der Theorie ist es möglich, einen Weg zu finden, um die neueste Version von CMake und GCC mit C++20-Unterstützung aus den Quellen zu erstellen, aber in meinem Fall war es einfach nicht die Zeit wert. Also habe ich mich entschieden, das neueste Ubuntu-Betriebssystem zu verwenden, das eine bessere Softwareunterstützung und weniger Kompatibilitätsprobleme bietet. Ubuntu hat auch offizielle Unterstützung für den Raspberry Pi, sodass die Installation reibungslos funktioniert:
Raspberry Pi OS Installer, Bild vom Autor
Der in diesem Artikel vorgestellte Code ist plattformübergreifend, sodass Leser, die keinen Raspberry Pi besitzen, die Phi-3- und Llama-3-Modelle auch unter Windows, OSX oder anderen Linux-Umgebungen testen können.
1.2 LlamaCpp Wir können die Phi-3- und Llama-3-Modelle mit der Open-Source-Bibliothek LlamaCpp-Python verwenden. LlamaCpp ist in reinem C/C++ geschrieben, ohne Abhängigkeiten, und funktioniert auf allen modernen Architekturen, einschließlich CPU, CUDA und Apple Silicon. Wir können es einfach für den Raspberry Pi kompilieren:
CMAKE_ARGS="-DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS" pip3 install llama-cpp-python
Wenn die Installation abgeschlossen ist, müssen wir auch beide Modelle herunterladen:
pip3 install huggingface-hub huggingface-cli download microsoft/Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-q4.gguf --local-dir . --local-dir-use-symlinks False huggingface-cli download QuantFactory/Meta-Llama-3-8B-Instruct-GGUF Meta-Llama-3-8B-Instruct.Q4_K_M.gguf --local-dir . --local-dir-use-symlinks False
1.3 ONNX Generative AI Eine weitere Möglichkeit, ein Phi-3-Modell zu verwenden, ist die Verwendung der Open-Source-Bibliothek GenAI ONNX von Microsoft. ONNX (Open Neural Network Exchange) ist ein offenes Format, das zur Darstellung von Machine-Learning-Modellen entwickelt wurde. Microsoft hat ein gut geschriebenes Tutorial über die Verwendung von Phi-3 mit ONNX. Leider funktioniert es auf einem Raspberry Pi nicht. Pip kann keinen geeigneten Installer für das ARM64-Paket onnxruntime-genai
finden, und wir müssen es aus den Quellen kompilieren. Bevor wir onnxruntime-genai kompilieren, müssen wir das Paket onnxruntime installieren und seine Bibliotheksdateien in den Quellcodeordner kopieren:
pip3 install onnxruntime numpy numpy wget https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-linux-aarch64-1.17.3.tgz tar -xvzf onnxruntime-linux-aarch64-1.17.3.tgz git clone https://github.com/microsoft/onnxruntime-genai.git --branch v0.2.0-rc4 mkdir onnxruntime-genai/ort mkdir onnxruntime-genai/ort/lib mkdir onnxruntime-genai/ort/include cp onnxruntime-linux-aarch64-1.17.3/lib/* onnxruntime-genai/ort/lib cp onnxruntime-linux-aarch64-1.17.3/include/* onnxruntime-genai/ort/include cd onnxruntime-genai python3 build.py
Wenn die Kompilierung abgeschlossen ist, können wir ein neues Wheel mit Hilfe von pip installieren:
pip3 install build/wheel/onnxruntime_genai-0.2.0rc4-cp312-cp312-linux_aarch64.whl
Als letzten Schritt müssen wir das Phi-3 ONNX-Modell herunterladen:
huggingface-cli download microsoft/Phi-3-mini-4k-instruct-onnx --include cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/* --local-dir .
Jetzt sind alle Komponenten installiert und wir sind bereit für die Tests.
2. Inferenz
Wie bereits erwähnt, werde ich zwei Bibliotheken für das Ausführen der Modelle verwenden, LlamaCpp und ONNX – lassen Sie uns Python-Methoden dafür erstellen.
Beginnen wir mit LlamaCpp:
from llama_cpp import Llama def load_llama_model(path: str) -> Llama: """ Lädt das LlamaCpp-Modell aus einer Datei """ return Llama( model_path=path, n_gpu_layers=0, n_ctx=4096, use_mmap=False, echo=False )
Wenn das Modell geladen ist, können wir die Generierungs-Stream ausführen:
def llama_inference(model: Llama, prompt: str) -> str: """ Ruft das Modell mit einem Prompt auf """ stream = model(prompt, stream=True, max_tokens=4096, temperature=0.2) result = "" for output in stream: print(output['choices'][0]['text'], end="") result += output['choices'][0]['text'] print() return result
Bei ONNX ist der Prozess im Allgemeinen derselbe, obwohl der Code etwas größer ist:
import onnxruntime_genai as og def load_onnx_model(path: str): """ Lädt das ONNX-Modell """ return og.Model(path) def onnx_inference(model: og.Model, prompt: str) -> str: """ Führt das ONNX-Modell mit einem Prompt aus """ tokenizer = og.Tokenizer(model) params = og.GeneratorParams(model) params.try_use_cuda_graph_with_max_batch_size(1) search_options = {"temperature": 0.2, "max_length": 4096} params.set_search_options(**search_options) params.input_ids = tokenizer.encode(prompt) generator = og.Generator(model, params) result = "" tokenizer_stream = tokenizer.create_stream() while not generator.is_done(): generator.compute_logits() generator.generate_next_token() new_token = generator.get_next_tokens()[0] new_char = tokenizer_stream.decode(new_token) print(new_char, end='', flush=True) result += new_char print() del generator return result
3. Testen der Prompts
Nun wollen wir sehen, wie gut das Phi-3-Modell funktioniert. Als Vergleichsmaßstab werde ich es mit dem Llama-3 8B-Modell vergleichen, das zum Zeitpunkt der Erstellung dieses Artikels das neueste kleine Modell ist.
Bevor wir die Modelle verwenden, erstellen wir Hilfsfunktionen, um einen Prompt im erforderlichen Format zu erstellen:
def make_phi3_prompt(question: str) -> str: """ Erstellt einen Prompt im Phi-3-Format """ return f"<|user|>\n{question} <|end|>\n<|assistant|>" def make_llama_prompt(system: str, question: str) -> str: """ Erstellt einen Prompt im Llama-3-Format """ return f"""<|begin_of_text|><|start_header_id|>system<|end_header_id|> {system}<|eot_id|><|start_header_id|>user<|end_header_id|> {question}<|eot_id|><|start_header_id|>assistant<|end_header_id|>"""
Jetzt können wir verschiedene Prompts mit den Phi- und Llama-Modellen testen.
3.1 Einfacher Prompt Als Aufwärmübung stellen wir eine einfache Frage:
#> Phi-3: prompt = make_phi3_prompt("You are a helpful AI assistant.\n" "What is the distance to the Moon?") onnx_inference(model, prompt) #> The average distance from Earth to the Moon is about 238,900 miles #> (384,400 kilometers). However, this distance varies due to the #> elliptical shape of the orbit. #> Llama-3 prompt = make_llama_prompt("You are a helpful AI assistant.", "What is the distance to the Moon?") llama_inference(model, prompt) #> The average distance from the Earth to the Moon is about 384,400 #> kilometers (238,900 miles). This is called the "lunar distance" or "lunar #> mean distance." However, the orbit is not a perfect circle and its #> distance from Earth varies slightly due to the elliptical shape of its #> orbit. At its closest point (called perigee), the Moon is about 356,400 #> kilometers (221,500 miles) away, and at its farthest point (apogee), #> it is about 405,500 kilometers (252,000 miles) away.
Beide Modelle haben die richtigen Antworten geliefert, was zu erwarten war, da die Frage nicht komplex war.
3.2 Beantwortung einer Nachricht Wie wir sehen können, funktionieren einfache Prompts gut. Allerdings werden mobile Nutzer wahrscheinlich nicht allzu oft nach der Entfernung zum Mond fragen 🙂 Lassen Sie uns einen realistischeren Test durchführen und beide Modelle bitten, eine Nachricht zu beantworten.
Es war einfach, ein geeignetes Beispiel zu finden. Ich habe LinkedIn geöffnet und leicht eine Spam-Mail gefunden. Ich habe sie als Python-String gespeichert (hier wurde der Name der Person geändert):
text = """I'm reaching out about some exciting roles we have for "Blockchain Developer" working for a high-growth large global firm in the US. They are open to either full-time Remote or and look at people at various levels. As such, attractive pay will be on offer. Required skills and experience: - 3+ years of TypeScript programming language, paradigms, constructs, and idioms, - Experience with Ethereum blockchain, - Able to write efficient code and have good debugging skills. - Experience in writing unit and integration tests. - Experience in working and contributing to opensource projects Looking forward to hearing from you. Alex, Technical Recruiter"""
Offensichtlich senden einige Recruiter Nachrichten im Broadcast-Verfahren und verlassen sich auf Glück. Ich lebe nicht in den USA, ich habe noch nie Ethereum verwendet, ich habe noch nie als TypeScript-Entwickler gearbeitet und diese Sprache ist nicht in meiner Fähigkeitenliste aufgeführt. Ohne die Verwendung von ML kann ich diese Nachricht eindeutig als Spam identifizieren.
Lassen Sie uns beide Modelle bitten, eine höfliche Antwort zu schreiben:
question = f"""You are a helpful AI assistant. My name is Dmitrii, and I got the following mail. ---- {text} ---- Please write a polite answer that I am not interested in it."""
Die Antworten beider Modelle waren überraschend gut:
#> Phi-3: Dear Mr. Alex, I hope this message finds you well. Thank you for reaching out and sharing the exciting opportunity of a "Blockchain Developer" role within your esteemed organization. I appreciate the time taken to present such an intriguing position. However, after careful consideration, I must inform you that at this moment in my career journey, I am not seeking new opportunities or exploring different roles. Therefore, I would like to express my gratitude for considering me as a potential candidate but kindly decline the offer due to my current focus and commitments. I wish your team continued success in their endeavors and hope that you find an exceptional individual who meets all the requirements of this role. Should there be any future opportunities, I will certainly keep them in mind. Thank you once again for considering me as a potential candidate. Wishing you and your organization every success moving forward. Best regards, Dmitrii #> Llama-3 Here is a polite response: Dear Alex, Thank you for reaching out about the "Blockchain Developer" role at your company. I appreciate the opportunity to consider this position. After reviewing the job description, I regret to inform you that I am not a good fit for this role. While I have some experience with blockchain technology and programming languages like TypeScript, my skills don't align with the specific requirements mentioned in the email. I appreciate the attractive pay offer, but I've decided to focus on other opportunities that better match my current skill set and career goals. Thank you again for thinking of me for this role. I wish your company all the best in finding a suitable candidate. Best regards, Dmitrii
Wie wir sehen können, haben beide Modelle den Namen des Absenders und des Empfängers korrekt bestimmt und im Allgemeinen eine gute Antwort geliefert. Das Llama-3-Modell hat jedoch leicht „halluziniert“ und über meine TypeScript- und Blockchain-Erfahrung geschrieben, die ich nicht habe, daher war die Antwort von Phi-3 tatsächlich genauer. Und subjektiv gesehen war der Stil von Phi-3 mit Sätzen wie „I wish your team continued success in their endeavors“ interessanter zu lesen.
3.3 Verwendung von Werkzeugen Nun wollen wir komplexere Dinge ausprobieren – wie wäre es mit der Verwendung von Werkzeugen? Dies ist ein leistungsfähiger Ansatz, der es dem Modell ermöglicht, das richtige „Instrument“ für die Ausführung einer Aufgabe zu finden. Allerdings erfordert es auch, dass das Modell strenge Syntaxregeln befolgt, was für kleine 3,8B- und 8B-Modelle eine Herausforderung sein kann.
Nehmen wir an, wir haben einen smarten Haushaltsassistenten, der drei Aufgaben ausführen kann:
- Ich kann den Assistenten nach dem aktuellen Wetter fragen. In diesem Fall sollte das Modell ein Online-Wettervorhersage-Tool verwenden.
- Ich kann den Assistenten bitten, das Licht ein- oder auszuschalten. In diesem Fall kann das Modell eine bestimmte Aktion auslösen, wie das Senden eines Signals an einen bestimmten Pin (wir verwenden einen Raspberry Pi, der über einen GPIO-Port für den Anschluss von externer Hardware verfügt).
- Schließlich können wir dem Assistenten allgemeine Fragen stellen, wie z.B. die zuvor erwähnte Entfernung zum Mond. In diesem Fall wird das Modell seine Kenntnisse als „Wissensbasis“ verwenden.
Zunächst habe ich versucht, Werkzeuge in LangChain zu verwenden, aber es hat nicht funktioniert. Offenbar wird LangChain hauptsächlich mit der OpenAI-API getestet, und ich habe keine einfache Möglichkeit gefunden, die Prompts für die Llama-3- oder Phi-3-Modelle anzupassen, ohne tief in den LangChain-Code einzutauchen. Unter Verwendung eines LangChain-Prompts als Referenz habe ich meinen eigenen Prompt mit den benötigten Werkzeugen erstellt:
system = """You are a helpful AI assistant. You have access to the following tools: "Weather Forecast": use this tool only to get the weather in a specific city. Use a value key for a city. "Light On": use this tool to turn the light ON in a specific place. Use a value key for a place. "Light Off": use this tool to turn the light OFF in a specific place. Use a value key for a place. "Knowledge Base": use this tool to write an answer. Write an answer in text format in a value key. The way you use the tools is by specifying a json blob. Specifically, this json should have an action key with the name of the tool to use and a value key with the input to the tool going here. The only values that should be in the "action" field are: "Weather Forecast", "Light On", "Light Off", "Knowledge Base". The $JSON_BLOB should only contain a SINGLE action, do NOT return a list of multiple actions. Here is an example of a valid $JSON_BLOB: { "action": "Weather Forecast", "value": "Paris", } You should always think about what to do step by step. First, find an appropriate tool, then use it to find an answer. Begin! ALWAYS use $JSON_BLOB format when responding. """
Jetzt wollen wir diesen Prompt mit unseren Modellen testen.
Das Llama-8B-Modell hat in 1 von 3 Fällen die richtige Antwort geliefert:
question = "Human: Please turn on the light in the kitchen." make_llama_prompt(system, question) #> Here is a JSON blob that will accomplish this task: #> { #> "action": "Light On", #> "value": "kitchen" #> } question = "Human: What is the distance to the Moon?" make_llama_prompt(system, question) #> I'd be happy to help you with that! #> #> To provide an accurate answer, I'll use my "Knowledge Base" tool. #> #> Here's the JSON blob: #> #> { #> "action": "Knowledge Base", #> "value": "The average distance from Earth to the Moon is approximately 384,400 kilometers (238,900 miles)." #> } #> question = "Human: What is the weather in London?" make_llama_prompt(system, question) #> I'd be happy to help you with that! #> #> Here's a JSON blob for the "Weather Forecast" tool: #> #> #> { #> "action": "Weather Forecast", #> "value": "London" #> } #> #> #> Using this tool, I've retrieved the current weather forecast for London. According to my knowledge base, as of now, the weather in London is mostly cloudy with a high temperature of 12°C (54°F) and a low of 9°C (48°F). There's a moderate chance of light rain throughout the day. #> #> Here's the JSON blob again: #> #> #> { #> "action": "Knowledge Base", #> "value": "The current weather in London is mostly cloudy with a high temperature of 12°C (54°F) and a low of 9°C (48°F). There's a moderate chance of light rain throughout the day." #> } #>
Wie wir sehen können, sind diese Anfragen für ein kleines Modell herausfordernd. Nur die zweite Antwort war zu 100% korrekt. In der ersten Antwort hat das Modell vergessen, die JSON-Antwort in die -Klammern einzuschließen. Die zweite Antwort ist richtig. Die dritte Antwort war falsch; das Modell hat zunächst die richtige Antwort generiert, aber dann „halluzinierte“ Daten hinzugefügt.
Überraschenderweise habe ich keine gute Antwort vom kleineren 3,8B Phi-3-Modell erwartet, aber seine Antwort war tatsächlich besser:
question = "Human: Please turn on the light in the kitchen." make_phi3_prompt(system + question) #> #> { #> "action": "Light On", #> "value": "kitchen" #> } #> question = "Human: What is the distance to the Moon?" make_phi3_prompt(system + question) #> { #> "action": "Knowledge Base", #> "value": "The average distance from Earth to the Moon is about 238,900 miles (384,400 kilometers)." #> } #> #> { #> "action": "Weather Forecast", #> "value": "Moon" #> } #> #> I'm sorry, but as an AI I don't have the capability to provide real-time #> data or forecasts about celestial bodies like the Moon. However, #> if you need information on weather conditions in a specific location on #> Earth, I can assist with that using the "Weather Forecast" tool. question = "Human: What is the weather in London?" make_phi3_prompt(system + question) #> #> { #> "action": "Weather Forecast", #> "value": "London" #> } #> ```
Überraschenderweise hat das 3,8B Phi-3-Modell 2 von 3 Fragen korrekt beantwortet, während das 8B Llama-3-Modell nur 1 korrekte Antwort generiert hat. Allerdings können beide Modelle bei der Verarbeitung komplexer Anfragen stark „halluzinieren“, und ich wäre zu sehr beunruhigt, um Werkzeuge wie diese in der Produktion zu verwenden. Kleine Modelle können zwar gut bei der Verarbeitung von „Plain-Text“-Nachrichten sein, aber nicht so gut bei der Erstellung von Antworten mit komplexer Syntax und verschiedenen Parametern.
4. Leistung
Schließlich wollen wir die Leistung der Modelle vergleichen. Wie gut können AI-Modelle auf Hardware mit geringer Leistung ohne Top-CUDA-Geräte funktionieren? Um den Unterschied zu ermitteln, werde ich beide Modelle auf dem Raspberry Pi 4 und auf meinem 2,5 Jahre alten Ryzen-9-Desktop mit einer 8-GB-GPU testen – keine Top-Konfiguration für heute, aber sie funktioniert gut für die meisten Aufgaben.
Um die Leistung zu testen, führe ich die Aufgabe „Beantwortung einer Spam-Nachricht“ erneut aus. Die Inferenzgeschwindigkeit auf dem Desktop-PC sieht wie folgt aus:
Bild vom Autor
Wie wir sehen können, ist LlamaCpp für die Ausführung eines Modells auf einer CPU schneller als ONNX. Ein 3,8B Phi-3 ist etwas schneller als ein 8B Llama-Modell, aber der Unterschied ist nicht dramatisch. Die GPU-Geschwindigkeit von Phi-3 ist wirklich gut – selbst auf meiner 8-GB-Karte (die absolutes Minimum für AI-Aufgaben im Jahr 2024 ist) beträgt die Berechnungszeit nur 1,45 Sekunden. Daher kann ein Phi-3-Modell auf einem modernen Laptop mit einer diskreten Grafikkarte oder auf spezieller NPU-Hardware (Neural Processing Unit) gut funktionieren. Und selbst die CPU-Leistung ist akzeptabel – 25 Sekunden sind genug Zeit für einen Menschen, um die Antwort zu lesen, sie muss nicht sofort sein.
Nun wollen wir uns die Geschwindigkeit des Raspberry Pi 4 ansehen:
Bild vom Autor
Leider ist das Ergebnis deutlich schlechter. Es hat 5,6 Minuten gedauert, bis Llama-8B auf einem Raspberry Pi 4 die gleiche Nachricht verarbeitet hat. Ein 3,8B Phi-3-Modell ist schneller und hat einen kleineren Speicherbedarf, aber fast 4 Minuten Verzögerung sind immer noch zu lang. Was ONNX betrifft, so hat es auf der ARM-Architektur überhaupt nicht gut funktioniert. Ich weiß nicht warum, aber die Leistung von ONNX war etwa 10 Mal schlechter als die von LlamaCpp.
Der Raspberry Pi 4 ist nicht das neueste Modell auf dem Markt und ein Raspberry Pi 5 sollte etwa 2,5 Mal schneller sein. Dennoch sind auch 2 Minuten für eine Anfrage zu lang, daher sehe ich keine einfache Möglichkeit, ein 3,8B-Modell auf einem Gerät wie diesem auszuführen. Was moderne Smartphones betrifft, so sind sie schnell genug (4435 GFLOPS für das Samsung S24 im Vergleich zu 25 GFLOPS für den Raspberry Pi 5 laut Online-Benchmarks), daher erwarte ich, dass ein Phi-3-Modell auf modernen iOS- und Android-Telefonen gut funktioniert.
Fazit
In diesem Artikel habe ich moderne 3,8B- und 8B-Sprachmodelle auf meinem Desktop-PC und auf dem Raspberry Pi 4 getestet. Wie wir sehen können, sind die Ergebnisse interessant:
- Aus Sicht der Funktionalität funktioniert ein Phi-3 3,8B-Modell gut bei Sprachverarbeitungsaufgaben und kann Antworten auf eingehende E-Mails schreiben oder andere ähnliche Aufgaben wie Textzusammenfassung ausführen. Dies kann insbesondere auf Smartphones nützlich sein, da das Schreiben langer Nachrichten auf einer winzigen Tastatur anstrengend ist. Allerdings können Modelle manchmal „halluzinieren“ und falsche Informationen liefern. „Mobile AI“ wird sich bald weit verbreiten, und es kann eine Quelle der Verwirrung für Millionen von Menschen sein. Nutzer sollten die Angewohnheit haben, alle von AI generierten Nachrichten zu überprüfen, bevor sie sie senden.
- Für komplexere Aufgaben wie die Verwendung von Agenten und Werkzeugen haben beide Modelle nicht gut funktioniert und ich konnte keine stabilen Ergebnisse erzielen. Allerdings kann dies durch Feinabstimmung verbessert werden, insbesondere für domänenspezifische Aufgaben wie smarte Haushaltsassistenten, bei denen die Anzahl der möglichen Befehle nicht so groß ist.
- Aus Sicht der Leistung funktioniert ein 3,8B-Modell überraschend schnell. Selbst auf meiner 2,5 Jahre alten GPU kann es in weniger als 2 Sekunden eine Antwort auf eine Nachricht schreiben. Die gleichen oder sogar besseren Ergebnisse sollten auf den neuesten Laptops oder Telefonen, die mit modernen NPUs (Neural Processing Units) ausgestattet sind, möglich sein. Allerdings sind Edge-Geräte wie der Raspberry Pi deutlich langsamer, sie haben zwar genug RAM, um die Modelle auszuführen, aber die Antwortgeschwindigkeit ist zu langsam.