Kapitel 1. Was ist Ray, und wo passt er hin?
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Ray ist in erster Linie ein Python-Tool für schnelles und einfaches verteiltes Rechnen. Ray wurde vom RISELab an der University of California, Berkeley, entwickelt. Eine frühere Version dieses Labors entwickelte die ursprüngliche Software, aus der schließlich Apache Spark wurde. Forscherinnen und Forscher des RISELab gründeten das Unternehmen Anyscale, um die Entwicklung von Ray fortzusetzen und Produkte und Dienstleistungen rund um Ray anzubieten.
Hinweis
Du kannst Ray auch von Java aus nutzen. Wie viele Python-Anwendungen verwendet Ray unter der Haube eine Menge C++ und etwas Fortran. Ray Streaming hat auch einige Java-Komponenten.
Das Ziel von Ray ist es, eine größere Vielfalt an Problemen zu lösen als seine Vorgänger und verschiedene skalierbare Programmierungsmodelle zu unterstützen, die von Akteuren über maschinelles Lernen (ML) bis hin zur Datenparallelität reichen. Seine Remote-Funktionen und Akteursmodelle machen es zu einer echten Allzweck-Entwicklungsumgebung, die nicht nur für Big Data geeignet ist.
Ray skaliert die Rechenressourcen automatisch nach Bedarf, sodass du dich auf deinen Code konzentrieren kannst, anstatt Server zu verwalten. Neben der traditionellen horizontalen Skalierung (z. B. durch Hinzufügen weiterer Rechner) kann Ray Aufgaben so planen, dass sie die Vorteile verschiedener Rechnergrößen und Beschleuniger wie Grafikprozessoren (GPUs) nutzen.
Seit der Einführung von Amazon Web Services (AWS) Lambda ist das Interesse am serverlosen Computing explodiert. Bei diesem Cloud-Computing-Modell weist der Cloud-Provider Maschinenressourcen nach Bedarf zu und kümmert sich im Namen seiner Kunden um die Server. Ray bietet eine hervorragende Grundlage für universelle Serverless-Plattformen, indem es die folgenden Funktionen bereitstellt:
-
Es versteckt die Server. Ray Autoscaling verwaltet die Server transparent nach den Anforderungen der Anwendung.
-
Durch die Unterstützung von Akteuren implementiert Ray nicht nur ein zustandsloses Programmiermodell (typisch für die meisten serverlosen Implementierungen), sondern auch ein zustandsorientiertes.
-
Hier kannst du Ressourcen angeben, einschließlich Hardware-Beschleuniger, die für die Ausführung deiner serverlosen Funktionen benötigt werden.
-
Es unterstützt die direkte Kommunikation zwischen deinen Aufgaben und damit nicht nur einfache Funktionen, sondern auch komplexe verteilte Anwendungen.
Ray bietet eine Fülle von Bibliotheken, die die Erstellung von Anwendungen vereinfachen, die die serverlosen Möglichkeiten von Ray voll ausschöpfen können. Normalerweise bräuchtest du für alles verschiedene Tools, von der Datenverarbeitung bis zum Workflow-Management. Indem du ein einziges Tool für einen größeren Teil deiner Anwendung verwendest, vereinfachst du nicht nur die Entwicklung, sondern auch dein Betriebsmanagement.
In diesem Kapitel schauen wir uns an, wo Ray in das Ökosystem passt und helfen dir zu entscheiden, ob es für dein Projekt geeignet ist.
Warum brauchst du Ray?
Wir brauchen oft etwas wie Ray, wenn unsere Probleme zu groß werden, um sie in einem einzigen Prozess zu bearbeiten. Je nachdem, wie groß unsere Probleme werden, kann dies eine Skalierung von Multicore bis hin zu Multicomputer bedeuten, die Ray unterstützt. Wenn du dich fragst, wie du das Wachstum von Benutzern, Daten oder Komplexität im nächsten Monat bewältigen kannst, hoffen wir, dass du einen Blick auf Ray wirfst. Ray gibt es, weil es schwierig ist, Software zu skalieren, und dieses Problem wird mit der Zeit eher schwieriger als einfacher.
Ray kann nicht nur auf mehrere Computer skaliert werden, sondern auch, ohne dass du Server direkt verwalten musst. Der Informatiker Leslie Lamport hat gesagt: "Ein verteiltes System ist ein System, in dem der Ausfall eines Computers, von dessen Existenz du nicht einmal wusstest, deinen eigenen Computer unbrauchbar machen kann." Diese Art von Ausfall ist zwar immer noch möglich, aber Ray ist in der Lage, sich automatisch von vielen Arten von Ausfällen zu erholen.
Ray läuft sowohl auf deinem Laptop als auch im großen Maßstab mit denselben APIs. Dies bietet eine einfache Einstiegsmöglichkeit in die Nutzung von Ray, ohne dass du in die Cloud gehen musst, um mit dem Experimentieren zu beginnen. Sobald du dich mit den APIs und der Anwendungsstruktur vertraut gemacht hast, kannst du deinen Code einfach in die Cloud verlagern, um eine bessere Skalierbarkeit zu erreichen, ohne dass du deinen Code ändern musst. Dies erfüllt die Anforderungen, die zwischen einem verteilten System und einer Single-Thread-Anwendung bestehen. Ray ist in der Lage, mehrere Threads und GPUs mit denselben Abstraktionen zu verwalten, die es für verteiltes Computing verwendet.
Wo kannst du Ray laufen lassen?
Ray kann in einer Vielzahl von Umgebungen eingesetzt werden, von deinem Laptop über die Cloud, Cluster-Manager wie Kubernetes oder Yarn bis hin zu sechs Raspberry Pis, die unter deinem Schreibtisch stehen.1 Im lokalen Modus ist der Start so einfach wie ein pip install
und ein Aufruf von ray.init
. Viele moderne Ray-Programme initialisieren automatisch einen Kontext, wenn keiner vorhanden ist, sodass du auch diesen Teil überspringen kannst.
Mit dem Befehl ray up
, der Teil von Ray ist, kannst du Cluster erstellen und Folgendes tun:
-
Eine neue Instanz/Maschine bereitstellen (wenn sie in der Cloud oder im Clustermanager läuft), indem du das Software Development Kit (SDK) des Anbieters verwendest oder auf Maschinen zugreifst (wenn sie direkt auf physischen Maschinen läuft)
-
Führen Sie Shell-Befehle aus, um Ray mit den gewünschten Optionen einzurichten
-
Alle benutzerdefinierten Setup-Befehle ausführen (z. B. Umgebungsvariablen setzen und Pakete installieren)
-
Initialisiere den Ray-Cluster
-
Falls erforderlich, einen Autoscaler einrichten
Zusätzlich zu ray up
kannst du, wenn du Kubernetes nutzt, den Ray Kubernetes Operator verwenden. Obwohl ray up
und der Kubernetes-Operator die bevorzugten Methoden zur Erstellung von Ray-Clustern sind, kannst du den Ray-Cluster auch manuell einrichten, wenn du bereits über eine Reihe von Maschinen verfügst - entweder physische oder virtuelle Maschinen (VMs).
Je nach Einsatzoption funktioniert derselbe Ray-Code mit großen Unterschieden in der Geschwindigkeit. Das kann noch komplizierter werden, wenn du zum Beispiel bestimmte Bibliotheken oder Hardware für den Code brauchst. Im nächsten Kapitel gehen wir näher auf den lokalen Betrieb von Ray ein. Und wenn du noch mehr skalieren willst, behandeln wir im Anhang B die Bereitstellung in der Cloud und die Ressourcenmanager.
Deinen Code mit Ray ausführen
Ray ist mehr als nur eine Bibliothek, die du importierst; es ist auch ein Cluster-Management-Tool. Du musst nicht nur die Bibliothek importieren, sondern dich auch mit einem Ray-Cluster verbinden. Du hast drei Möglichkeiten, deinen Code mit einem Ray-Cluster zu verbinden:
- Aufruf von
ray.init
ohne Argumente -
Dadurch wird eine eingebettete Single-Node-Ray-Instanz gestartet, die sofort für die Anwendung verfügbar ist.
- Den Ray Client verwenden
ray.init("ray://<head_node_host>:10001")
-
Standardmäßig wird jeder Ray-Cluster mit einem Ray-Client-Server gestartet, der auf dem Hauptknoten läuft und Remote-Client-Verbindungen empfangen kann. Wenn sich der Client jedoch an einem anderen Ort befindet, können einige Vorgänge, die direkt vom Client aus ausgeführt werden, aufgrund von WAN-Latenzen langsamer sein. Ray ist nicht resistent gegenüber Netzwerkausfällen zwischen dem Hauptknoten und dem Client.
- Verwendung der Ray-Befehlszeilen-API
-
Du kannst den Befehl
ray submit
verwenden, um Python-Skripte auf Clustern auszuführen. Dabei wird die angegebene Datei auf den Head-Node-Cluster kopiert und mit den angegebenen Argumenten ausgeführt. Wenn du die Parameter übergibst, sollte dein Code das Python-Modulsys
verwenden, das den Zugriff auf alle Befehlszeilenargumente übersys.argv
ermöglicht. Dadurch wird ein möglicher Fehler im Netzwerk bei der Verwendung des Ray-Clients beseitigt.
Wie passt sie in das Ökosystem?
Ray befindet sich an einem einzigartigen Schnittpunkt von Problemfeldern.
Das erste Problem, das Ray löst, ist die Skalierung deines Python-Codes durch die Verwaltung von Ressourcen, egal ob es sich um Server, Threads oder GPUs handelt. Die Kernbausteine von Ray sind ein Zeitplannungsprogramm, eine verteilte Speicherung von Daten und ein Akteurssystem. Das leistungsstarke Zeitplannungsprogramm von Ray ist universell genug, um einfache Workflows zu implementieren und auch traditionelle Skalierungsprobleme zu bewältigen. Das Akteurssystem von Ray bietet dir eine einfache Möglichkeit, einen belastbaren verteilten Ausführungsstatus zu verwalten. Ray ist daher in der Lage, als ein reaktives System zu agieren, bei dem seine verschiedenen Komponenten auf ihre Umgebung reagieren können.
Zusätzlich zu den skalierbaren Bausteinen verfügt Ray über übergeordnete Bibliotheken wie Serve, Datasets, Tune, RLlib, Train und Workflows, die im Bereich der ML-Probleme existieren. Diese sind für Leute gedacht, die sich eher mit Datenwissenschaften als mit verteilten Systemen auskennen.
Das Ray-Ökosystem wird in Abbildung 1-2 dargestellt.
Werfen wir einen Blick auf einige dieser Problembereiche und sehen wir uns an, wie sich Ray in die bestehenden Tools einfügt und mit ihnen vergleicht. In der folgenden Liste, die der Dokumentation "Ray 1.x Architecture" des Ray-Teams entnommen ist, wird Ray mit verschiedenen verwandten Systemkategorien verglichen:
- Cluster-Orchestratoren
-
Cluster Orchestratoren wie Kubernetes, Slurm und Yarn planen Container. Ray kann diese für die Zuweisung von Clusterknoten nutzen.
- Parallelisierungs-Frameworks
-
Im Vergleich zu Python-Parallelisierungsframeworks wie Multiprocessing oder Celery bietet Ray eine allgemeinere, leistungsfähigere API. Außerdem unterstützen die verteilten Objekte von Ray die gemeinsame Nutzung von Daten durch parallele Executors.
- Rahmenwerke für die Datenverarbeitung
-
Die untergeordneten APIs von Ray sind flexibler und besser für ein "verteiltes Glue"-Framework geeignet als bestehende Datenverarbeitungs-Frameworks wie Spark, Mars oder Dask. Obwohl Ray kein inhärentes Verständnis von Datenschemata, relationalen Tabellen oder Streaming Dataflow hat, unterstützt es die Ausführung vieler dieser Datenverarbeitungsframeworks - zum Beispiel Modin, Dask on Ray, Mars on Ray und Spark on Ray (RayDP).
- Akteurs-Rahmenwerke
-
Im Gegensatz zu spezialisierten Actor-Frameworks wie Erlang, Akka und Orleans, integriert Ray das Actor-Framework direkt in Programmiersprachen. Darüber hinaus unterstützen die verteilten Objekte von Ray die gemeinsame Nutzung von Daten durch verschiedene Akteure.
- Arbeitsabläufe
-
Wenn die meisten Leute über Workflows sprechen, meinen sie die UI- oder skriptgesteuerte Low-Code-Entwicklung. Während dieser Ansatz für technisch nicht versierte Benutzer/innen nützlich sein mag, bringt er Softwareentwicklern/innen oft mehr Ärger als Nutzen. Ray verwendet eine programmatische Workflow-Implementierung, ähnlich wie Cadence. Diese Implementierung kombiniert die Flexibilität der dynamischen Aufgabengraphen von Ray mit starken Haltbarkeitsgarantien. Ray Workflows bietet einen Overhead von weniger als einer Sekunde für den Start von Aufgaben und unterstützt Workflows mit hunderttausenden von Schritten. Außerdem nutzt es den Ray-Objektspeicher, um verteilte Datensätze zwischen den Schritten weiterzugeben.
- HPC-Systeme
-
Im Gegensatz zu Ray ( ), das Task- und Actor-APIs anbietet, bieten die meisten High-Performance-Computing-Systeme (HPC) Messaging-APIs auf niedrigerer Ebene an, was eine größere Anwendungsflexibilität ermöglicht. Außerdem bieten viele HPC-Implementierungen optimierte kollektive Kommunikationsprimitive. Ray bietet eine Bibliothek für kollektive Kommunikation, die viele dieser Funktionen implementiert.
Big Data / Skalierbare Datenrahmen
Ray bietet einige APIs für skalierbare Datenrahmen, einen Eckpfeiler des Big-Data-Ökosystems. Ray baut auf dem Apache Arrow-Projekt auf und bietet eine (begrenzte) verteilte DataFrame-API namens ray.data.Dataset
. Diese ist vor allem für die einfachsten Transformationen und das Lesen von Daten aus der Cloud oder einer verteilten Speicherung gedacht. Darüber hinaus bietet Ray auch Unterstützung für eine Pandas-ähnliche Erfahrung durch Dask on Ray, das die Dask-Schnittstelle auf Ray aufbaut.
Wir behandeln skalierbare Datenrahmen in Kapitel 9.
Warnung
Zusätzlich zu den oben genannten Bibliotheken findest du unter möglicherweise Verweise auf Mars on Ray oder die (veraltete) integrierte Pandas-Unterstützung von Ray. Diese Bibliotheken unterstützen den verteilten Modus nicht und können daher deine Skalierbarkeit einschränken. Dies ist ein Bereich, der sich schnell entwickelt und den du in Zukunft im Auge behalten solltest.
Maschinelles Lernen
Ray hat mehrere ML-Bibliotheken, die größtenteils dazu dienen, einen Großteil der ausgefallenen Teile von ML an bestehende Tools wie PyTorch, scikit-learn und TensorFlow zu delegieren und gleichzeitig die verteilten Rechenkapazitäten von Ray zur Skalierung zu nutzen. Ray Tune implementiert das Tuning von Hyperparametern und nutzt dabei Rays Fähigkeit, viele lokale Python-basierte Modelle parallel auf einer verteilten Anzahl von Rechnern zu trainieren. Ray Train implementiert das verteilte Training mit PyTorch oder TensorFlow. Die RLlib-Schnittstelle von Ray bietet Reinforcement Learning mit Kernalgorithmen.
Ray hebt sich von reinen datenparallelen Systemen für ML unter anderem durch sein Akteursmodell ab, das eine einfachere Verfolgung des Zustands (einschließlich der Parameter) und der Kommunikation zwischen den Arbeitern ermöglicht. Du kannst dieses Modell nutzen, um deine eigenen Algorithmen zu implementieren, die nicht Teil von Ray Core sind.
Wir behandeln ML in Kapitel 10 ausführlicher.
Zeitplanungsprogramm für den Workflow
Das Zeitplanungsprogramm für Arbeitsabläufe ist einer dieser Bereiche, die auf den ersten Blick sehr einfach erscheinen. Ein Arbeitsablauf ist "nur" ein Diagramm der zu erledigenden Arbeit. Aber alle Programme lassen sich "nur" als ein Diagramm von zu erledigenden Aufgaben darstellen. Neu in Version 2.0 ist die Workflows-Bibliothek von Ray, mit der sich sowohl herkömmliche Geschäftslogik-Workflows als auch groß angelegte Workflows (z. B. für ML-Training) einfacher ausdrücken lassen.
Ray ist einzigartig in der Workflow-Planung, weil es Aufgaben erlaubt, andere Aufgaben zu planen, ohne einen zentralen Knotenpunkt anrufen zu müssen. Das ermöglicht eine größere Flexibilität und einen höheren Durchsatz.
Wenn dir die Workflow-Engine von Ray zu wenig anspruchsvoll ist, kannst du Apache Airflow mit Ray ausführen. Airflow ist eines der beliebtesten Zeitplannungsprogramme im Bereich Big Data. Mit dem Apache Airflow Provider für Ray kannst du deinen Ray-Cluster als Worker-Pool für Airflow nutzen.
Das Zeitplanungsprogramm für Arbeitsabläufe wird in Kapitel 8 behandelt.
Streaming
Streaming wird im Allgemeinen als Verarbeitung von "echtzeitähnlichen" Daten oder von Daten "wie sie eintreffen" betrachtet. Streaming ist umso komplexer, je näher du an die Echtzeit herankommen willst, da nicht alle Daten immer in der richtigen Reihenfolge oder pünktlich ankommen werden. Ray bietet standardmäßige Streaming-Primitive und kann Kafka als Quelle und Senke für Streaming-Daten nutzen. Ray nutzt seine Actor Model APIs, um mit Streaming-Daten zu interagieren.
Ray Streaming hat, wie viele Streaming-Systeme, die auf Batch-Systeme aufgesetzt werden, einige interessante Eigenheiten. Vor allem implementiert Ray Streaming einen Großteil seiner Logik in Java, im Gegensatz zum Rest von Ray. Das kann die Fehlersuche in Streaming-Anwendungen schwieriger machen als in anderen Komponenten von Ray.
Wie du mit Ray Streaming-Anwendungen erstellst, erfährst du in Kapitel 6.
Interaktiv
Nicht alle "echtzeitähnlichen" Anwendungen sind unbedingt Streaming-Anwendungen. Ein gängiges Beispiel ist die interaktive Erkundung eines Datensatzes. Auch die Interaktion mit Benutzereingaben (z. B. die Bereitstellung von Modellen) kann als interaktiver Prozess und nicht als Batch-Prozess betrachtet werden, wird aber mit Ray Serve getrennt von den Streaming-Bibliotheken behandelt.
Was Ray nicht ist
Ray ist zwar ein universelles, verteiltes System, aber es gibt auch einige Dinge, die Ray nicht kann (zumindest nicht, ohne dass du einen großen Aufwand betreiben musst):
-
Structured Query Language (SQL) oder eine Analyse-Engine
-
Ein System zur Speicherung von Daten
-
Geeignet für den Betrieb von Atomreaktoren
-
Vollständig sprachunabhängig
Ray kann ein wenig von all diesen Funktionen übernehmen, aber du bist wahrscheinlich besser dran, wenn du ein spezielleres Tool verwendest. Ray verfügt zwar über einen Key/Value Store, ist aber nicht dafür ausgelegt, den Verlust des Leader Nodes zu überleben. Das heißt aber nicht, dass Ray deine Anforderungen nicht erfüllen kann, wenn du an einem Problem arbeitest, das ein wenig SQL oder einige Nicht-Python-Bibliotheken benötigt - du musst nur zusätzliche Tools einsetzen.
Fazit
Ray hat das Potenzial, deinen Entwicklungs- und Betriebsaufwand für mittelgroße bis große Probleme erheblich zu vereinfachen. Dies wird dadurch erreicht, dass Ray eine einheitliche API für eine Vielzahl von traditionell getrennten Problemen anbietet und gleichzeitig eine serverlose Skalierbarkeit ermöglicht. Wenn du Probleme hast, die sich auf die von Ray abgedeckten Bereiche erstrecken, oder wenn du es einfach leid bist, deine eigenen Cluster zu verwalten, hoffen wir, dass du dich mit uns auf das Abenteuer einlässt, Ray zu lernen.
Im nächsten Kapitel zeigen wir dir, wie du Ray im lokalen Modus auf deinem Rechner installierst. Außerdem schauen wir uns ein paar Hello Worlds aus einigen der Ökosysteme an, die Ray unterstützt (darunter Akteure und Big Data).
1 Die ARM-Unterstützung, auch für Raspberry PIs, muss vorerst manuell erstellt werden.
Get Python mit Ray skalieren now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.