Разверните Ray в пользовательском кластере, используя контейнеры Docker - PullRequest
3 голосов
/ 16 апреля 2020

Этот вопрос взят непосредственно из проблемы, которую я открыл в репозитории Ray , я надеюсь получить больше информации, разместив его также здесь.

Я видел похожие вопросы в прошлом проблемы, связанные со старыми версиями Ray, и аналогичные проблемы, но поскольку они не предлагали ни четкой настройки, ни четкого решения, а, как правило, хакерского «добавив этот флаг, он работает», я решил опубликовать этот вопрос, пытаясь четко объяснить каждый маленький шаг от того, как я настраиваю Рэя, делая доступными файлы docker и определенные мной команды c и получаемые результаты, кроме подсказок, которые мне удалось собрать.

Надеюсь, что это вопрос, который стоит задать, вот он.

В чем проблема?

Несмотря на то, что все узлы кластера доступны в панели управления и не отображают никаких ошибок, выполняется ray-related python код на головном узле делает доступным только головной узел, а на узлах он начинает выводить:

WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?

Луч версии Ионная и другая системная информация (Python версия, версия TensorFlow, ОС): 3.6.5, нет (не установлена ​​в настоящее время), Ubuntu 18.04

Воспроизведение

По состоянию на название, я пытаюсь настроить Ray на пользовательском кластере, используя Docker контейнеры. Идея состоит в том, чтобы начать смачивать ноги на небольшом кластере, а затем, когда я узнаю, как использовать библиотеку, развернуть ее на кластере SLURM (, и я уже видел, что есть небольшое руководство по этому ).

Моя небольшая настройка подробно описана в репозитории, который я создал только для этого : в основном он использует docker образы, предоставленные в этом руководстве для документации и затем устанавливает другие инструменты, такие как byobu, в основном для целей отладки.

После создания ServerDockerfile я запускаю контейнер следующим образом:

docker run --shm-size=16GB -t --tty --interactive --network host experimenting_on_ray_server

Изнутри контейнера затем я Запуск луча с:

ray start --head

Будет выведено:

2020-04-15 20:08:05,148 INFO scripts.py:357 -- Using IP address xxx.xxx.xxx.xxx for this node.
2020-04-15 20:08:05,151 INFO resource_spec.py:212 -- Starting Ray with 122.61 GiB memory available for workers and up to 56.56 GiB for objects. You can adjust these settings with ray.init(memory=<bytes>, object_store_memory=<bytes>).
2020-04-15 20:08:05,629 INFO services.py:1148 -- View the Ray dashboard at localhost:8265
2020-04-15 20:08:05,633 WARNING services.py:1470 -- WARNING: The object store is using /tmp instead of /dev/shm because /dev/shm has only 17179869184 bytes available. This may slow down performance! You may be able to free up space by deleting files in /dev/shm or terminating any running plasma_store_server processes. If you are inside a Docker container, you may need to pass an argument with the flag '--shm-size' to 'docker run'.
2020-04-15 20:08:05,669 INFO scripts.py:387 -- 
Started Ray on this node. You can add additional nodes to the cluster by calling

    ray start --address='xxx.xxx.xxx.xxx:53158' --redis-password='5241590000000000'

from the node you wish to add. You can connect a driver to the cluster from Python by running

    import ray
    ray.init(address='auto', redis_password='5241590000000000')

If you have trouble connecting from a different machine, check that your firewall is configured properly. If you wish to terminate the processes that have been started, run

    ray stop

Где xxx.xxx.xxx.xxx - IP-адрес c этой машины, как Docker контейнер был запущен с опцией --network. Я не могу понять, почему появляется предупреждение, как в учебнике ray docker из документации в нем говорится Replace <shm-size> with a limit appropriate for your system, for example 512M or 2G, и здесь я использую 16 ГБ. Сколько должно быть достаточно?

На данный момент, через переадресацию портов S SH, я вижу, что приборная панель в сети и показывает следующее:

Dashboard, first step

Поскольку все это кажется номинальным, я перехожу к созданию ClientDockerfile , который на данный момент во всех отношениях идентичен серверу. Затем я запускаю его с помощью команды:

docker run --shm-size=16GB -t --tty --interactive --network host experimenting_on_ray_client

Теперь я могу запустить команду, предоставленную в головном узле, чтобы присоединить другой узел к кластеру. Поэтому я выполняю:

ray start --address='xxx.xxx.xxx.xxx:53158' --redis-password='5241590000000000'

Где снова, xxx.xxx.xxx.xxx - это IP-адрес c компьютера, на котором я запускаю контейнер head Docker с флагом --network.

Эта команда, кажется, выполняется успешно: если я теперь go на приборной панели, я вижу второй доступный узел. Здесь xxx.xxx.xxx.xxx - это IP-адрес головного узла, а yyy.yyy.yyy.yyy - это IP-адрес рабочего узла.

Dashboard, second step

Наконец, я могу попробовать выполнить код луча! Поэтому я пытаюсь выполнить код, предоставленный в документации , а в головном узле следующий код при выполнении на панели инструментов python:

import ray
ray.init(address='auto', redis_password='5241590000000000')

import time

@ray.remote
def f():
    time.sleep(0.01)
    return ray.services.get_node_ip_address()

# Get a list of the IP addresses of the nodes that have joined the cluster.
set(ray.get([f.remote() for _ in range(1000)]))

Выходы:

{'xxx.xxx.xxx.xxx'}

Но, насколько я понимаю, мы ожидали:

{'xxx.xxx.xxx.xxx', 'yyy.yyy.yyy.yyy'}

Если я запускаю тот же код на рабочем узле, я получаю совершенно другой вывод (или, скорее, отсутствие вывода) , После выполнения первых двух строк:

import ray
ray.init(address='auto', redis_password='5241590000000000')

я получаю:

2020-04-15 20:29:53,481 WARNING worker.py:785 -- When connecting to an existing cluster, _internal_config must match the cluster's _internal_config.
2020-04-15 20:29:53,486 WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?
2020-04-15 20:29:54,491 WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?
2020-04-15 20:29:55,496 WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?
2020-04-15 20:29:56,500 WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?
2020-04-15 20:29:57,505 WARNING services.py:211 -- Some processes that the driver needs to connect to have not registered with Redis, so retrying. Have you run 'ray start' on this node?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/ray/python/ray/worker.py", line 802, in init
    connect_only=True)
  File "/ray/python/ray/node.py", line 126, in __init__
    redis_password=self.redis_password)
  File "/ray/python/ray/services.py", line 204, in get_address_info_from_redis
    redis_address, node_ip_address, redis_password=redis_password)
  File "/ray/python/ray/services.py", line 187, in get_address_info_from_redis_helper
    "Redis has started but no raylets have registered yet.")
RuntimeError: Redis has started but no raylets have registered yet.

Никакой дополнительной информации на приборной панели не предоставляется, где все выглядит номинально. Я неоднократно проверял воспроизводимость проблемы, в то время как я надеялся что-то неправильно настроить в локальной сети или для двух docker образов. Два контейнера docker работают на двух разных компьютерах в одной локальной сети, то есть с IP-адресом, который выглядит как same.same.same.different.

Я также попытался воспроизвести ошибку, запустив два докера на одной машине. Проблема также отображается в этом параметре.

Какую другую информацию я могу предоставить, которая может помочь?

Обновление 1: найден новый соответствующий файл.

При поиске Файл журнала ошибок raylet, который находится по пути /tmp/ray/session_latest/logs/raylet.err, который был пустым как на сервере, так и на клиенте, а также до и после выполнения кода python, я заметил еще один журнал ошибок, который может представлять интерес для текущей проблемы.

Файл присутствует в позиции: /tmp/raylet.595a989643d2.invalid-user.log.WARNING.20200416-181435.22 и содержит следующее:

Log file created at: 2020/04/16 18:14:35
Running on machine: 595a989643d2
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
W0416 18:14:35.525002    22 node_manager.cc:574] Received NodeRemoved callback for an unknown client a4e873ae0f72e58105e16c664b3acdda83f80553.

Обновление 2: файлы raylet.out не пусты

Даже если файлы raylet.err являются пустыми как на клиенте, так и на сервере, файлы raylet.out - нет. Вот их содержание.

Сервер raylet.out Файл
I0417 05:50:03.973958    38 stats.h:62] Succeeded to initialize stats: exporter address is 127.0.0.1:8888
I0417 05:50:03.975106    38 redis_client.cc:141] RedisClient connected.
I0417 05:50:03.983482    38 redis_gcs_client.cc:84] RedisGcsClient Connected.
I0417 05:50:03.984493    38 service_based_gcs_client.cc:63] ServiceBasedGcsClient Connected.
I0417 05:50:03.985126    38 grpc_server.cc:64] ObjectManager server started, listening on port 42295.
I0417 05:50:03.989686    38 grpc_server.cc:64] NodeManager server started, listening on port 44049.
Клиент raylet.out Файл

Вот подмножество файла. Здесь представлены сотни строк, таких как эти:

I0417 05:50:32.865006    23 node_manager.cc:734] [HeartbeatAdded]: received heartbeat from unknown client id 93a2294c6c338410485494864268d8eeeaf2ecc5
I0417 05:50:32.965395    23 node_manager.cc:734] [HeartbeatAdded]: received heartbeat from unknown client id 93a2294c6c338410485494864268d8eeeaf2ecc5
...