Ray не распространяется на все доступные процессоры в кластере

#amazon-ec2 #multiprocessing #cluster-computing #distributed-computing #ray

#amazon-ec2 #многопроцессорная обработка #кластерные вычисления #распределенные вычисления #ray

Вопрос:

Проблема, с которой я сталкиваюсь, заключается в том, что ray не будет распространяться на моих рабочих

В совокупности у меня 16 ядер, так как у меня 8 процессоров на каждом экземпляре ec2 aws ubuntu.

Однако, когда я запускаю свой лучевой кластер и отправляю свой скрипт на python, он распределяется только по 8 ядрам, поскольку показано, что используется только 8 pid.

также примечательно, что я не могу получить доступ к панели управления ray на экземпляре EC2, я получаю эту информацию только путем печати используемых идентификаторов pid.

Как мне сделать так, чтобы мой скрипт был утилизирован всеми 16 процессорами и, следовательно, показывал 16 идентификаторов, используемых для выполнения скрипта?

Это мой сценарий:

 import os
import ray
import time
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(10):
        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()
 

Это мой конфиг:

 # A unique identifier for the head node and workers of this cluster.
cluster_name: basic-ray-123454
# The maximum number of workers nodes to launch in addition to the head
# node. This takes precedence over min_workers. min_workers defaults to 0.
max_workers: 2 # this means zero workers
min_workers: 2 # this means zero workers
# Cloud-provider specific configuration.


provider:
    type: aws
    region: eu-west-2
    availability_zone: eu-west-2a

file_mounts_sync_continuously: False



auth:
    ssh_user: ubuntu
    ssh_private_key: /home/user/.ssh/aws_ubuntu_test.pem
head_node:
    InstanceType: c5.2xlarge
    ImageId: ami-xxxxxxa6b31fd2c
    KeyName: aws_ubuntu_test

    BlockDeviceMappings:
      - DeviceName: /dev/sda1
        Ebs:
          VolumeSize: 200

worker_nodes:
   InstanceType: c5.2xlarge
   ImageId: ami-xxxxx26a6b31fd2c
   KeyName: aws_ubuntu_test


file_mounts: {
  "/home/ubuntu": "/home/user/RAY_AWS_DOCKER/ray_example_2_4/conda_env.yaml"
   }

setup_commands:
  - echo "start initialization_commands"
  - sudo apt-get update
  - sudo apt-get upgrade
  - sudo apt-get install -y python-setuptools
  - sudo apt-get install -y build-essential curl unzip psmisc
  - pip install --upgrade pip
  - pip install ray[all]
  - echo "all files :"
  - ls

  # - conda install -c conda-forge xgboost


head_start_ray_commands:
  - ray stop
  - ulimit -n 65536; ray start --head --port=6379 --object-manager-port=8076 --autoscaling-config=~/ray_bootstrap_config.yaml


worker_start_ray_commands:

  - ray stop
  - ulimit -n 65536; ray start --address=$RAY_HEAD_IP:6379 --object-manager-port=8076
 

Комментарии:

1. Можете ли вы попробовать ray.get_available_resources() и убедиться, что в вашем кластере действительно 16 num_cpu? Кроме того, можете ли вы попробовать добавить print(os.get_pid()) в каждую задачу, чтобы убедиться, что одновременно выполняется только 8 задач?