Ошибка при инициализации Ray на главном узле EC2

Я использую Ray для запуска параллельного цикла в кластере Ubuntu 14.04 на AWS EC2. Следующий скрипт Python 3 хорошо работает на моем локальном компьютере всего с 4 рабочими (импорт и локальная инициализация не учитываются): -

ray.init()           #initialize Ray

@ray.remote
def test_loop(n):
    c=tests[n,0]                            
    tout=100                
    rc=-1   

    with tmp.TemporaryDirectory() as path: #Create a temporary directory        
        for files in filelist:        #then copy in all of the 
            sh.copy(filelist,path)    #files
        txtfile=path+'/inputf.txt'    #create the external
        fileId=open(txtfile,'w')      #data input text file,
        s='Number = '+str(c)+"\n"     #write test number,           
        fileId.write(s)
        fileId.close()                #close external parameter file,
        os.chdir(path)                #and change working directory

        try:                                    #Try running simulation:
            rc=sp.call('./simulation.run',timeout=tout,stdout=sp.DEVNULL,\
        stderr=sp.DEVNULL,shell=True)           #(must use .call for timeout)
            outdat=sio.loadmat('outputf.dat')   #get the output data struct
            rt_Data=outdat.get('rt_Data')       #extract simulation output
            err=float(rt_Data[-1])              #use final value of error
        except:                                 #If system fails to execute,
            err=deferr                          #use failure default 
        #end try

        if (err<=0) or (err>deferr) or (rc!=0): 
            err=deferr                          #Catch other types of failure
    return err 

if __name__=='__main__':
    result=ray.get([test_loop.remote(n) for n in range(0,ntest)])
    print(result)

Необычный момент здесь заключается в том, что при запуске Simulation.run должен считывать другой номер теста из внешнего текстового файла. Имя файла одинаково для всех итераций цикла, но номер теста разный.

Я запустил кластер EC2, используя Ray, с количеством доступных процессоров, равным n (я надеюсь, что Ray не будет по умолчанию использовать многопоточность). Затем мне пришлось скопировать список файлов (который включает скрипт Python) с моего локального компьютера на главный узел с помощью rsync, потому что я не мог сделать это из конфигурации (см. Недавний вопрос: «Рабочие не запускаются на EC2 Рэем» ). Затем подключитесь по ssh к этому узлу и запустите сценарий. Результат - ошибка поиска файла: -

~$ python3 test_small.py
2019-04-29 23:39:27,065 WARNING worker.py:1337 -- WARNING: Not updating worker name since `setproctitle` is not installed. Install this with `pip install setproctitle` (or ray[debug]) to enable monitoring of worker processes.
2019-04-29 23:39:27,065 INFO node.py:469 -- Process STDOUT and STDERR is being redirected to /tmp/ray/session_2019-04-29_23-39-27_3897/logs.
2019-04-29 23:39:27,172 INFO services.py:407 -- Waiting for redis server at 127.0.0.1:42930 to respond...
2019-04-29 23:39:27,281 INFO services.py:407 -- Waiting for redis server at 127.0.0.1:47779 to respond...
2019-04-29 23:39:27,282 INFO services.py:804 -- Starting Redis shard with 0.21 GB max memory.
2019-04-29 23:39:27,296 INFO node.py:483 -- Process STDOUT and STDERR is being redirected to /tmp/ray/session_2019-04-29_23-39-27_3897/logs.
2019-04-29 23:39:27,296 INFO services.py:1427 -- Starting the Plasma object store with 0.31 GB memory using /dev/shm.
(pid=3917) sh: 0: getcwd() failed: No such file or directory
    2019-04-29 23:39:44,960 ERROR worker.py:1672 -- Traceback (most recent call last):
File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 909, in _process_task
self._store_outputs_in_object_store(return_object_ids, outputs)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 820, in _store_outputs_in_object_store
self.put_object(object_ids[i], outputs[i])
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 375, in put_object
self.store_and_register(object_id, value)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 309, in store_and_register
self.task_driver_id))
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 238, in get_serialization_context
_initialize_serialization(driver_id)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 1148, in _initialize_serialization
serialization_context = pyarrow.default_serialization_context()
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/serialization.py", line 326, in default_serialization_context
register_default_serialization_handlers(context)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/serialization.py", line 321, in register_default_serialization_handlers
_register_custom_pandas_handlers(serialization_context)
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/serialization.py", line 129, in _register_custom_pandas_handlers
import pandas as pd
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/__init__.py", line 42, in <module>
from pandas.core.api import *
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/core/api.py", line 10, in <module>
from pandas.core.groupby import Grouper
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py", line 49, in <module>
from pandas.core.frame import DataFrame
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 74, in <module>
from pandas.core.series import Series
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/core/series.py", line 3042, in <module>
import pandas.plotting._core as _gfx  # noqa
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/plotting/__init__.py", line 8, in <module>
from pandas.plotting import _converter
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/pandas/plotting/_converter.py", line 7, in <module>
import matplotlib.units as units
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 1060, in <module>
rcParams = rc_params()
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 892, in rc_params
fname = matplotlib_fname()
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 736, in matplotlib_fname
for fname in gen_candidates():
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 725, in gen_candidates
yield os.path.join(six.moves.getcwd(), 'matplotlibrc')
FileNotFoundError: [Errno 2] No such file or directory

During handling of the above exception, another exception occurred:

Затем проблема, кажется, повторяется для всех других рабочих и, наконец, сдаётся:

AttributeError: module 'pandas' has no attribute 'core'

  This error is unexpected and should not have happened. Somehow a worker
  crashed in an unanticipated way causing the main_loop to throw an exception,
  which is being caught in "python/ray/workers/default_worker.py".

2019-04-29 23:44:08,489 ERROR worker.py:1672 -- A worker died or was killed while executing task 000000002d95245f833cdbf259672412d8455d89.
Traceback (most recent call last):
  File "test_small.py", line 82, in <module>
result=ray.get([test_loop.remote(n) for n in range(0,ntest)])
  File "/home/ubuntu/anaconda3/lib/python3.6/site-packages/ray/worker.py", line 2184, in get
raise value
ray.exceptions.RayWorkerError: The worker died unexpectedly while executing this task.

Подозреваю, что неправильно инициализирую Ray. Я пробовал использовать ray.init (redis_address = "172.31.50.149:6379") - это был адрес redis, указанный при формировании кластера, но ошибка была более или менее такой же. Я также пробовал запустить Ray на мастере (на случай, если он нужен): -

~$ ray start --redis-address 172.31.50.149:6379 #Start Ray
2019-04-29 23:46:20,774 INFO services.py:407 -- Waiting for redis server at 172.31.50.149:6379 to respond...
2019-04-29 23:48:29,076 INFO services.py:412 -- Failed to connect to the redis server, retrying.

....так далее.


person Nick Mint    schedule 30.04.2019    source источник
comment
Похоже, здесь может быть несколько ошибок. Что касается ошибки pandas, можете ли вы попробовать pip install -U pandas или pip uninstall pandas (какую версию pandas вы используете)? Вы можете попробовать то же самое для matplotlib. Что касается ошибки sh: 0: getcwd() failed: No such file or directory, которая, вероятно, является реальной проблемой, запускаете ли вы этот сценарий из каталога, который был удален? Собственно, отличается ли структура каталогов на вашем локальном компьютере от других машин?   -  person Robert Nishihara    schedule 30.04.2019
comment
Я импортирую numpy, scipy.io, subprocess, tempfile, shutil, os, boto3 и ray. За исключением двух последних, которые я явно устанавливаю в конфигурации кластера, я предполагаю, что остальные находятся в установке Anaconda3. Я не знаю об использовании pandas или matplotlib, но, возможно, Ray ожидает, что это будет. Попробую установить их на мастере в конфиге.   -  person Nick Mint    schedule 30.04.2019
comment
Сценарий выполняется в корневом каталоге на главном компьютере, тогда как на локальном компьютере это домашний каталог виртуальной среды. Однако сценарий устанавливает по одному временному подкаталогу для каждого рабочего при запуске test_loop. Основное различие между локальной машиной и кластером заключается в том, что рабочие в последнем в основном находятся на другом узле, поэтому я надеюсь, что архитектура кластера позволит им получить доступ к рабочим каталогам на главном сервере. Если это невозможно, мне нужен способ распределения файлов данных в рабочий каталог по умолчанию для каждого рабочего.   -  person Nick Mint    schedule 30.04.2019


Ответы (1)


Установка pandas и matplotlib на главный узел, похоже, решила проблему. Теперь Рэй успешно инициализируется.

person Nick Mint    schedule 02.05.2019
comment
Я думаю, что причиной, вероятно, был неправильный адрес redis. Когда кто-то использует ssh для подключения к главному узлу, он попадает на redis ip, так что кажется, что это правильный адрес для использования для ray.init. - person Nick Mint; 03.05.2019