多节点EMR集群上DASK CUDA无法检测全部节点问题咨询
问题根源
LocalCUDACluster 是单节点本地集群组件,仅能调度当前Python进程所在服务器的本地GPU资源,从设计上就不支持跨节点算力调度。
你的Zeppelin Notebook默认运行在EMR主节点上,g4dn.xlarge规格单节点仅配置1块GPU,因此默认启动时只会拉起1个GPU worker。你传入n_workers=10时,代码会尝试在当前节点查找10块可用GPU,找不到自然触发报错,这是组件的正常行为,不是配置bug。
多节点Dask-CUDA集群搭建方案
前置准备
先确认所有集群节点满足以下要求:
- 所有核心节点、主节点安装版本完全一致的
dask、dask-cuda、CUDA驱动、对应Python依赖,版本差会直接导致通信失败 - 节点间安全组开放8786(scheduler通信端口)、8787(监控面板端口)的内网访问权限,无防火墙拦截
方案1:手动启动(适合快速测试)
- 选定一台节点作为调度节点(可以用主节点,也可以选任意一台核心节点),在该节点执行以下命令启动调度服务:
# 推荐用UCX协议降低跨节点GPU通信延迟,不需要的话可以去掉--protocol ucx参数 dask scheduler --protocol ucx --port 8786
如果是测试场景嫌UCX配置麻烦,可以直接执行
dask scheduler --port 8786走默认TCP协议,兼容性更好
- 逐台登录所有10台核心节点,每台节点执行以下命令启动GPU worker:
# 替换命令中的<scheduler内网IP>为你选定的调度节点的内网IP地址 dask cuda worker <scheduler内网IP>:8786
因为每台g4dn.xlarge只有1块GPU,单节点启动1个worker即可,10台节点执行完成后会凑齐10个GPU worker。
- 修改Zeppelin Notebook中的代码,连接远端调度集群,不再使用LocalCUDACluster:
from dask.distributed import Client # 替换为实际的scheduler内网IP client = Client("tcp://<scheduler内网IP>:8786") # 执行以下命令验证,正常会返回10个worker的信息 print(client.scheduler_info()['workers'])
方案2:引导动作自动部署(适合长期/生产集群)
如果不想每次重启集群都手动登录节点启动服务,可以在创建EMR集群时添加自定义引导操作,实现集群启动后自动部署Dask-CUDA服务:
- 编写引导脚本,在所有节点统一安装版本对齐的dask-cuda相关依赖
- 给调度节点配置systemd自启服务,开机自动拉起dask scheduler进程
- 给所有核心节点配置systemd自启服务,开机自动探测scheduler地址并拉起本地dask-cuda worker进程
- 集群启动完成后,Notebook直接通过固定的scheduler地址连接即可,不需要额外手动操作
常见注意事项
- 不要试图通过修改LocalCUDACluster参数实现多节点调度,该组件没有跨节点调度能力
- 如果启动worker后发现worker数量不对,优先检查节点间网络连通性、依赖版本是否一致
- 跨节点GPU任务如果出现性能瓶颈,优先检查UCX协议是否正常生效,是否自动降级到了TCP通信
内容的提问来源于stack exchange,提问作者Putt
相关产品推荐
相关产品推荐

