Python 使用Docker容器在自定义集群上部署Ray

Python 使用Docker容器在自定义集群上部署Ray,python,docker,redis,ray,Python,Docker,Redis,Ray,这个问题是,我希望通过在这里发布它来获得更多的曝光 我在与旧版本的Ray相关的过去问题和类似问题上都看到了类似的问题,但由于它们没有提供明确的设置或解决方案,但通常是一个黑客“通过添加此标志它可以工作”,我决定发布此问题,试图清楚地解释我如何设置Ray的每一小步,使docker文件可用,以及我运行的特定命令和收到的输出,而不是我设法收集的提示 希望这是一个值得问的问题,就这样 有什么问题? 尽管仪表板中的所有集群节点都可用,并且没有显示任何错误,但在head节点上执行与光线相关的python代码

这个问题是,我希望通过在这里发布它来获得更多的曝光

我在与旧版本的Ray相关的过去问题和类似问题上都看到了类似的问题,但由于它们没有提供明确的设置或解决方案,但通常是一个黑客“通过添加此标志它可以工作”,我决定发布此问题,试图清楚地解释我如何设置Ray的每一小步,使docker文件可用,以及我运行的特定命令和收到的输出,而不是我设法收集的提示

希望这是一个值得问的问题,就这样

有什么问题? 尽管仪表板中的所有集群节点都可用,并且没有显示任何错误,但在head节点上执行与光线相关的python代码仅使head节点可用,而在节点上它开始输出:

WARNING services.py:211——驱动程序需要连接的某些进程尚未向Redis注册,因此正在重试。是否已在此节点上运行“ray start”?
Ray版本和其他系统信息(Python版本、TensorFlow版本、OS):3.6.5、无(目前未安装)、Ubuntu 18.04

繁殖 在标题中,我正在尝试使用Docker容器在自定义集群上设置Ray。我的想法是开始在一个小集群上湿脚,然后当我学习如何使用这个库时,将它部署到一个SLURM集群()

我的小设置很详细:基本上是安装它,然后安装其他工具,如byobu,主要用于调试目的

构建容器后,我启动容器,如下所示:

docker-run--shm size=16GB-t--tty--interactive--networkhost在\u-ray\u服务器上进行试验
从容器中启动ray时,我会使用:

光线开始--head
这将输出:

2020-04-15 20:08:05148信息脚本。py:357——使用此节点的IP地址xxx.xxx.xxx.xxx。
2020-04-15 20:08:05151信息资源_spec.py:212--启动光线时,工人可用的内存为122.61 GiB,对象可用的内存高达56.56 GiB。您可以使用ray.init(memory=,object\u store\u memory=)调整这些设置。
2020-04-15 20:08:05629信息服务。py:1148--在localhost:8265上查看Ray仪表板
2020-04-15 20:08:05633 WARNING services.py:1470--警告:对象存储正在使用/tmp而不是/dev/shm,因为/dev/shm只有17179869184字节可用。这可能会降低性能!您可以通过删除/dev/shm中的文件或终止任何正在运行的plasma_store_服务器进程来释放空间。如果您在Docker容器中,可能需要将带有标志“--shm size”的参数传递给“Docker run”。
2020-04-15 20:08:05669信息脚本。py:387--
已在此节点上启动光线。您可以通过调用
ray start--地址='xxx.xxx.xxx.xxx:53158'--redis密码='5241590000000000'
从要添加的节点。您可以通过运行
导入光线
ray.init(地址='auto',redis_密码='524159000000000')
如果从其他计算机连接时遇到问题,请检查防火墙是否配置正确。如果希望终止已启动的进程,请运行
射线停止
其中xxx.xxx.xxx.xxx是这台机器的公共IP,因为Docker容器已经用
--网络
选项启动。我无法理解为什么会出现警告,因为在it状态中,请将其替换为适合您的系统的限制,例如512M或2G,这里我使用的是16GB。多少钱就够了

此时,通过SSH端口转发,我可以看到仪表板处于联机状态,并显示以下内容:

因为这一切似乎都是名义上的,所以我继续构建,在这一点上,它在所有意图和目的上都与服务器相同。然后我开始运行:

docker-run--shm size=16GB-t--tty--interactive--network-host在\u-ray\u客户端上进行试验
现在,我可以运行head节点中提供的命令,将另一个节点连接到集群。因此,我执行:

ray start--address='xxx.xxx.xxx.xxx:53158'--redis password='524159000000000'
其中,
xxx.xxx.xxx.xxx
是我正在运行带有
--network
标志的head Docker容器的机器的公共IP

此命令似乎成功运行:如果现在转到仪表板,我可以看到第二个可用节点。这里
xxx.xxx.xxx.xxx
是头节点的IP,而
yyy.yyy.yyy
是工作节点的IP

最后,我可以尝试执行一些射线代码!因此,当在python仪表板中执行时,我尝试在head节点中执行以下代码:

导入光线
ray.init(地址='auto',redis_密码='524159000000000')
导入时间
@雷,遥控器
def():
睡眠时间(0.01)
return ray.services.get_node_ip_address()
#获取已加入群集的节点的IP地址列表。
设置(ray.get([f.remote(),用于范围(1000)])
产出:

{'xxx.xxx.xxx.xxx'}
但据我所知,我们期望:

{'xxx.xxx.xxx.xxx','yyy.yyy.yyy'}
如果在worker节点上运行完全相同的代码,则会得到完全不同的输出(或者更像是缺少任何输出)。执行前两行后:

导入光线
ray.init(地址='auto',redis_密码='524159000000000')
我得到:

2020-04-15 20:29:53481 WARNING worker.py:785--连接到现有群集时,_internal_配置必须与群集的_internal_配置匹配。
2020-04-15 20:29:53486警告服务。py:211--驱动程序需要连接的某些进程尚未向Redis注册,因此正在重试。是否已在此节点上运行“ray start”?
2020-04-15 20:29:54491警告服务。py:211——驾驶员需要连接到ha的一些进程