Ray-fürtök létrehozása és csatlakoztatása az Azure Databricksben
Megtudhatja, hogyan hozhat létre, konfigurálhat és futtathat Ray számítási fürtöket az Azure Databricksben
Követelmények
Ray-fürt létrehozásához hozzáféréssel kell rendelkeznie egy Databricks teljes célú számítási erőforráshoz a következő beállításokkal:
- Databricks Runtime 12.2 LTS ML és újabb.
- A hozzáférési módnak egyfelhasználósnak vagy nem megosztott elkülönítésnek kell lennie.
Feljegyzés
A sugárfürtök jelenleg nem támogatottak a kiszolgáló nélküli számításban.
A Ray telepítése
A Databricks Runtime ML 15.0-s verzióval a Ray előre telepítve van az Azure Databricks-fürtökön.
A 15.0 előtt kiadott futtatókörnyezetek esetében a Pip használatával telepítse a Ray-t a fürtre:
%pip install ray[default]>=2.3.0
Felhasználóspecifikus Ray-fürt létrehozása egy Azure Databricks-fürtben
Ray-fürt létrehozásához használja a ray.util.spark.setup_ray_cluster API-t .
Feljegyzés
Ha Ray-fürtöt hoz létre egy jegyzetfüzetben, az csak az aktuális jegyzetfüzet-felhasználó számára érhető el. A Ray-fürt automatikusan le lesz állítva, miután a jegyzetfüzet leválasztva lett a fürtről, vagy 30 perc inaktivitás után (a rendszer nem küldött el feladatokat a Raynek). Ha olyan Ray-fürtöt szeretne létrehozni, amely minden felhasználóval meg van osztva, és nem tartozik aktívan futó jegyzetfüzethez, használja inkább az ray.util.spark.setup_global_ray_cluster
API-t.
Rögzített méretű Ray-fürt
Bármely Azure Databricks-fürthöz csatolt Azure Databricks-jegyzetfüzetben a következő parancsot futtatva elindíthat egy rögzített méretű Ray-fürtöt:
from ray.util.spark import setup_ray_cluster, shutdown_ray_cluster
setup_ray_cluster(
num_worker_nodes=2,
num_cpus_per_node=4,
collect_log_to_path="/dbfs/path/to/ray_collected_logs"
)
# Pass any custom Ray configuration with ray.init
ray.init(ignore_reinit_error=True)
Ray-fürt automatikus méretezése
Az automatikus skálázási Ray-fürtök elindításáról az Azure Databricks Ray-fürtöinek méretezése című témakörben olvashat.
Globális módú Ray-fürt indítása
A Ray 2.9.0-s vagy újabb verzióját használva globális módú Ray-fürtöt hozhat létre egy Azure Databricks-fürtön. A globális módú Ray-fürt lehetővé teszi, hogy az Azure Databricks-fürthöz csatlakoztatott összes felhasználó a Ray-fürtöt is használja. A Ray-fürtök futtatásának ezen módja nem rendelkezik az egyfelhasználós fürt egyfelhasználós Ray-fürtpéldányának futtatásakor elérhető aktív időtúllépési funkcióval.
Ha olyan globális sugárfürtöt szeretne elindítani, amelyhez több felhasználó is csatolhat és futtathat Ray-feladatokat, először hozzon létre egy Azure Databricks-jegyzetfüzetfeladatot, és csatolja egy megosztott módú Azure Databricks-fürthöz, majd futtassa a következő parancsot:
from ray.util.spark import setup_global_ray_cluster
setup_global_ray_cluster(
max_worker_nodes=2,
...
# other arguments are the same as with the `setup_global_ray` API.
)
Ez egy letiltó hívás, amely addig aktív marad, amíg meg nem szakítja a hívást a jegyzetfüzet parancscellájának "Megszakítás" gombjára kattintva, leválasztja a jegyzetfüzetet az Azure Databricks-fürtről, vagy leállítja az Azure Databricks-fürtöt. Ellenkező esetben a globális módú Ray-fürt továbbra is futni fog, és elérhető lesz a jogosult felhasználók feladatbeküldéséhez. A globális módú fürtökről további információt a Ray API dokumentációjában talál.
A globális módú fürtök a következő tulajdonságokkal rendelkeznek:
- Az Azure Databricks-fürtökben egyszerre csak egy aktív globális módú Ray-fürt hozható létre.
- Az Azure Databricks-fürtökben az aktív globális módú Ray-fürtöt bármely csatolt Azure Databricks-jegyzetfüzet összes felhasználója használhatja. Az aktív globális módú Ray-fürthöz való csatlakozáshoz futtatható
ray.init()
. Mivel több felhasználó is hozzáférhet ehhez a Ray-fürthöz, az erőforrás-versengés problémát jelenthet. - A globális módú Ray-fürt fel van állítva, amíg a
setup_ray_cluster
hívás megszakad. Nem rendelkezik automatikus leállítási időtúllépéssel, ahogy az egyfelhasználós Ray-fürtök teszik.
Ray GPU-fürt létrehozása
GPU-fürtök esetén ezek az erőforrások a következő módon adhatók hozzá a Ray-fürthöz:
from ray.util.spark import setup_ray_cluster, shutdown_ray_cluster
setup_ray_cluster(
min_worker_nodes=2,
max_worker_nodes=4,
num_cpus_per_node=8,
num_gpus_per_node=1,
num_cpus_head_node=8,
num_gpus_head_node=1,
collect_log_to_path="/dbfs/path/to/ray_collected_logs"
)
# Pass any custom Ray configuration with ray.init
ray.init(ignore_reinit_error=True)
Csatlakozás távoli Ray-fürthöz Ray-ügyféllel
A Ray 2.3.0-s és újabb verzióiban létrehozhat egy Ray-fürtöt a setup_ray_cluster API-val, és ugyanabban a jegyzetfüzetben meghívhatja a ray.init() API-t a Ray-fürthöz való csatlakozáshoz. A távoli kapcsolati sztring beszerzéséhez használja a következőket:
from ray.util.spark import setup_ray_cluster
_, remote_conn_str = setup_ray_cluster(num_worker_nodes=2, ...)
Ezután csatlakoztathatja a távoli fürtöt a fenti távoli kapcsolati sztring:
import ray
ray.init(remote_conn_str)
A Ray-ügyfél nem támogatja a ray.data modulban definiált Ray-adathalmaz API-t. Áthidaló megoldásként becsomagolhatja a Ray-adathalmaz API-t meghívó kódot egy távoli Ray-feladaton belül, ahogyan az a következő kódban látható:
import ray
import pandas as pd
# Note: This must be run in the same VPC/network as the Spark cluster
# so it can reach this address
ray.init("ray://<ray_head_node_ip>:10001")
@ray.remote
def ray_data_task():
p1 = pd.DataFrame({'a': [3,4] * 10000, 'b': [5,6] * 10000})
ds = ray.data.from_pandas(p1)
return ds.repartition(4).to_pandas()
ray.get(ray_data_task.remote())
## Connecting the Ray Cluster to the Ray Job CLI
For many developers moving from self-managed Ray solutions to a <Databricks> solution, there is often existing infrastructure tooling built based on the Ray CLI tools. While <Databricks> currently does not support Ray Cluster CLI integration, the Ray Job CLI can be connected through the driver proxy to the Ray cluster running on <Databricks>. For example:
``` shell
ray job submit --headers '{"cookie" : "DATAPLANE_DOMAIN_SESSIONID=<REDACTED>"}' --address 'https://<DATABRICKS WORKSPACE URL>/driver-proxy/o/<etc>' --working-dir='.' -- python run_task.py
A konfigurálni kívánt értékek az Azure Databricks-munkaterület URL-címe, kezdve a következővel https://
, majd a /driver-proxy/o/
Ray-fürt elindítása után megjelenő Ray-irányítópult proxy URL-címében található értékek.
A Ray-feladat parancssori felülete a feladatok külső rendszerekből származó Ray-fürtbe való küldéséhez használható, de nem szükséges a feladatokNak az Azure Databricksben lévő Ray-fürtökön való beküldéséhez. Javasoljuk, hogy a feladatot az Azure Databricks-feladatok, az alkalmazásonkénti Ray-fürt és a meglévő Azure Databricks-eszközök, például az Azure Databricks-eszközcsomagok vagy a munkafolyamat-eseményindítók használatával helyezze üzembe a feladat aktiválásához.
Naplókimeneti hely beállítása
Az argumentumot collect_log_to_path
beállíthatja annak a célútnak a megadásához, ahová a Ray-fürt naplóit be szeretné gyűjteni. A naplógyűjtés a Ray-fürt leállítása után fut.
Az Azure Databricks azt javasolja, hogy az Apache Spark-fürt leállítása esetén is állítsunk be egy elérési utat a Unity Catalog volume elérési útjával /dbfs/
vagy a Unity Catalog Kötet elérési útjával. Ellenkező esetben a naplók nem állíthatók helyre, mivel a fürt helyi tárolója a fürt leállításakor törlődik.
A Ray-fürt létrehozása után bármely Ray-alkalmazáskódot futtathat közvetlenül a jegyzetfüzetben. Kattintson a Ray-fürt irányítópultjának megnyitására egy új lapon a fürt Ray-irányítópultjának megtekintéséhez.
Stack traces és flame graphs engedélyezése a Ray Dashboard Actors oldalon
A Ray Dashboard Actors oldalán megtekintheti az aktív Ray-színészek veremnyomait és lánggráfjait. Az információk megtekintéséhez a következő paranccsal telepítse a py-spyt a Ray-fürt elindítása előtt:
%pip install py-spy
Ajánlott eljárások létrehozása és konfigurálása
Ez a szakasz a Ray-fürtök létrehozásának és konfigurálásának ajánlott eljárásait ismerteti.
Nem GPU-alapú számítási feladatok
A Ray-fürt egy Azure Databricks Spark-fürt tetején fut. Egy tipikus forgatókönyv egy Spark-feladat és a Spark UDF használata egyszerű, GPU-erőforrásokat nem igénylő adatelőfeldolgozási feladatok végrehajtására. Ezután a Ray használatával bonyolult gépi tanulási feladatokat futtathat, amelyek a GPU-k előnyeit élvezik. Ebben az esetben az Azure Databricks azt javasolja, hogy az Apache Spark-fürtszintű konfigurációs paraméter spark.task.resource.gpu.amount értékét 0 értékre állítsa, hogy az Összes Apache Spark DataFrame-átalakítás és az Apache Spark UDF-végrehajtás ne használjon GPU-erőforrásokat.
Ennek a konfigurációnak az előnyei a következők:
- Ez növeli az Apache Spark-feladatok párhuzamosságát, mivel a GPU-példány típusa általában sokkal több processzormaggal rendelkezik, mint a GPU-eszközök.
- Ha az Apache Spark-fürt több felhasználóval van megosztva, ez a konfiguráció megakadályozza, hogy az Apache Spark-feladatok párhuzamosan futó Ray-számítási feladatokkal versenyezzenek GPU-erőforrásokért.
Az oktató MLflow-integrációjának letiltása transformers
, ha a Ray-feladatokban használja
A transformers
tréner MLflow-integrációja alapértelmezés szerint engedélyezve van a transformers
kódtáron belül. Ha Ray-betanít a transformers
modell finomhangolásához, a Ray-feladatok hitelesítő adatok hibája miatt meghiúsulnak. Ez a probléma azonban nem érvényes, ha közvetlenül az MLflow-t használja a betanításhoz.
A probléma elkerülése érdekében az Apache Spark-fürt indításakor az DISABLE_MLFLOW_INTEGRATION
Azure Databricks-fürt konfigurációjából "TRUE" értékre állíthatja a környezeti változót.
A Ray távoli függvényválasztási hibájának elhárítása
A Ray-feladatok futtatásához Ray kiválasztja a feladatfüggvényt. Ha a pácolás sikertelen, diagnosztizálnia kell, hogy a kód melyik része okozza a hibát. A pácolásos hibák gyakori okai a külső hivatkozások, a lezárások és az állapotalapú objektumokra mutató hivatkozások kezelése. A feladatfüggvény-deklaráción belüli importálási utasítások áthelyezésével az ellenőrzés és a gyors javítás egyik legegyszerűbb hibája orvosolható.
Például egy széles körben használt függvény, datasets.load_dataset
amelyet az Azure Databricks Runtime illesztőoldalán javítunk, így a referencia nem érhető el. A probléma megoldásához egyszerűen írja meg a feladatfüggvényt az alábbiak szerint:
def ray_task_func():
from datasets import load_dataset # import the function inside task function
...
A Ray memóriafigyelő letiltása, ha a Ray-feladat váratlanul memóriahiányos (OOM) hibával leáll
A Ray 2.9.3-ban a Ray memóriamonitor számos ismert problémával rendelkezik, amelyek miatt a Ray-feladatok véletlenül ok nélkül leállhatnak.
A probléma megoldásához letilthatja a Ray memóriafigyelőt úgy, hogy 0
a környezeti változót RAY_memory_monitor_refresh_ms
az Azure Databricks-fürt konfigurációjába állítja az Apache Spark-fürt indításakor.
Átalakítási függvények alkalmazása adatkötegekre
Ha kötegekben dolgoz fel adatokat, javasoljuk, hogy a Ray Data API-t használja a map_batches
függvénnyel. Ez a megközelítés hatékonyabb és skálázhatóbb lehet, különösen nagy adathalmazok vagy összetett számítások esetében, amelyek kihasználják a kötegelt feldolgozás előnyeit. Bármely Spark DataFrame átalakítható Ray-adatkészletté az ray.data.from_spark
API használatával. Az átalakítási API meghívásának feldolgozott kimenete az API ray.data.write_databricks_table
használatával írható ki az Azure Databricks UC-táblákba.
MLflow használata Ray-feladatokban
Az MLflow Ray-feladatokban való használatához a következőkre lesz szükség:
- Adja meg az Azure Databricks MLflow hitelesítő adatait a Ray-feladatokban.
- Az MLflow létrehozása az Apache Spark-illesztőprogramon belül fut, és átadja a létrehozott
run_id
elemet a Ray-feladatoknak.
Az alábbi példakód bemutatja, hogyan teheti ezt meg:
import mlflow
import ray
from mlflow.utils.databricks_utils import get_databricks_env_vars
mlflow_db_creds = get_databricks_env_vars("databricks")
experiment_name = "/Users/<your-name> <Databricks>.com/mlflow_test"
mlflow.set_experiment(experiment_name)
@ray.remote
def ray_task(x, run_id):
import os
os.environ.update(mlflow_db_creds)
mlflow.set_experiment(experiment_name)
# We need to use the run created in <AS> driver side,
# and set `nested=True` to make it a nested run inside the
# parent run.
with mlflow.start_run(run_id=run_id, nested=True):
mlflow.log_metric(f"task_{x}_metric", x)
return x
with mlflow.start_run() as run: # create MLflow run in <AS> driver side.
results = ray.get([ray_task.remote(x, run.info.run_id) for x in range(10)])
Jegyzetfüzet-hatókörű Python-kódtárak vagy fürt Python-kódtárak használata a Ray-feladatokban
A Ray jelenleg egy ismert problémával rendelkezik, amely miatt a Ray-feladatok nem használhatnak jegyzetfüzet-hatókörű Python-kódtárakat vagy fürt python-kódtárakat. Ha további függőségeket szeretne használni a Ray-feladatokban, manuálisan kell telepítenie a kódtárakat a %pip
magic paranccsal, mielőtt elindít egy Ray-on-Spark-fürtöt, amely ezeket a függőségeket fogja használni a feladatokon belül. Ha például frissíteni szeretné a Ray-fürt indításához használt verzióját, futtassa a következő parancsot a jegyzetfüzetben:
%pip install ray==<The Ray version you want to use> --force-reinstall
Ezután futtassa a következő parancsot a jegyzetfüzetben a Python-kernel újraindításához:
dbutils.library.restartPython()