我没有找到示例,因为现有示例仅扩展了 training.StandardUpdater,因此仅使用一个 GPU。
1 回答
我假设您正在谈论ChainerBPTTUpdater
的ptb 示例。
让定制的更新程序支持在多个 GPU 上学习并不是一件容易的事。计算梯度的MultiprocessParallelUpdater
硬编码方式(只有目标链接实现是可定制的),因此您必须复制MultiprocessParallelUpdater
和修改梯度计算部分的整体实现。您必须复制和编辑的是chainer/training/updaters/multiprocess_parallel_updater.py
.
该文件中有两部分计算梯度;一个 in_Worker.run
代表工作进程任务,另一个 inMultiprocessParallelUpdater.update_core
代表主进程任务。您必须通过修改这两部分中的从_calc_loss
到开始的代码来使这些代码执行 BPTT:backward
# 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
接受将分发到主/工作进程的迭代器集。由于 ptb 示例使用自定义迭代器 ( ParallelSequentialIterator
),因此您必须确保这些迭代器迭代数据集的不同部分或使用不同的单词位置初始偏移量。它也可能需要定制ParalellSequentialIterator
。