[TensorFlow] MirroredStrategy를 사용하여 다중 GPU 계산 수행
MirroredStrategy
TensorFlow의 계산을 복수 GPU로 실시하고 싶고, 구현 방법을 조사하고 있었지만, 꽤 힘들 것 같다. 그런 가운데, 원래의 코드를 거의 변경하지 않고 복수 GPU 처리를 가능하게 하는 API를 알았습니다.
아직 개발중이므로, 향후 기능이 추가되거나, 사양이 변경이 된다고 생각합니다만, 우선은이라고 생각해 보았으므로, 그것에 관한 리포트입니다.
다음은 MNIST의 구현 예입니다.
htps : // 기주 b. 코 m / 슈 유사 / 천사 rf w w
MirroredStrategy의 내장
Estimator에 MirroredStrategy 설정
htps //w w. 천식 rfぉw. 오 rg / ぇ r shion s / ma s te r / api_do cs / py ton / tf / 안티 b / st ribute / 느낌 dSt 등 gy
에서 언급했듯이, MirroredStrategy의 통합은 적은 변경으로 가능합니다. 즉,
MirroredStrategy
의 인스턴스를 생성하고 tf.estimator.RunConfig
를 통해 Estimator에 전달하면됩니다.distribution = tf.contrib.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(train_distribute=distribution)
classifier = tf.estimator.Estimator(model_fn=model_fn, config=config)
MirroredStrategy의 생성자는
device
인수에 사용할 장치 배열 또는 num_gpus
인수에 사용할 GPU 수를 지정할 수 있습니다. 지정하지 않으면 자동으로 감지됩니다.현재
num_gpu
에 1을 지정하면 오류가 발생했습니다. 2개 이상을 지정해야 하는 것 같습니다.input_fn의 반환 값을 Dataset으로 설정
원래 MNIST 튜토리얼 코드에서는
tf.estimator.Estimator.train()
의 input_fn
인수에 tf.estimator.inputs.numpy_input_fn
를 사용하고 있지만 MirroredStrategy를 사용하는 경우 input_fn
실제로 numpu_input_fn 그대로 실행하면,ValueError: dataset_fn() must return a tf.data.Dataset when using a DistributionStrategy.
라는 오류가 발생합니다. 위의 샘플 코드에서는 다음과 같이 Dataset으로 다시 반환하도록 변경했습니다.
class InputFnProvider:
def __init__(self, train_batch_size):
self.train_batch_size = train_batch_size
self.__load_data()
def __load_data(self):
# Load training and eval data
mnist = tf.contrib.learn.datasets.load_dataset("mnist")
self.train_data = mnist.train.images # Returns np.array
self.train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
self.eval_data = mnist.test.images # Returns np.array
self.eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)
def train_input_fn(self):
"""An input function for training"""
# Shuffle, repeat, and batch the examples.
dataset = tf.data.Dataset.from_tensor_slices(({"x": self.train_data}, self.train_labels))
dataset = dataset.shuffle(1000).repeat().batch(self.train_batch_size)
return dataset
def eval_input_fn(self):
"""An input function for evaluation or prediction"""
dataset = tf.data.Dataset.from_tensor_slices(({"x": self.eval_data}, self.eval_labels))
dataset = dataset.batch(1)
return dataset
# (中略)
# Train the model
mnist_classifier.train(
input_fn=input_fn_provider.train_input_fn,
steps=10000)
# Evaluate the model and print results
eval_results = mnist_classifier.evaluate(input_fn=input_fn_provider.eval_input_fn)
그건 그렇고, 반환 값
return dataset.make_one_shot_iterator().get_next()
그렇다면 오류가 발생합니다.
배치 크기 변경
아래에서 설명한 것처럼 현재 GPU 수에 따라 배치 크기를 변경해야합니다 (배치 크기를 GPU 수로 나눕니다). 처음 이것을 눈치채지 못하고, 병렬해도 계산 시간이 줄어들지 않아 고민했습니다.
계산 실행 예
실제로
tf.data.Dataset
를 사용하여 계산한 결과는 다음과 같습니다.우선은 GPU 사용률입니다. MirroredStrategy를 사용하지 않는 경우 :
MirroredStrategy를 사용하는 경우 :
제대로 여러 GPU가 계산에 사용되는 것 같습니다.
10000 스텝 계산했을 때의 계산 시간을 아래에 나타냅니다.
GPU 수
Batch Size
Accuracy
시간
1
100
0.9511
68.0 초
2
50
0.9515
90.6 초
늦었어요 😇
불행히도 이 코드에서는 빨라지지 않았습니다. 다른, 보다 복잡한 네트워크로 계산했을 경우는 빨라졌으므로, 이 MNIST의 코드라면 오버헤드가 많을지도 모릅니다.
요약
새로 개발중인
GeForce GTX 1080
를 사용하여 여러 GPU 계산을 시도했습니다. 아직 개발 도상으로 느껴지는 부분이 많아 사용할 때는 주의가 필요했습니다. 그러나 이것이 실현되면, 복수 GPU 계산의 구현이 꽤 간단하게 실시할 것 같기 때문에, 요점 주목입니다.
Reference
이 문제에 관하여([TensorFlow] MirroredStrategy를 사용하여 다중 GPU 계산 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shu-yusa/items/e93e934a14849541de78텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)