Что я обнаружил с Ray, так это то, что для автомасштабирования отсутствует документация, и что конфигурация легко ломается без четкой причины.
Сначала я хотел вытащить образ докера в кластер и запустить его, но способ, которым Ray обрабатывает образы докеров, сильно отличается от извлечения образа докера и его запуска с удаленного компьютера, даже с базовым образом файла rayproject в файле докера. Я отказался от этого подхода.
Поэтому я пробую альтернативное решение, которое состоит в том, чтобы вытащить мой конвейер из git, установить мои зависимости в conda env и запустить мой конвейер, а затем отправить мое задание script.py в кластер.
Единственный пример автомасштабирования, с которым я могу работать, - это конфигурация minimal_cluster.yaml, в которой рабочие процессы будут отображаться как запущенные на aws. Но это само по себе бесполезно, потому что мне нужно установить множество зависимостей в кластере для запуска более сложных сценариев.
имя_кластера: минимальный
initial_workers: 3
min_workers: 3
max_workers: 3
provider:
type: aws
region: eu-west-2
auth:
ssh_user: ubuntu
head_node:
InstanceType: c5.2xlarge
ImageId: latest_dlami # Default Ubuntu 16.04 AMI.
worker_nodes:
InstanceType: c5.2xlarge
ImageId: latest_dlami # Default Ubuntu 16.04 AMI.
Как только я попытаюсь добавить сложности, настройка по умолчанию будет заменена ручной, и никакие рабочие не будут инициированы, несмотря на то, что кластер лучей сообщает, что он запущен в терминале. (запуск сценария python также не инициирует рабочие процессы).
Я хочу запустить кластер, создать conda env, установить мои зависимости на conda env и скрипт python для запуска по всему кластеру, где рабочие будут фактически инициализированы на моей панели инструментов aws ec2.
например, примерно так:
cluster_name: ray_cluster
min_workers: 8
max_workers: 8
# Cloud-provider specific configuration.
provider:
type: aws
region: us-east-2
# availability_zone: us-west-2b
auth:
ssh_user: ubuntu
head_node:
InstanceType: c5.2xlarge
ImageId: ami-07c1207a9d40bc3bd # Default Ubuntu 16.04 AMI.
# Set primary volume to 50 GiB
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeSize: 50
worker_nodes:
InstanceType: c4.2xlarge
ImageId: ami-07c1207a9d40bc3bd # Default Ubuntu 16.04 AMI.
# Set primary volume to 50 GiB
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeSize: 50
# List of shell commands to run to set up nodes.
setup_commands:
# Consider uncommenting these if you run into dpkg locking issues
# - sudo pkill -9 apt-get || true
# - sudo pkill -9 dpkg || true
# - sudo dpkg --configure -a
# Install basics.
- sudo apt-get update
- sudo apt-get install -y build-essential
- sudo apt-get install curl
- sudo apt-get install unzip
# Install Node.js in order to build the dashboard.
- curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash
- sudo apt-get install -y nodejs
# Install Anaconda.
- wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh || true
- bash Anaconda3-5.0.1-Linux-x86_64.sh -b -p $HOME/anaconda3 || true
- echo 'export PATH="$HOME/anaconda3/bin:$PATH"' >> ~/.bashrc
# Build env
- git clone pipline
- conda create --name ray_env
- conda activate ray_env
- conda install --name ray_env pip
- pip install --upgrade pip
- pip install ray[all]
- conda env update -n ray_env --file conda_env.yaml
- conda install xgboost
# Custom commands that will be run on the head node after common setup.
head_setup_commands:
- conda activate ray_env
# Custom commands that will be run on worker nodes after common setup.
worker_setup_commands:
- conda activate ray_env
# Command to start ray on the head node. You don't need to change this.
head_start_ray_commands:
- ray stop
- ulimit -n 65536; ray start --head --port=6379 --autoscaling-config=~/ray_bootstrap_config.yaml
# Command to start ray on worker nodes. You don't need to change this.
worker_start_ray_commands:
- ray stop
- ulimit -n 65536; ray start --address=$RAY_HEAD_IP:6379
# If a node is idle for this many minutes, it will be removed.
idle_timeout_minutes: 5
Скрипт, который я пытаюсь запустить, выглядит так:
import os
import ray
import time
import sklearn
import xgboost
from xgboost.sklearn import XGBClassifier
def printer():
print("INSIDE WORKER " + str(time.time()) +" PID : "+ str(os.getpid()))
# decorators allow for futures to be created for parallelization
@ray.remote
def func_1():
model = XGBClassifier()
count = 0
for i in range(100000000):
count += 1
printer()
return count
@ray.remote
def func_2():
#model = XGBClassifier()
count = 0
for i in range(100000000):
count += 1
printer()
return count
@ray.remote
def func_3():
count = 0
for i in range(100000000):
count += 1
printer()
return count
def main():
model = XGBClassifier()
start = time.time()
results = []
ray.init(address='auto')
#append fuction futures
for i in range(1000):
results.append(func_1.remote())
results.append(func_2.remote())
results.append(func_3.remote())
#run in parrallel and get aggregated list
a = ray.get(results)
b = 0
#add all values in list together
for j in range(len(a)):
b += a[j]
print(b)
#time to complete
end = time.time()
print(end - start)
if __name__ == '__main__':
main()
и делаю
ray submit cluster_minimal.yml ray_test.py -start -- --ray-address='xx.31.xx.xx:6379'
Любая помощь или любой способ показать мне, как это сделать, я был бы бесконечно благодарен. Простой работающий шаблон был бы невероятно полезен. Как ничего не пробую работает. Если нет, возможно, мне придется перейти в pyspark или что-то подобное, что было бы стыдно, так как ват-луч использовал декораторы, а актер - очень хороший способ делать что-то.