In der heutigen Zeit ist die Bewältigung großer Datenmengen und komplexer Machine-Learning-Workloads für viele Unternehmen eine zentrale Herausforderung. Uber, als eines der weltweit führenden Technologieunternehmen, stand vor der Aufgabe, ihre bestehende Machine-Learning-Infrastruktur zu modernisieren, um mit dem schnellen Wachstum und den steigenden Anforderungen Schritt halten zu können. Die Umstellung auf Ray-basierte Workloads auf Kubernetes markiert einen bedeutenden Schritt in diesem Prozess und bietet wertvolle Einblicke in die Vorteile modernster Technologien für skalierbare und effiziente ML-Plattformen. Ubers ursprüngliche Plattform für Machine Learning war stark auf das interne System Michelangelo Deep Learning Jobs (MADLJ) ausgerichtet, das Apache Spark für ETL-Prozesse und Ray für das Training von Modellen nutzte. Trotz der damaligen Effizienz führte die Architektur zu mehreren Herausforderungen, vor allem im Bereich der Ressourcenzuteilung und Skalierbarkeit.
Die manuelle Verwaltung der Rechenressourcen belastete die ML-Ingenieure erheblich. Diese mussten die Verfügbarkeit von GPUs und die Kapazität der laufenden Cluster ständig überwachen, um optimale Rechenressourcen zuzuweisen. Ein rigides, statisches System mit festcodierten Einstellungen führte zu einer ungleichen Lastverteilung und Ressourcenverschwendung. Dieser Zustand wirkte sich negativ auf die Skalierbarkeit aus, da das System entweder Ressourcen überprovisionierte und somit unnötige Kosten verursachte, oder sie unterprovisionierte, was zu Jobausfällen und Verzögerungen führte. Insbesondere bei der Bewältigung stark schwankender Anforderungen führte das starre Modell zu Ineffizienzen und war nicht in der Lage, flexibel auf Änderungen zu reagieren.
Die Notwendigkeit einer automatisierten und anpassungsfähigen Infrastruktur wurde somit immer deutlicher. Uber identifizierte Kubernetes als ideale Plattform, um diese Herausforderungen zu meistern. Kubernetes ist bekannt für seine Fähigkeit, containerisierte Anwendungen zu orchestrieren und dynamisch auf Ressourcenanforderungen zu reagieren. Die Migration von ML-Workloads zu Kubernetes sollte eine deklarative und einheitliche Infrastruktur ermöglichen, die eine automatische Ressourcenverteilung vorsah. Dadurch konnten Anwender einfach den Jobtyp und die benötigten Ressourcen spezifizieren, ohne sich um die Komplexität der zugrunde liegenden Systeme kümmern zu müssen.
Ein zentraler Ansatzpunkt war die Einführung elastischer Ressourcenverwaltung. Uber implementierte hierarchische Ressourcenpools, welche die Cluster-Ressourcen nach Teams oder organisatorischen Einheiten organisierten. Diese Struktur erlaubte eine bessere Kontrolle und Transparenz über Ressourcennutzung, indem jede Einheit ihre eigene Zuteilung und Auslastung einsehen konnte. Der Vorteil dieser Methode lag vor allem darin, dass ungenutzte Ressourcen innerhalb eines Pools temporär von anderen Pools ausgeliehen werden konnten. Dieses elastische Teilen von Ressourcen erhöhte die Gesamtauslastung deutlich, während durch die Konzeption preemptibler Ressourcen sichergestellt wurde, dass die ursprünglichen Besitzer ihre Kapazitäten bei Bedarf zurückfordern konnten.
Um Fairness und Effizienz zu gewährleisten, setzte Uber auf das Prinzip der maximal-minimalen Gerechtigkeit (max-min fairness). Dieses Prinzip garantiert jedem Ressourcenpool eine Mindestmenge an Ressourcen, während darüber hinaus Kapazitäten bedarfsgerecht und dynamisch verteilt werden. Somit war die Plattform sowohl flexibel als auch stabil und ließ sich gut an die wechselnden Anforderungen von Machine-Learning-Workloads anpassen. Ein weiterer wichtiger Fokus lag auf der optimalen Nutzung unterschiedlicher Hardwaretypen. Die Kubernetes-Cluster bei Uber enthielten sowohl GPU-beschleunigte Knoten als auch reine CPU-Knoten.
Um eine bestmögliche Effizienz zu gewährleisten, konnten zunächst Aufgaben wie Datenvorverarbeitung und ETL explizit auf CPU-Knoten ausgeführt werden, während das Training von Modellen die GPU-Knoten nutzte. Uber entwickelte darüber hinaus ein spezielles GPU-Filter-Plugin, das sicherstellte, dass nur GPU-intensive Workloads auf GPU-Knoten geplant wurden. Diese Entwicklung verhinderte eine Verschwendung von GPU-Ressourcen durch unangemessene Platzierung und sorgte für eine klare Trennung der Workloads. Die Scheduler von Kubernetes wurden modifiziert, um eine optimierte Verteilung der Pods zu gewährleisten. Während nicht-GPU-Workloads mit einer lastbewussten Strategie verteilt wurden, kam für die GPU-Pods eine sogenannte Bin-Packing-Strategie zum Einsatz, die darauf abzielte, Ressourcenfragmentierung zu minimieren.
So konnten die GPU-Knoten möglichst voll ausgelastet werden, was zu einer deutlich höheren Effizienz führte. Die Vorteile dieses Migrationsprozesses sind vielfältig. Uber erreichte eine deutlich bessere Skalierbarkeit, da die Infrastruktur nun dynamisch auf schwankende Anforderungen reagieren kann. Die Entwickler konnten sich mehr auf die Modellierung und Algorithmen konzentrieren, da die zugrunde liegenden Ressourcen transparent und automatisiert verwaltet werden. Gleichzeitig wurde die Ressourcenauslastung optimiert, wodurch sowohl Kosten gespart als auch die Umweltbelastung reduziert wurde.
Neben Effizienzsteigerungen profitierte Uber auch von einer verbesserten Entwicklererfahrung. Die Migration zu einer Kubernetes- und Ray-basierten Plattform erleichterte die Einführung neuer Technologien und vereinte verschiedene Teams auf einer standardisierten Infrastruktur. Dies förderte Wissensaustausch und Innovation, da Entwickler nun mit klar definierten, einheitlichen Schnittstellen arbeiten konnten und weniger Zeit für operative Tätigkeiten aufwenden mussten. Aus technischer Sicht lässt sich sagen, dass die Verbindung von Kubernetes und Ray eine leistungsstarke Kombination für Machine-Learning-Anwendungen darstellt, die hohe Anforderungen an Ressourcenmanagement und Skalierbarkeit stellen. Kubernetes übernimmt dabei das Orchestrieren und Verwalten der Infrastruktur, während Ray die verteilte Ausführung von ML-Workloads ermöglicht.
Diese Synergie eröffnet Möglichkeiten für eine Vielzahl von anspruchsvollen Anwendungsfällen, beispielsweise im Bereich der Echtzeit-Datenverarbeitung oder bei komplexen hyperparametrischen Suchläufen. Für Unternehmen, die vor ähnlichen Herausforderungen stehen, bietet die Erfahrung von Uber wertvolle Einblicke. Die konsequente Automatisierung der Ressourcenverwaltung, gepaart mit einer klaren Trennung der Workloads nach Anforderungen, stellt einen praxisbewährten Ansatz dar, um Effizienz und Skalierbarkeit gleichermaßen zu gewährleisten. Eine Migration zu Kubernetes bietet dabei nicht nur technische Vorteile, sondern kann auch die Agilität und Innovationsfähigkeit einer Organisation steigern. Nicht zuletzt zeigt Ubers Reise, wie wichtig es ist, bestehende Systeme kritisch zu hinterfragen und bereit für technische Neuerungen zu sein.
Durch die Kombination moderner Open-Source-Technologien und eigenentwickelter Tools entstand eine technisch hochwertige und nachhaltige Plattform, die den hohen Ansprüchen einer Weltmarkt führenden Technologie-Organisation gerecht wird. Zusammenfassend lässt sich sagen, dass Uber mit der Migration zu Ray auf Kubernetes eine zukunftsfähige ML-Infrastruktur aufgebaut hat, die als Vorbild für andere Organisationen dienen kann. Die Vorteile zeigen sich in einer höheren Ressourceneffizienz, besserer Skalierbarkeit und einer nachhaltigen Verbesserung der Entwicklererfahrung. In einer Zeit, in der Daten und ML stetig an Bedeutung gewinnen, sind solche technologische Evolutionen entscheidend für langfristigen Erfolg und Wettbewerbsfähigkeit.