Запустите многоузловой кластер Ray AWS и отправьте простой скрипт python для запуска в conda env.

Что я обнаружил с 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 или что-то подобное, что было бы стыдно, так как ват-луч использовал декораторы, а актер - очень хороший способ делать что-то.


person jtm101    schedule 07.01.2021    source источник


Ответы (2)


Спасибо, что задали этот вопрос. Ваш отзыв очень важен для нас. В следующий раз, когда у вас возникнет проблема, сообщите о ней в нашем репозитории на github (https://github.com/ray-project/ray/issues/new/choose) с кодом воспроизведения и результатами, которые вы видели, чтобы мы могли отслеживать проблему, и она не потерялась. Мы также хотели бы улучшить документацию по автомасштабированию. Не могли бы вы предоставить дополнительную информацию о том, что вы хотели бы знать, и о том, как мы можем это улучшить?

Что касается вашего вопроса, я скопировал вставленные ваши файлы и каждую ночь запускал то, что вы запускали с последней версией Ray (https://docs.ray.io/en/master/installation.html#daily-releases-nightlies). Единственная разница заключалась в том, что я запустил: ray submit cluster_minimal.yml ray_test.py --start (без адреса луча и с двумя дефисами для начала, не уверен, что вы имеете в виду, предоставляя адрес луча до того, как кластер уже запущен).

Рэй выводит явную ошибку:

        (9/18) git clone pipline
    fatal: repository 'pipline' does not exist
    Shared connection to 3.5.zz.yy closed.
      New status: update-failed
      !!!
      SSH command failed.
      !!!
      
      Failed to setup head node.

Кажется, вы пытаетесь позвонить git clone pipeline, но я не уверен, что вы от этого ожидаете. Можете ли вы попробовать использовать последнюю версию Ray nightly и опубликовать здесь, какой результат вы получаете и какую версию Ray вы используете?

person Ameer Haj Ali - PhD    schedule 10.01.2021
comment
Спасибо, ameer, я опубликовал ответ выше, но он отвечает на вопрос лишь частично. Вы знаете, почему не запускаются рабочие? - person jtm101; 11.01.2021

Я выполнил следующее и установил xgboost в conda env в кластере, и это было успешным с настройкой ниже, поскольку импорт xgboost находится в кластере при запуске ray_test.py, как показано ниже (это было переделано). Я запустил его, как было предложено Амиром, с помощью следующей команды с ray, версия 1.0.0, python 3.6.12 :: Anaconda, Inc. Таким образом, это отвечает на эту часть.

Что не делает, так это запускать рабочие процессы на экземплярах aws ec2 - ›. Работников нет. Подскажите пожалуйста, почему запускает не рабочие, а только голову?

$ ray submit cluster.yaml ray_test.py --start

Это обновленный конфиг:

cluster_name: ray_cluster

min_workers: 3
max_workers: 3

# Cloud-provider specific configuration.
provider:
    type: aws
    region: eu-west-2
    # availability_zone: us-west-2b

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.


# 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

    - conda create --name ray_env
    - conda activate ray_env
    - conda install --name ray_env pip
    - pip install --upgrade pip
    - pip install ray[all]
    - conda install -c conda-forge xgboost


# Custom commands that will be run on the head node after common setup.
head_setup_commands:
    - source activate ray_env

# Custom commands that will be run on worker nodes after common setup.
worker_setup_commands:
    - source 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

Это обновленный ray_test.py:

#This imports successfully with config and conda env
import ray
import time
import xgboost




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():
    count = 0
    for i in range(100000000):
        count += 1
    printer()
    return count
        
        
@ray.remote        
def func_2():
    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():
    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()
person jtm101    schedule 11.01.2021