Я хотел бы обучить CNN на наборе данных CIFAR10 с цепочкой на нескольких графических процессорах на одном узле. Я попытался адаптировать этот пример для использования ParallelUpdater в способом, идентичным параллельному примеру данных mnist но производительность обучения была очень низкой - медленнее, чем обучение на одном графическом процессоре, хотя использовались все 8 графических процессоров. Я перешел на MultiprocessUpdater, и производительность (итеров в секунду) стала намного лучше.
Плохой:
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)
Хорошо:
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 графическими процессорами, используя ParallelUpdater, но производительность также была очень низкой: https://github.com/mitmul/chainer-cifar10/blob/master/train.py
У меня вопрос: как добиться хорошей производительности от ParallelUpdater и что я могу с ним делать не так?
Спасибо!