YOLOv7基于Ray集群的分布式训练实现及数据集分布式共享问题求助
YOLOv7基于Ray集群的分布式训练实现及数据集分布式共享问题求助
我现在遇到了一个棘手的问题:想用Ray集群来训练YOLOv7,但没办法把数据集分发到各个节点上,想请教一下各位怎么解决这个问题。
我的操作流程和遇到的问题如下:
我使用的是rayproject/ray-ml的Docker镜像,具体步骤是:
- 在头节点启动Docker容器:
docker run --rm --shm=5.01gb --gpus all -it --network host --name ray-head rayproject/ray-ml:latest-py39-gpu
- 在头节点启动Ray集群:
ray start --head --port=6379
- 在另一台工作节点机器上启动Docker容器:
docker run --rm --shm=5.01gb --gpus all -it --network host --name ray-worker rayproject/ray-ml:latest-py39-gpu
- 让工作节点加入Ray集群:
ray start --address='<ip>:6379'
数据和代码的准备情况:
我把整个YOLOv7文件夹和数据集都复制到了头节点的容器中,只把YOLOv7文件夹复制到了工作节点的容器里。为了让数据集能通过Ray对象存储共享,我在train.py脚本里做了这些修改:
dataloader = ray.put(dataloader) dataset = ray.put(dataset) //... testloader = ray.put(testloader)
但运行后我遇到了这个错误:
raise NotImplementedError("{} cannot be pickled", self.__class__.__name__) NotImplementedError: ('{} cannot be pickled', '_MultiProcessingDataLoaderIter')
补充说明:
- 如果只在单台机器(只有头节点)上运行,训练完全正常,因为数据集就在本地;
- 如果手动把数据集复制到所有工作节点上,训练也能正常进行,但我不想这么做,希望能利用Ray对象存储来实现数据集的分布式共享,从而提升训练效率。
想请教各位:怎么正确实现Ray集群结构下的YOLOv7分布式训练,解决数据集的分布式共享问题?
备注:内容来源于stack exchange,提问作者Elif Betül BÜYÜKORHAN
相关产品推荐
相关产品推荐

