在 chainer 中,如何使用多个 GPU 编写 BPTT 更新程序?

In chainer, How to write BPTT updater using multiple GPUs?

我找不到示例,因为现有示例仅扩展 training.StandardUpdater,因此仅使用一个 GPU。

我假设你说的是 the ptb example of ChainerBPTTUpdater

让定制的更新器支持在多个 GPU 上学习并不简单。 MultiprocessParallelUpdater硬编码计算梯度的方式(只有目标link实现是可定制的),所以你必须复制MultiprocessParallelUpdater的整体实现并修改梯度计算部分。您必须复制和编辑的是 chainer/training/updaters/multiprocess_parallel_updater.py.

此文件中有两个部分计算梯度;一个在 _Worker.run 中,代表工作进程任务,另一个在 MultiprocessParallelUpdater.update_core 中,代表主进程任务。您必须通过修改以下两部分中从 _calc_lossbackward 的代码来使这些代码执行 BPTT:

# Change self._master into self.model for _Worker.run code
loss = _calc_loss(self._master, batch)
self._master.cleargrads()
loss.backward()

需要修改插入BPTTUpdater.update_core的代码。

您还必须注意数据迭代器。 MultiprocessParallelUpdater 接受将分发给 master/worker 进程的迭代器集。由于 ptb 示例使用自定义迭代器 (ParallelSequentialIterator),因此您必须确保这些迭代器迭代数据集的不同部分或使用单词位置的不同初始偏移量。它可能还需要自定义 ParalellSequentialIterator