Как установить Ray: секреты мастеров с примерами кода

Детальное руководство по установке и настройке фреймворка Ray для распределенных вычислений. От базовой команды pip до продвинутой настройки кластера в облаке, с примерами кода для задач, акторов, Ray Data, Ray Tune и Ray Serve, а также секретами эффективного использования ресурсов.
Ray — это универсальная и высокопроизводительная платформа для распределенных вычислений и машинного обучения, которая абстрагирует сложность параллельной обработки. Установка Ray может быть простой `pip install`, но чтобы раскрыть его истинный потенциал для масштабирования задач с Python до кластера, нужно знать несколько секретов и лучших практик. Это руководство проведет вас от базовой установки до продвинутой настройки кластера, с примерами кода, которые демонстрируют мощь Ray в действии.

Базовая установка Ray на локальной машине для разработки и тестирования действительно проста. Рекомендуется использовать виртуальное окружение (venv или conda). Для большинства сценариев (распределенное исполнение Python-функций, использование Ray Tune для гиперпараметрического поиска, Ray Train для распределенного обучения) достаточно выполнить: `pip install "ray[default]"`. Флаг `[default]` устанавливает основной набор зависимостей. Для работы с машинным обучением лучше выбрать более полный вариант: `pip install "ray[air]"`, который включает в себя библиотеки Ray AI Runtime (Ray Train, Tune, Serve, Data). После установки проверьте работу в Python-интерпретаторе:
```
import ray
ray.init()
print(ray.cluster_resources())
```
Команда `ray.init()` запускает локальный Ray-кластер на вашей машине (один процесс-«голова» и рабочие процессы). Вывод покажет доступные ресурсы (CPU, GPU).

Первый секрет мастеров: настройка ресурсов при инициализации. По умолчанию Ray пытается использовать все доступные CPU. Это может мешать другим процессам. Вы можете явно указать количество CPU и GPU:
```
ray.init(num_cpus=4, num_gpus=1, ignore_reinit_error=True)
```
Параметр `ignore_reinit_error=True` полезен в интерактивных средах, таких как Jupyter Notebook, где ячейка с `ray.init()` может выполняться многократно. Для эффективного использования памяти, особенно при работе с большими объектами, настройте объектное хранилище (object store), указав объем памяти через параметр `object_store_memory`.

Сердце Ray — это декораторы `@ray.remote`. Они превращают обычные Python-функции и классы в распределенные задачи (tasks) и акторы (actors). Простой пример распараллеливания (задача):
```
@ray.remote
def slow_function(x):
 time.sleep(1)
 return x * x

# Запуск 4 задач параллельно
futures = [slow_function.remote(i) for i in range(4)]
results = ray.get(futures)  # [0, 1, 4, 9]
```
Ключевой момент: `remote` отправляет функцию на выполнение, возвращая будущий результат (future). `ray.get()` блокирует выполнение, пока все результаты не будут готовы. Это основа для параллельной обработки данных.

Для stateful-рабочих нагрузок (например, модель, которая должна обновлять свои веса) используются акторы. Актор — это удаленный класс, экземпляры которого живут на отдельных процессах. Пример простого счетчика:
```
@ray.remote
class Counter:
 def __init__(self):
 self.value = 0
 def increment(self):
 self.value += 1
 return self.value

# Создание актора
counter = Counter.remote()
# Асинхронные вызовы методов
futures = [counter.increment.remote() for _ in range(10)]
results = ray.get(futures)  # [1, 2, 3, ..., 10]
```
Секрет здесь в том, что состояние (`self.value`) защищено, так как все вызовы методов одного актора выполняются последовательно (но разные акторы работают параллельно).

Установка Ray на кластер — это где начинается настоящее масштабирование. Кластер состоит из головной ноды (head node) и рабочих нод (worker nodes). Секрет мастеров: используйте автоматическое развертывание с помощью Ray Cluster Launcher (поставляется с Ray). Вы определяете конфигурацию кластера в YAML-файле. Пример минимального `cluster.yaml`:
```
cluster_name: my-ray-cluster
provider:
 type: aws  # Также поддерживаются GCP, Azure, Kubernetes, private clouds
 region: us-west-2
auth: ...
available_node_types:
 head_node_type:
 resources: {}
 node_config:
 InstanceType: m5.large
 worker_node_type:
 min_workers: 2
 max_workers: 10
 resources: {}
 node_config:
 InstanceType: m5.large
head_node_type: head_node_type
worker_node_types:
 - worker_node_type
```
Затем, установив `ray` на локальной машине (откуда вы будете управлять кластером), вы можете запустить его: `ray up cluster.yaml`. Эта команда автоматически создаст облачные инстансы, установит на них Ray и соединит их в кластер. Чтобы отправить код на кластер, используйте `ray submit cluster.yaml your_script.py`.

Секрет эффективной работы с данными: использование Ray Datasets. Это абстракция для распределенной загрузки и преобразования данных. Установка не требует отдельного пакета (входит в `ray[default]`). Пример чтения CSV с S3 и распределенной обработки:
```
import ray
ray.init()
ds = ray.data.read_csv("s3://my-bucket/data*.csv")
# Трансформация (выполняется параллельно на всех партициях)
transformed = ds.map_batches(lambda batch: batch * 2, batch_format="pandas")
# Итерация по результатам
for batch in transformed.iter_batches():
 print(batch)
```
Ray Data автоматически разбивает данные на партиции и распределяет их по рабочим нодам.

Для машинного обучения установите полный стек AIR: `pip install "ray[air]"`. Пример использования Ray Tune для поиска гиперпараметров модели scikit-learn:
```
from ray import tune
from sklearn.ensemble import RandomForestClassifier
def train_model(config):
 # config автоматически передается из Tune
 clf = RandomForestClassifier(max_depth=config["max_depth"], n_estimators=config["n_estimators"])
 # ... обучение и оценка ...
 tune.report(accuracy=accuracy)

analysis = tune.run(
 train_model,
 config={
 "max_depth": tune.choice([5, 10, 20]),
 "n_estimators": tune.choice([50, 100, 200])
 },
 num_samples=10,
 resources_per_trial={"cpu": 2}
)
print("Best config:", analysis.best_config)
```
Секрет здесь в `resources_per_trial`, который позволяет контролировать, сколько ресурсов выделяется на каждый trial, позволяя запускать несколько trials параллельно на кластере.

Установка и настройка Ray Serve для продакшн-обслуживания моделей требует внимания к деталям. После `pip install "ray[serve]"` вы можете деплоить модель как деплоймент. Но секрет мастеров — использование runtime environments для управления зависимостями на кластере и health checks для обеспечения отказоустойчивости. Пример деплоя:
```
from ray import serve
import numpy as np
from sklearn.ensemble import RandomForestClassifier

@serve.deployment(ray_actor_options={"num_cpus": 1})
class ModelDeployment:
 def __init__(self):
 self.model = RandomForestClassifier()
 # Загрузка весов модели...
 async def __call__(self, request):
 data = await request.json()
 prediction = self.model.predict([data["input"]])
 return {"prediction": int(prediction[0])}

app = ModelDeployment.bind()
```
Затем можно запустить Serve и развернуть приложение: `serve run app:app`. Для продакшна настройте автоскейлинг деплойментов и мониторинг через встроенный дашборд Serve.

Финальный совет: мониторинг. При запуске Ray локально или на кластере автоматически запускается веб-дашборд по адресу `http://localhost:8265` (на головной ноде). На нем можно отслеживать задачи, акторы, использование ресурсов и логи. Для продакшн-мониторинга интегрируйте метрики Ray (экспортируются в Prometheus) в вашу систему observability.

Установка Ray — это лишь первый шаг. Истинная мощь раскрывается при правильной настройке ресурсов, использовании правильных абстракций (задачи, акторы, Datasets, Tune, Serve) и грамотном развертывании на кластере. Следуя этим секретам, вы превращаете Ray из библиотеки в мощный движок для распределенных вычислений, способный обрабатывать задачи от простого параллелизма до сложного ML-пайплайна в продакшне.
482 5

Комментарии (15)

avatar
75nsopjw 30.03.2026
Не раскрыта тема costs: как оценить бюджет при масштабировании в облаке?
avatar
prl0hne9fiw 31.03.2026
Пример кода для распределения обучения модели был бы идеальным дополнением.
avatar
ize6f10dot9d 31.03.2026
Полезно, но слишком коротко. Ожидал больше примеров для работы с большими данными.
avatar
axzskh 31.03.2026
Упомянули бы про установку в изолированном окружении, чтобы не было конфликтов зависимостей.
avatar
42w73tej38 01.04.2026
Интересно, а насколько Ray устойчив к сбоям нод в самодельном кластере?
avatar
p83fgu 01.04.2026
Как раз внедряем Ray в продакшен. Жду продолжения про обработку ошибок в кластере.
avatar
9smz9p 01.04.2026
Хороший структурированный материал. Помог быстро развернуть тестовый кластер.
avatar
p0ehe46hf7i 01.04.2026
Всё понятно, но хотелось бы больше деталей по мониторингу задач в веб-интерфейсе.
avatar
ep0omazcral 02.04.2026
Автору респект! Лучший гайд на русском, что я находил по этой теме.
avatar
5hpast 02.04.2026
Есть неточность в разделе про установку на Windows. Лучше использовать WSL2.
Вы просмотрели все комментарии