Chciałbym poznać możliwe sposoby implementacji warstw normalizacji wsadowej z synchronizowaniem statystyk wsadowych podczas treningu z wieloma GPU.Sposoby implementacji warstw BN wielu GPU ze środkami synchronizującymi i zmiennymi
Caffe Być może jest kilka wariantów caffe, które mogą zrobić, jak link. Ale jeśli chodzi o warstwę BN, rozumiem, że nadal synchronizuje ona tylko wyjścia warstw, a nie środki i warianty. Może MPI może zsynchronizować środki i vary, ale myślę, że MPI jest trochę trudny do zrealizowania.
Torch Widziałem kilka uwag here i here, które pokazują running_mean i running_var mogą być synchronizowane, ale myślę, że partia myśli i partii var nie mogą lub są trudne do synchronizacji.
Tensorflow Zwykle jest to to samo, co caffe and torch. Implementacja BN dotyczy this. Wiem, że tensorflow może dystrybuować operację do dowolnego urządzenia określonego przez tf.device()
. Ale obliczanie środków i vars jest w środku warstwy BN, więc jeśli zebrać środki i vars w CPU, mój kod będzie tak:
cpu_gather = []
label_batches = []
for i in range(num_gpu):
with tf.device('/gpu:%d' % i):
with tf.variable_scope('block1', reuse=i > 0):
image_batch, label_batch = cifar_input.build_input('cifar10', train_data_path, batch_size, 'train')
label_batches.append(label_batch)
x = _conv('weights', image_batch, 3, 3, 16, _stride_arr(1))
block1_gather.append(x)
with tf.device('/cpu:0'):
print block1_gather[0].get_shape()
x1 = tf.concat(block1_gather, 0)
# print x1.get_shape()
mean, variance = tf.nn.moments(x1, [0, 1, 2], name='moments')
for i in range(num_gpu):
with tf.device('/gpu:%d' % i):
with tf.variable_scope('block2', reuse=i > 0):
shape = cpu_gather[i].get_shape().as_list()
assert len(shape) in [2, 4]
n_out = shape[-1]
beta, gamma, moving_mean, moving_var = get_bn_variables(n_out, True, True)
x = tf.nn.batch_normalization(
cpu_gather[i], mean, variance, beta, gamma, 0.00001)
x = _relu(x)
To jest tylko dla jednej BN warstwy. Do zbierania statystyk w procesorze, muszę złamać kod. Jeśli mam więcej niż 100 warstw BN, będzie to uciążliwe.
Nie jestem ekspertem w tych bibliotekach, więc może są pewne nieporozumienia, proszę wskazać moje błędy.
Nie zależy mi zbytnio na prędkości treningu. Robię segmentację obrazu, która zużywa dużo pamięci GPU, a BN potrzebuje rozsądnej wielkości partii (na przykład większej niż 16) dla stabilnych statystyk. Więc korzystanie z wielu GPU jest nieuniknione. Moim zdaniem, tensorflow może być najlepszym wyborem, ale nie mogę rozwiązać problemu z łamaniem kodu. Rozwiązanie z innymi bibliotekami również będzie mile widziane.
Każdy komentarz jest doceniany – Seven
Wygląda na to, że [sync_bn_layer] (https://github.com/yjxiong/caffe/blob/action_recog/src/caffe/layers/sync_bn_layer.cu) może to zrobić w caffe. – Seven