Поделиться через


Масштабирование кластеров Ray в Azure Databricks

Узнайте, как настроить размер кластера Ray для оптимальной производительности, включая автомасштабирование, конфигурацию головного узла, разнородные кластеры и выделение ресурсов.

Создание кластера Ray в режиме автомасштабирования

В Ray 2.8.0 и более поздних версиях кластеры Ray, запущенные в Azure Databricks, поддерживают интеграцию с автомасштабированием Azure Databricks. Эта интеграция автомасштабирования активирует автомасштабирование кластера Azure Databricks внутри среды Azure Databricks.

Чтобы включить автомасштабирование, выполните следующую команду:

Для версии Ray ниже 2.10:

from ray.util.spark import setup_ray_cluster

setup_ray_cluster(
  num_worker_nodes=8,
  autoscale=True,
)

Для ray версии 2.10 и далее:

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=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.util.spark.setup_ray_cluster API создает кластер Ray в Apache Spark. Внутри него создается фоновое задание Apache Spark. Каждая задача Apache Spark в задании создает рабочий узел Ray, а головной узел Ray создается на драйвере. Аргументы min_worker_nodes и max_worker_nodes представляют диапазон рабочих узлов Ray для создания и использования для рабочих нагрузок Ray. Если аргумент min_worker_nodes остается неопределенным, кластер Ray фиксированного размера будет запущен с max_worker_nodes числом доступных рабочих ролей. Чтобы указать количество ядер ЦП или GPU, назначенных каждому рабочему узлу Ray, задайте аргумент num_cpus_worker_node (значение по умолчанию: 1) или num_gpus_worker_node (значение по умолчанию: 0).

Для версии Ray ниже 2.10, если автомасштабирование включено, num_worker_nodes указывает максимальное количество рабочих узлов Ray. Минимальное число рабочих узлов Ray по умолчанию равно нулю. Этот параметр по умолчанию означает, что если кластер Ray неактивен, он масштабируется до нуля рабочих узлов Ray. Это может быть не идеально подходит для быстрого реагирования во всех сценариях, но это может значительно сократить затраты при включении.

В режиме автомасштабирования num_worker_nodes нельзя задать.ray.util.spark.MAX_NUM_WORKER_NODES

Следующие аргументы настраивают скорость повышения масштабирования и уменьшения.

  • autoscale_upscaling_speed представляет число узлов, которые разрешено ожидать в виде нескольких текущих узлов. Чем выше значение, тем более агрессивным увеличением. Например, если это значение равно 1.0, кластер может увеличиваться не более чем на 100 % в любое время.
  • autoscale_idle_timeout_minutes представляет количество минут, которые необходимо передать, прежде чем автомасштабирование удаляет неактивный рабочий узел. Чем меньше значение, тем более агрессивное уменьшение масштабирования.

С помощью Ray 2.9.0 и более поздней версии можно также настроить autoscale_min_worker_nodes , чтобы предотвратить масштабирование кластера Ray до нуля рабочих ролей, когда кластер Ray неактивен, что приведет к прекращению работы кластера.

Настройка ресурсов, используемых головном узлом Ray

По умолчанию для конфигурации Ray в Spark Azure Databricks ограничивает ресурсы, выделенные головному узлу Ray, следующим образом:

  • 0 ядер ЦП
  • 0 GPU
  • 128 МБ кучи памяти
  • Память хранилища объектов размером 128 МБ

Это связано с тем, что головной узел Ray обычно используется только для глобальной координации, а не для выполнения задач Ray. Ресурсы узла драйвера Apache Spark совместно используются для нескольких пользователей, поэтому параметр по умолчанию сохраняет ресурсы на стороне драйвера Apache Spark. С помощью Ray 2.8.0 и более поздних версий можно настроить ресурсы, используемые головной узлом Ray. Используйте следующие аргументы в API setup_ray_cluster:

  • num_cpus_head_node: установка ядер ЦП, используемых головным узлом Ray
  • num_gpus_head_node: установка GPU, используемого головным узлом Ray
  • object_store_memory_head_node: установка размера памяти хранилища объектов по головному узлу Ray

Поддержка разнородных кластеров

Вы можете создать кластер Ray в Spark для более эффективного и экономичного обучения и задать различные конфигурации между головным узлом и рабочими узлами Ray. Однако все рабочие узлы Ray должны иметь одинаковую конфигурацию. Кластеры Azure Databricks не полностью поддерживают разнородные кластеры, но можно создать кластер Azure Databricks с различными типами драйверов и рабочих экземпляров, задав политику кластера. Например:

{
  "node_type_id": {
    "type": "fixed",
    "value": "i3.xlarge"
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "g4dn.xlarge"
  },
  "spark_version": {
    "type": "fixed",
    "value": "13.x-snapshot-gpu-ml-scala2.12"
  }
}

Настройка конфигурации кластера Ray

Рекомендуемая конфигурация для каждого рабочего узла Ray выглядит следующим образом: минимум 4 ядра ЦП на рабочий узел Ray. Минимальное 10 ГБ кучи памяти для каждого рабочего узла Ray.

Поэтому при вызове ray.util.spark.setup_ray_clusterAzure Databricks рекомендует задать num_cpus_per_node значение больше или равно 4.

Дополнительные сведения о настройке памяти кучи для каждого рабочего узла Ray см. в следующем разделе.

Выделение памяти для рабочих узлов Ray

Каждый рабочий узел Ray использует два типа памяти: память кучи и память хранилища объектов.

Выделенный размер памяти для каждого типа определяется, как описано ниже.

Общая память, выделенная каждому рабочему узлу Ray, составляет: RAY_WORKER_NODE_TOTAL_MEMORY = (SPARK_WORKER_NODE_PHYSICAL_MEMORY / MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES * 0.8)

MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES — максимальное количество рабочих узлов Ray, которые можно запустить на рабочем узле Apache Spark. Это определяется аргументом num_cpus_per_node или num_gpus_per_node.

Если аргумент object_store_memory_per_nodeне задан, размер памяти кучи и размер памяти хранилища объектов, выделенный каждому рабочему узлу Ray, равны: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY * 0.7OBJECT_STORE_MEMORY_PER_NODE = RAY_WORKER_NODE_TOTAL_MEMORY * 0.3

Если задать аргумент object_store_memory_per_node: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY - argument_object_store_memory_per_node

Кроме того, размер памяти хранилища объектов на рабочий узел Ray ограничен общей памятью операционной системы. Максимальное значение: OBJECT_STORE_MEMORY_PER_NODE_CAP = (SPARK_WORKER_NODE_OS_SHARED_MEMORY / MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES * 0.8)

SPARK_WORKER_NODE_OS_SHARED_MEMORY/dev/shm— это размер диска, настроенный для рабочего узла Apache Spark.

Рекомендации по масштабированию

Установка номера ЦП и GPU для каждого рабочего узла Ray

Рекомендуется задать аргумент num_cpus_worker_node для количества ядер ЦП на рабочий узел Apache Spark. Аналогичным образом, настройка num_gpus_worker_node количества GPU на рабочий узел Apache Spark оптимальна. В этой конфигурации каждый рабочий узел Apache Spark запускает один рабочий узел Ray, который будет полностью использовать ресурсы каждого рабочего узла Apache Spark.

Задайте переменную RAY_memory_monitor_refresh_ms 0 среды в конфигурации кластера Azure Databricks при запуске кластера Apache Spark.

Конфигурация ресурсов памяти для гибридных рабочих нагрузок Apache Spark и Ray

Если вы запускаете гибридные рабочие нагрузки Spark и Ray в кластере Azure Databricks, Azure Databricks рекомендует уменьшить объем памяти исполнителя Spark до небольшого значения. Например, задайте spark.executor.memory 4g в конфигурации кластера Azure Databricks.

Исполнитель Apache Spark — это процесс Java, который запускает GC lazily, а кэш набора данных Apache Spark использует много памяти исполнителя Apache Spark. Это сокращает доступную память, которую может использовать Ray. Чтобы избежать потенциальных ошибок вне памяти, уменьшите конфигурацию spark.executor.memory .

Конфигурация вычислительных ресурсов для гибридных рабочих нагрузок Apache Spark и Ray

Если вы запускаете гибридные рабочие нагрузки Spark и Ray в кластере Azure Databricks, рекомендуется сделать узлы кластера или рабочие узлы Ray автоматически масштабируемыми. Например:

Если у вас есть фиксированное количество рабочих узлов, доступных для запуска кластера Azure Databricks, рекомендуется включить автоматическое масштабирование Ray-on-Spark. Если рабочие нагрузки Ray не выполняются, кластер Ray будет уменьшать масштаб, позволяя освободить ресурсы для использования задачами Apache Spark. После завершения задач Apache Spark и повторного использования Ray кластер Ray-on-Spark снова будет масштабироваться в соответствии с требованиями.

Кроме того, вы можете сделать кластеры Azure Databricks и Ray-on-spark автоматически масштабируемыми. Например, если вы настраиваете автоматически масштабируемые узлы кластера Azure Databricks на не более 10 узлов, настройте рабочие узлы Ray-on-Spark не более четырех узлов и установите один рабочий узел Ray для работы с рабочей ролью Apache Spark, рабочие нагрузки Ray могут использовать не более четырех ресурсов в такой конфигурации кластера. Сравните, что задания Apache Spark могут выделять не более шести узлов на ресурсы.