[TensorFlow] MirroredStrategy를 사용하여 다중 GPU 계산 수행

MirroredStrategy



TensorFlow의 계산을 복수 GPU로 실시하고 싶고, 구현 방법을 조사하고 있었지만, 꽤 힘들 것 같다. 그런 가운데, 원래의 코드를 거의 변경하지 않고 복수 GPU 처리를 가능하게 하는 API를 알았습니다.
  • htps //w w. 요츠베. 이 m/와 tch? v = bRM 및 Pqs 20
  • htps : // 기주 b. 코 m / 천사 rf ぉ w / 천사 rf ぉ w / t Ree /
  • htps //w w. 천식 rfぉw. 오 rg / ぇ r shion s / ma s te r / api_do cs / py ton / tf / 안티 b / st ribute / 느낌 dSt 등 gy

  • 아직 개발중이므로, 향후 기능이 추가되거나, 사양이 변경이 된다고 생각합니다만, 우선은이라고 생각해 보았으므로, 그것에 관한 리포트입니다.

    다음은 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 수로 나눕니다). 처음 이것을 눈치채지 못하고, 병렬해도 계산 시간이 줄어들지 않아 고민했습니다.
  • htps : // 기주 b. 코 m / 텐소 rf ぉ w / 만약 ls / b ぉ b / 뭐 r / 오후 ぃ 샤 l / 레 s 네 t / 레 s 네 t_ 룬_ ぉ 오 p. py
  • htps : // 기주 b. 코 m / 텐소 rf ぉ w / 만약 ls / b ぉ b / 어서 r / 오후 ぃ 샤 l / 가운데 ls / 미 sc / st 리부치 온 _ 우리 ls. py

  • 계산 실행 예



    실제로 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 계산의 구현이 꽤 간단하게 실시할 것 같기 때문에, 요점 주목입니다.

    좋은 웹페이지 즐겨찾기