Масштабирование кластеров 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
: установка ядер ЦП, используемых головным узлом Raynum_gpus_head_node
: установка GPU, используемого головным узлом Rayobject_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_cluster
Azure 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.7
OBJECT_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 могут выделять не более шести узлов на ресурсы.