Megosztás a következőn keresztül:


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_tablehaszná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()

Következő lépések