首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chainer: ParallelUpdater性能与MultiprocessUpdater

Chainer: ParallelUpdater性能与MultiprocessUpdater
EN

Stack Overflow用户
提问于 2018-05-04 05:38:46
回答 2查看 406关注 0票数 1

我想在一个节点上的多个GPU上用链接器在CIFAR10数据集上训练一个CNN。我尝试用与the mnist data parallel example相同的方式调整this example以使用ParallelUpdater,但是训练性能非常差--比在一个GPU上训练还要慢,即使所有8个GPU都被利用了。我换成了MultiprocessUpdater,性能(iters/sec)好多了。

不好:

代码语言:javascript
复制
num_gpus = 8
chainer.cuda.get_device_from_id(0).use()
train_iter = chainer.iterators.SerialIterator(train, batch_size)

if num_gpus > 0:
    updater = training.updater.ParallelUpdater(
        train_iter,
        optimizer,
        devices={('main' if device == 0 else str(device)): device for device in range(num_gpus)},
    )
else:
    updater = training.updater.StandardUpdater(train_iter, optimizer, device=0)

好:

代码语言:javascript
复制
num_gpus = 8

devices = range(num_gpus)

train_iters = [chainer.iterators.MultiprocessIterator(i, batch_size, n_processes=num_gpus) \
               for i in chainer.datasets.split_dataset_n_random(train, len(devices))]
test_iter = chainer.iterators.MultiprocessIterator(test, batch_size, repeat=False, n_processes=num_gpus)
device = 0 if num_gpus > 0 else -1  # -1 indicates CPU, 0 indicates first GPU device.

if num_gpus > 0:
    updater = training.updaters.MultiprocessParallelUpdater(train_iters, optimizer, devices=range(num_gpus))
else:
    updater = training.updater.StandardUpdater(train_iters[0], optimizer, device=device)

我还使用8个GPU运行了这个基准测试脚本,使用的是ParallelUpdater,但性能也非常差:https://github.com/mitmul/chainer-cifar10/blob/master/train.py

我的问题是:我如何才能从ParallelUpdater获得良好的性能,我可能会用它做错什么?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-05-04 11:24:15

使用多个GPU时,通信会有一些开销,因此每次迭代的速度可能会较慢。如果你使用数据并行的方法,你可以使用更大的批量和更大的学习率,它可以加速你的训练。

票数 1
EN

Stack Overflow用户

发布于 2018-05-04 11:33:51

我对ParallelUpdater不是很熟悉,所以我的理解可能是错误的。

我猜ParallelUpdater的目的不是为了速度性能,而是它的主要目的是有效地使用内存来计算大批量梯度。

在读取源代码时,模型更新是在python for循环中完成的,因此由于GIL (Global Interpreter Lock)机制,我猜它的计算本身并不是并行完成的。https://github.com/chainer/chainer/blob/master/chainer/training/updaters/parallel_updater.py#L118

正如所写的,如果你想通过使用多个图形处理器来获得速度性能的好处,你可以使用MultiprocessUpdater

另外,你也可以考虑使用ChainerMN,这是一个多图形处理器链接器训练的扩展库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50164206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档