简单的代码如下(两端代码分别同时执行):
训练
import multiprocessing.managers
from multiprocessing import Queue
import time
task_queue = Queue()
def return_task():
return task_queue
class QueueManager(multiprocessing.managers.BaseManager):
pass
if __name__ == "__main__":
# 开启分布式支持
multiprocessing.freeze_support()
# 注册可以访问队列并得到结果的函数
QueueManager.register('get_task', callable=return_task)
# QueueManager.register('get_result')
manager = QueueManager(address=('192.168.0.107', 8888), authkey='password'.encode('utf-8'))
manager.start()
task = manager.get_task()
# result=manager.get_result()
# 训练开始之前最好要睡眠几秒让数据先进入缓存区域
epoch_b=0
while epoch_b<11111111111111:
epoch_b+=1
# 从队列中取出任务
# 训练代码放这里
data = task.get()
print(data.shape)
# 运算时间
time.sleep(1)
数据生成
import multiprocessing.managers
import torch
class QueueManager(multiprocessing.managers.BaseManager):
pass
if __name__ == "__main__":
# 开启分布式支持
multiprocessing.freeze_support()
# 注册可以访问队列并得到结果的函数
QueueManager.register('get_task')
# QueueManager.register('get_result', callable=return_result)
manager = QueueManager(address=('192.168.0.107', 8888), authkey='password'.encode('utf-8'))
manager.connect()
# 任务队列
task = manager.get_task()
# 结果队列
# result = manager.get_result()
# 小于m 个 batchsize 就开始放入输入 大于n个batchsize 就停止放入
data_block_name = torch.rand([20,1200,10000])
# 这里大小看内存大小
while task.qsize()<10:
print(task.qsize())
for i in data_block_name:
task.put(i)
# 根据内存调整预加载的大小
while task.qsize()>=9:
print(task.qsize())
上面是基础代码 应用代码可参考
后期会整理一个方便快捷的pytorch异步训练的完美例子