您的位置:首页 > 运维架构 > 网站架构

飞桨百度架构师手把手带你零基础实践深度学习——手写数字识别 资源配置

2020-08-15 16:51 861 查看

使用GPU训练

使用GPU进行训练

  1. CPU:fluid.CPUPlace()
  2. GPU: fluid.CUDAPlace(0),四个GPU卡的编号0,1,2,3
#仅前3行代码有所变化,在使用GPU时,可以将use_gpu变量设置成True
use_gpu = False
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()

with fluid.dygraph.guard(place):  #用place作为资源进行训练
model = MNIST()
model.train()
#调用加载数据的函数
train_loader = load_data('train')

分布式训练(多卡)

两种并行计算

  • 模式并行:节省内存,应用较为受限(模型非常大,内存放不下)
  • 数据并行:飞桨框架采用(训练节点上运行供养的程序,以不同的数据训练,不同节点得到的梯度要聚合。数据进行多机多卡拆分)

实现“多GPU卡”的分布式训练

程序修改

  • 启动训练前
    获取环境变量定义额GPU序列号,对原模型进行预处理,定义多GPU训练的reader,不同ID的GPU
    加载不同的数据集
##修改1-从环境变量获取使用GPU的序号
place = fluid.CUDAPlace(fluid.dygraph.parallel.Env().dev_id)

with fluid.dygraph.guard(place):

##修改2-对原模型做并行化预处理
strategy = fluid.dygraph.parallel.prepare_context()
model = MNIST()
model = fluid.dygraph.parallel.DataParallel(model, strategy)

model.train()

#调用加载数据的函数
train_loader = load_data('train')
##修改3-多GPU数据读取,必须确保每个进程读取的数据是不同的
train_loader = fluid.contrib.reader.distributed_batch_reader(train_loader)
  • 训练过程中
    对loss进行调整,收集参数梯度
# 修改4-多GPU训练需要对Loss做出调整,并聚合不同设备上的参数梯度
avg_loss = model.scale_loss(avg_loss)
avg_loss.backward()
model.apply_collective_grads()

命令行调用

具体在哪些GPU上调用

$ python -m paddle.distributed.launch --selected_gpus=0,1,2,3 --log_dir ./mylog train_multi_gpu.py
  • paddle.distributed.launch:启动分布式运行。
  • selected_gpus:设置使用的GPU的序号(需要是多GPU卡的机器,通过命令watch nvidia-smi查看GPU的序号)。
  • log_dir:存放训练的log,若不设置,每个GPU上的训练信息都会打印到屏幕。
  • train_multi_gpu.py:多GPU训练的程序,包含修改过的train_multi_gpu()函数。

训练完成后,在指定的./mylog文件夹下会产生四个日志文件。打在一起控制台会乱掉,就放在不同的日志文件。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐