Mesh LLM – Verteiltes KI-Computing auf Basis von iroh
(iroh.computer)- Bündelt über mehrere Maschinen verteilte GPUs und Arbeitsspeicher zu einer Computing-Ressource und stellt lokale Ausführung, Weiterleitung an Peers und geteilte Ausführung über eine einzige OpenAI-kompatible API bereit
- Anfragen werden auf der lokalen GPU oder bei einem Peer verarbeitet, der das Modell geladen hat; Modelle, die nicht auf eine einzelne Maschine passen, können über mehrere Nodes hinweg als Pipeline-Stufen ausgeführt werden
- Der Plugin-basierte Katalog umfasst mehr als 40 Modelle, von 500-Millionen-Parameter-Modellen für Notebooks bis hin zu 235B-MoE-Modellen; Clients rufen unabhängig vom internen Batching nur
localhost:9337/v1auf - Jeder Node betreibt einen iroh-Endpunkt, der einen Public Key als ID und einzige Netzwerkoberfläche nutzt, und baut ohne zentralen Server über NAT-Traversal, Hole Punching und Relay-Fallback authentifizierte QUIC-Verbindungen auf
- Mit einer etwa 18 MB großen Software lassen sich öffentliche Meshes oder private Deployments aufbauen; künftig soll die Abhängigkeit von geschlossenen Servern durch mobile Apps mit iroh Swift SDK und ACP-Unterstützung reduziert werden
Vorhandene Hardware statt externer Rechenzentren nutzen
- Die übliche Nutzung von LLMs hängt von GPU-Rechenzentren externer Anbieter und nutzungsbasierten APIs ab, sodass die Kosten mit steigender Nutzung wachsen
- Wenn Prompts an externe Dienste gesendet werden, können Nutzer die folgenden Faktoren nur schwer direkt kontrollieren
- Zeitpunkt von Modell-Updates
- Wohin Daten übertragen werden
- Vom Modell genutzter Arbeitsspeicher und zugrunde liegende Hardware
- Änderungen bei Preisen und Datenschutzrichtlinien
- Unternehmen und Dienste, die bereits GPUs im Büro, Lager oder unter dem Schreibtisch besitzen, benötigen eine Möglichkeit, mehrere Maschinen wie eine Computing-Ressource zu nutzen
- Mesh LLM ist dafür konzipiert, vorhandene GPUs und Arbeitsspeicher über beliebig viele Maschinen hinweg zu bündeln, größere Modelle auszuführen und Rechenressourcen teamintern privat oder öffentlich mit anderen zu teilen
Drei Wege zur Verarbeitung von Anfragen
- Wenn ein Standard-OpenAI-Client
http://localhost:9337/v1aufruft, entscheidet das Mesh, wo die Anfrage tatsächlich ausgeführt wird - Eine Anfrage wird über einen der folgenden drei Wege verarbeitet
- Ausführung des Modells auf der lokalen GPU der aktuellen Maschine
- Weiterleitung der Anfrage an einen Peer, der das benötigte Modell bereits geladen hat
- Pipeline-artige Aufteilung eines Modells, das nicht auf eine einzelne Maschine passt, über mehrere Maschinen hinweg
- Nutzer können mit einem einzelnen Node beginnen und bei Bedarf weitere hinzufügen; der OpenAI-Client muss weder das interne Routing noch die Art der geteilten Ausführung kennen
Plugin-Struktur und Modellkatalog
- Plugins deklarieren ihre Funktionen in einem Manifest, und die Runtime startet sie und routet Aufrufe
- Die Funktionen jedes Plugins werden über MCP, HTTP, Inferenz und Mesh-Events bereitgestellt
- Der Standardkatalog enthält mehr als 40 Modelle
- Etwa 500-Millionen-Parameter-Modelle, die auf einem Notebook laufen können
- Mixture-of-Experts-Modelle mit bis zu 235B Parametern
Geteilte Ausführung mit Skippy
- Der Split-Modus für große Modelle wird intern Skippy genannt
- Die Layer-Bereiche des Modells werden in Stufen aufgeteilt und auf die einzelnen Nodes verteilt
- Ein Node übernimmt die Layer 0 bis 15
- Der nächste Node übernimmt die Layer 16 bis 31
- Weitere Layer werden auf die gleiche Weise bis zum Ende der Pipeline verteilt
- Da die in einer Stufe erzeugten Aktivierungen an die nächste Stufe weitergegeben werden, lassen sich auch Modelle ausführen, die nicht auf einzelne Maschinen passen, indem mehrere mittelgroße Maschinen kombiniert werden
- Der Aufteilungsprozess bleibt für den OpenAI-Client unsichtbar; der Client ruft weiterhin nur den lokalen Endpunkt auf
P2P-Netzwerk auf Basis von iroh
- Sowohl Nodes, die Modelle bereitstellen, als auch Nodes, die nur Anfragen senden, starten einen iroh-Endpunkt
- Der Endpunkt übernimmt drei Rollen
- ID des Nodes
- Public Key
- Einzige Netzwerkoberfläche, die der Node nach außen freigibt
- iroh übernimmt ohne zentralen Server Hole Punching, NAT-Traversal und Relay-Fallbacks, um direkte und authentifizierte QUIC-Verbindungen zwischen Nodes an unterschiedlichen Standorten aufzubauen
- Für Nodes, die nicht direkt verbunden werden können, werden zwei iroh-Relays in verschiedenen Regionen betrieben, die einen nahegelegenen Ausweichpfad bereitstellen
- Da Maschinen über Public Keys adressiert und authentifizierte NAT-Traversal-QUIC-Verbindungen genutzt werden können, werden das Weiterleiten von Anfragen an Peers und das Senden von Aktivierungen an die nächste Pipeline-Stufe als dieselbe grundlegende Kommunikation mit jeweils anderer Endpunkt-ID behandelt
Protokolltrennung per QUIC ALPN
- Das gesamte Protokoll nutzt die ALPN-Aushandlung von QUIC und ist je nach Zweck in drei Bereiche unterteilt
mesh-llm/1: das grundlegende Mesh, einschließlich Gossip, Routing, HTTP-Tunnel und Plugin-Kanälenmesh-llm-control/1: Control Plane des Besitzers für Einstellungssynchronisierung und Eigentumsnachweisskippy-stage/2: latenzkritische Übertragung von Aktivierungen in geteilten Modellen
- In einer
mesh-llm/1-Verbindung werden alle Aufgaben über bidirektionale QUIC-Streams übertragen; das erste Byte des Streams identifiziert den Typ0x01 GOSSIP: Peer-Ankündigungen einschließlich Modell, GPU, RTT und Funktionen0x04 TUNNEL_HTTP: an einen Peer weitergeleitete Inferenzanfrage0x05 ROUTE_REQUEST: Abfrage eines von einem Peer gehosteten Modells0x06 PEER_DOWN: Benachrichtigung über einen getrennten Peer0x07 PEER_LEAVING: Benachrichtigung über reguläres Beenden0x08 PLUGIN_CHANNEL: Plugin-RPC0x0e DIRECT_PATH_REQUEST: Teilen direkter Adressen für NAT-Traversal
- Eine einzelne Verbindung verarbeitet Gossip, Inferenz, Routenabfragen und Peer-Lifecycle-Events und demultiplext die einzelnen Streams über das führende Byte
Trennung von sicherem Transport und Mesh-Steuerung
- iroh stellt die sichere Transportschicht zwischen Maschinen bereit
- Mesh LLM baut darauf eine eigene Gossip-Schicht auf und kontrolliert die folgenden Richtlinien direkt
- Wer am Mesh teilnehmen darf
- Kompatible Versionen
- Vertrauenswürdige Peers
Installation und künftige Unterstützung
- Durch Installation einer leichtgewichtigen Software von etwa 18 MB kann man an einem öffentlichen Mesh teilnehmen oder ein privates Deployment aufbauen
- Für Standard-OpenAI-Clients wird es über den Endpunkt
localhost:9337/v1bereitgestellt - Es ist geplant, mit dem iroh Swift SDK mobile Apps zu entwickeln; außerdem wird Unterstützung für den neuen Agentenstandard ACP vorbereitet, damit auch andere Clients am Mesh teilnehmen können
- Das Projekt zielt darauf ab, P2P-Nutzung auszuweiten und Abhängigkeiten von geschlossenen Servern zu reduzieren
- Das Projekt ist über den Quellcode und die Mesh-LLM-Website verfügbar
iroh-Netzwerkbibliothek
- iroh ist eine Open-Source-Netzwerkbibliothek für Verbindungen zwischen Geräten; man kann vorbereitete Protokolle kombinieren oder eigene Protokolle auf einer einfachen Kommunikationsabstraktion aufbauen
- Sie läuft bereits auf Hunderttausenden Geräten in Produktionsumgebungen
- Es gibt Dokumentation, Quellcode und einen Discord-Kanal
1 Kommentare
Hacker-News-Kommentare
Als ich auf dem ersten Bild die GPU-Systeme, Laptops, Server und Cloud-Knoten sah, wurde mir klar, wie wenig Rechenressourcen ich selbst habe. Ich habe weder einen Laptop mit 24 GB VRAM noch eine Workstation mit 96 GB, und selbst wenn ich die Gaming-PCs meiner Freunde alle zusammen einspannen würde, käme ich wohl nicht auf den gesamten VRAM auf dem Foto.
Im Artikel wurde auch ein öffentliches Mesh-Netzwerk vorgestellt, aber ich konnte keine näheren Informationen dazu finden.
Auffällig ist der Mangel an Leistungsinformationen. Ich hatte erwartet, dass es deutlich langsamer wäre als jede andere Art, große Modelle auszuführen, einschließlich System-RAM oder Disk-Streaming. Consumer-Netzwerke sind selbst mit 10Gbps Ethernet im Vergleich zu lokalem RAM oder Festplatten sehr langsam, daher habe ich mich gefragt, ob ein gesplittetes Modell bei 1 Token/s oder weniger liegt.
In der Modellliste stand bei Qwen 235B A22B jedoch „verifiziertes MoE 235B/22B mit 16 tok/s auf 2 Knoten“. Die Knotenspezifikationen und die Netzwerkverbindung wurden zwar nicht offengelegt, aber das ist eine ziemlich ordentliche Geschwindigkeit und kommt der angenehm interaktiven Nutzung recht nahe, auch wenn sie sie knapp verfehlt.
In einer verteilten Konfiguration bleiben die Gewichte im VRAM jedes Geräts und nutzen so die deutlich höhere Bandbreite des GPU-Speichers. Zwischen den Geräten werden nur Schichtausgaben übertragen, also Kilobytes statt Gigabytes an Gewichten, sodass der Netzwerkdurchsatz nicht zum Flaschenhals wird.
Die eigentliche Einschränkung ist die Netzwerklatenz. Wenn man ein Modell auf 4 Geräte verteilt, fällt pro Token dreimal Netzwerklatenz an; bei 1 ms Latenz kommen also 3 ms pro Token hinzu. Selbst wenn man die Rechenzeit mit 0 annimmt, liegt das theoretische Maximum ohne spekulatives Decoding bei etwa 30 tok/s.
Über das Internet ist die Latenz wahrscheinlich zu hoch, um praktikabel zu sein, aber in lokalen oder Unternehmensnetzwerken ist es mit spekulativem Decoding durchaus machbar. Beim Prefill oder Prompt-Processing akkumuliert sich die Latenz nicht, daher ist die verteilte Konfiguration dort mit hoher Wahrscheinlichkeit schneller.
Das Ziel ist, mehrere Geräte ohne dediziertes RDMA- oder NVLink-Fabric zu bündeln, um große Modelle auf vorhandener Hardware bereitzustellen und sie mit anderen zu teilen. Derzeit arbeite ich daran, GLM 5.2 mit etwa 10 tok/s in derselben Split-Konfiguration auszuführen.
2 × hidden_size × num_shardsByte über das Netzwerk übertragen werden; beim Prefill teilt man diesen Wert durch die Chunk-Größe.Mich interessiert verteilte Inferenz mit kleinen Sprachmodellen, die für einen bestimmten Zweck gebaut wurden, mehr als Coding-LLMs. Für Bildverarbeitung, Software-defined Radio (SDR) oder lokale Wetterbeobachtung könnte man sie einsetzen, sodass sie selbst auf gewöhnlicher Hardware laufen und dennoch verlässliche Ausgaben liefern.
Ich bin Mitwirkender an Mesh LLM und habe die skippy engine entwickelt, mit der sich große Modelle auf mehrere Knoten aufteilen lassen. Wenn es Fragen gibt, beantworte ich sie gern.
Erstens: Wenn Rechenleistung auf diese Weise verteilt wird, kennen alle Teilnehmer des Rechengraphen die gerade verarbeitete Sequenz — wie geht ihr mit Datenschutz um? Zweitens: Gibt es Schutzmechanismen, damit böswillige Teilnehmer die Aktivierungen des Modells nicht manipulieren können?
Falls ja, sollte sich das in Bezug auf Rechenaufwand und Datengröße sauber aufteilen lassen, und langsamer würde nur die Zeit, in der jede Schicht auf ihren Zug warten muss. Mit einer Pipeline könnte man dann auch mehrere Anfragen gleichzeitig ausführen.
Gibt es Beispiele dafür, best-of-N mit einer N-stufigen Pipeline umzusetzen, bei der Anfragen jeweils um einen Schritt versetzt eingespeist werden?
Bei der Suche nach LLMs mit ähnlichen Ansätzen im verteilten Computing bin ich auf AI Horde, kleinere Versuche rund um Aphrodite und auf verteiltes Training von Nous Research gestoßen.
Davon scheint AI Horde am größten zu sein. Die API verwendet nicht das Chat-Completion-Format, sondern das Text-Completion-Format von KoboldCPP. Offenbar bevorzugen aktive Mitglieder der Community diesen Ansatz stark, weil mehr Steuerungsparameter offengelegt werden und die Ergebnisse beim Rollenspiel besser sind. Für andere Anwendungsfälle braucht man meist Tool Calling, daher bin ich mir nicht sicher, wofür das außerhalb von Rollenspiel taugt.
Diese Woche habe ich begonnen, die OpenAI-Bridge zu verbessern, damit sie Chat-Templates und Response Parsing unterstützt. Wenn es in ein offizielles Release kommt, könnte man es auch fürs Coding nutzen, selbst wenn man dafür Rollenspiel-Modelle verwenden muss.
Auch die Schutzmechanismen gegen Missbrauch sind ausgereifter. Um koordinierte Angriffe zu verhindern, werden Worker erst dann als vertrauenswürdig eingestuft, wenn sie eine kumulierte Uptime von einer Woche erreicht haben, und Nutzer können nur vertrauenswürdige Worker auswählen. Wer einen Worker betreibt, erhält
kudos, die für Generierungen mit mehr als 512 Tokens genutzt werden können, und kostenlose Anfragen landen ganz hinten in der Warteschlange.Ich habe mich gefragt, was ein polymorphes Botnetz, das ein oder mehrere verteilte LLMs ausführt, tun könnte. Die Idee wäre, alle Hosts eines Botnetzes als Cluster-Rechenressourcen für LLMs zu verwenden und zugleich die Ausbreitungsmechanismen und Payloads jedes Botnetz-Clusters evolvieren zu lassen.
Schlechte Varianten würden erkannt und entfernt, ineffektive Ausbreitungsmechanismen würden sich nicht verbreiten, aber die besten Versionen würden überleben und weiter wachsen. Das ist der hier vorgestellten Struktur ziemlich ähnlich, und QUIC arbeitet so dynamisch, dass es möglicherweise schwerer zu erkennen ist, als man denkt.
Das Projekt https://query.mt/ verwendet schon seit einiger Zeit ein iroh-basiertes Mesh. Wer Mesh-Modelle auch auf dem Handy nutzen möchte, sollte es sich ansehen.
Ich habe eine Weile damit gekämpft, mesh-llm zum Laufen zu bringen, aber unter den installierbaren llama.cpp-Builds gab es keinen, der auf meiner älteren GPU funktionierte. Es sah so aus, als könne man einen externen llama.cpp-Service davor schalten, aber auch diese Konfiguration habe ich nicht erfolgreich hinbekommen.
Es ist ein sehr interessantes Projekt, aber es gibt noch einige unfertige Stellen.
Ich dachte, dass so etwas möglich sein müsste, und habe ChatGPT vor etwa einem Jahr danach gefragt, aber die Antwort lautete, die Latenz sei zu hoch und mache es unmöglich. Damals hatte ich fast ein Jahr lang libp2p studiert und nach einem Projekt gesucht, in dem ich es einsetzen konnte.