TensorFlow 워크로드 프로파일링

Cloud TPU에서 TensorFlow 모델을 프로파일링하려면 TensorBoardTPU 텐서보드 플러그인을 사용합니다. 텐서보드는 TPU VM에 사전 설치되어 있습니다. TPU 텐서보드 플러그인을 설치하고 성능 프로필을 캡처하는 방법은 Cloud TPU 도구로 모델 프로파일링을 참고하세요. 일반적인 Cloud TPU 성능 정보는 Cloud TPU 성능 가이드를 참고하세요.

자세한 내용은 텐서보드 콜백을 참조하세요.

TensorFlow 함수 성능 참고사항

Cloud TPU에서 사용 가능한 전체 텐서플로우 오퍼레이션 목록을 참조하세요.

tf.matmul

  • 피연산자 중 하나의 결과를 전치하는 것은 실질적으로 무료입니다.
  • tf.matmul은 입력 및 출력으로의 퓨전을 지원합니다. 즉, tf.matmul의 출력에 직접적으로 적용되는 활성화 함수 또는 편향의 오버헤드가 낮습니다.

tf.nn.conv_n_d, tf.nn.depthwise_conv2d, tf.nn.separable_conv2d

  • 활성화 함수의 경우 배치 및 특징 차원을 8 또는 128의 배수로 패딩합니다.
    • 최초 XLA는 모듈의 컨볼루션을 위해 가장 일반적인 배치 차원 크기를 추적합니다. 이는 정방향 컨볼루션, 활성화 기울기 컨볼루션, 커널 기울기 컨볼루션을 구분하는 데 도움이 됩니다.
    • 가장 일반적인 배치 크기가 64 이상인 경우:
      • 정방향 및 역방향 컨볼루션의 경우 배치는 128의 배수로 패딩되고 특징은 8의 배수로 패딩됩니다.
      • 기울기 업데이트 컨볼루션의 경우 배치는 8의 배수로 패딩되고 특징은 128의 배수로 패딩됩니다.
    • 가장 일반적인 배치 크기가 64 미만인 경우:
      • 정방향 및 역방향 컨볼루션의 경우 배치는 8의 배수로 패딩되고 특징은 128의 배수로 패딩됩니다.
      • 기울기 업데이트 컨볼루션의 경우 배치는 128의 배수로 패딩되고 특징은 8의 배수로 패딩됩니다.
      • 활성화 함수를 컨볼루션에 보내기 직전에 전치하는 것은 무료입니다(전치가 입력 특징과 배치 차원만 바꾸는 경우).
  • 커널의 경우 입력 특징과 출력 특징 차원은 8 또는 128의 배수로 패딩됩니다. 이에 대한 정확한 결정은 커널의 생산 함수 및 기타 소비 함수의 영향을 받습니다.
    • 커널을 컨볼루션에 보내기 직전에 전치하는 것은 무료입니다(전치가 입력 특징과 배치 차원만 바꾸는 경우).
  • 결과적으로 배치 및 특징 차원은 8 또는 128의 배수로 패딩됩니다.
    • 컨볼루션의 결과를 전치하는 것은 무료입니다(전치가 배치 및 출력 특징 차원만 바꾸는 경우).
  • tf.nn.conv_n_d는 결과, 활성화 함수 또는 커널에 대한 퓨전을 지원합니다. 즉, 출력에 직접적으로 적용되는 활성화 함수 또는 편향의 오버헤드가 낮습니다.

tf.nn.avg_pool, tf.nn.max_pool

  • 패딩 규칙 적용: 공간 차원은 배치 및 특징보다 주요합니다. 각 배치 및 특징은 8 또는 128의 배수로 패딩될 수 있습니다.
  • 일반적으로 풀링 작업의 레이아웃은 입출력 시 발생하는 컨볼루션과 일치합니다.
  • tf.nn.max _ pool의 경사 계산은 해당되는 tf.nn.avg_pool에 비해 느릴 수 있습니다. 가능하다면 최대 풀링에서 평균 풀링으로 전환하는 것을 고려해 보세요.

tf.concat, tf.slice, tf.strided_slice

  • 불필요한 슬라이스 및 연결은 피하세요. 패딩된 차원의 슬라이스 및 연결에는 훨씬 많은 비용이 소요됩니다.
    • 슬라이스 차원에 패딩 오버헤드가 없는 경우 데이터 이동이 최소화됩니다.

tf.transpose

  • tf.matmul의 피연산자 또는 그 결과를 전치하는 것은 무료입니다.
  • tf.conv_n_d의 활성화 함수를 전치하는 것은 무료입니다(배치 및 입력 특징 차원을 바꾸는 경우).
  • tf.conv_n_d의 커널을 전치하는 것은 무료입니다(입력 및 출력 특징 차원을 바꾸는 경우).
  • tf.conv_n_d의 결과를 전치하는 것은 무료입니다(배치 및 출력 특징 차원을 바꾸는 경우).

tf.batch_to_space, tf.space_to_batch, tf.space_to_depth, tf.depth_to_space

  • 패딩된 차원에서 패딩되지 않은 차원으로 데이터를 이동해야 하므로 많은 비용이 소요됩니다(그 반대의 경우도 마찬가지임).

tf.reshape

  • 패딩된 차원에서 데이터를 이동하는 경우 Cloud TPU의 구조 변경에 많은 비용이 소요됩니다.
  • 패딩 양이 많은 경우에는 호스트에서 데이터의 형태를 R1로 변경하고 기기에서 더 높은 차원 형태로 되돌리는 방법이 유용할 수 있습니다. 호스트와 기기 간의 전송을 보다 효과적으로 만들 수 있습니다.
    • 꽉 찬 매개변수를 필요에 따라 비울 수 있기 때문에 최대 메모리 사용률에 도움이 될 수 있습니다.

tf.random_uniform, tf.distributions.Bernoulli, tf.random_normal, tf.multinomial

  • 균일 또는 베르누이 분포를 위한 유사 난수 생성은 매우 빠릅니다.
  • 일반 분포의 비용이 균일 또는 베르누이 분포보다 약간 더 높습니다.
  • 범주형/다항 분포를 위한 의사 난수 생성 비용은 훨씬 높습니다.

tf.reduce_all, tf.reduce_any, tf.reduce_logsumexp, tf.reduce_max, tf.reduce_min, tf.reduce_prod, tf.reduce_sum

  • 작업 융합을 사용하여 동일한 입력 및 출력 형태를 가진 여러 축소를 동시에 실행할 수 있습니다.
    • 가능한 경우 순차적인 연쇄 축소를 동시에 재작성해 보세요.
  • 축소는 요소별 작업을 출력이 아닌 입력에 퓨전할 수 있도록 지원합니다. 가능한 경우 표현식을 재작성하여 퓨전을 승격하세요. 예를 들면 다음과 같습니다.

        tf.multiply(tf.reduce_sum(x), y)
    

    변경 후:

        tf.reduce_sum(tf.multiply(x, y))
    

tf.nn.batch_normalization, tf.nn.fused_batch_norm, tf.layers.batch_normalization

  • XLA 컴파일러는 TensorFlow의 퓨전된 배치 정규화 변이를 효과적으로 낮출 수 있습니다. 이러한 변이를 사용하면 다른 방법보다 훨씬 효율적일 수 있습니다.

    • tf.nn.batch_normalization보다 tf.nn.fused_batch_norm을 선호합니다.
    • tf.layers.batch_normalization의 경우 '퓨전(fused)' 인수를 true로 설정합니다.