프로파일 러를 사용하여 TensorFlow 성능 최적화

이 가이드는 TensorFlow 프로파일 러에서 사용할 수있는 도구를 사용하여 TensorFlow 모델의 성능을 추적하는 방법을 보여줍니다. 모델이 호스트 (CPU), 장치 (GPU) 또는 호스트와 장치의 조합에서 어떻게 작동하는지 이해하는 방법을 배웁니다.

프로파일 링은 모델에서 다양한 TensorFlow 작업 (운영)의 하드웨어 리소스 소비 (시간 및 메모리)를 이해하고 성능 병목 현상을 해결하고 궁극적으로 모델을 더 빠르게 실행하는 데 도움이됩니다.

이 가이드는 프로파일 러 설치 방법, 사용 가능한 다양한 도구, 프로파일 러가 성능 데이터를 수집하는 다양한 모드, 모델 성능을 최적화하기위한 몇 가지 권장 모범 사례를 안내합니다.

당신이 클라우드 TPU에에서 모델의 성능을 프로파일 링하려면 참조 클라우드 TPU 가이드 .

프로파일 러 및 GPU 필수 구성 요소 설치

pip로 TensorBoard 용 프로파일 러 플러그인을 설치합니다. Profiler에는 최신 버전의 TensorFlow 및 TensorBoard (> = 2.2)가 필요합니다.

pip install -U tensorboard_plugin_profile

GPU에서 프로파일 링하려면 다음을 수행해야합니다.

  1. 만남에 나와있는 엔비디아 GPU 드라이버와 CUDA® 툴킷 요구 사항 TensorFlow GPU 지원 소프트웨어 요구 사항을 .
  2. 있는지 확인 NVIDIA® CUDA® 프로파일 링 도구 인터페이스 (CUPTI)가 경로에 존재 :

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

당신이 경로에 CUPTI이없는 경우에 그것의 설치 디렉토리 앞에 추가 $LD_LIBRARY_PATH 실행하여 환경 변수를 :

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

그런 다음, 실행 ldconfig CUPTI 라이브러리를 찾을 수 있는지 확인하기 위해 위의 명령을 다시.

권한 문제 해결

당신이 도커 환경에서 또는 Linux에서 CUDA® 툴킷과 프로파일 링 실행하면 충분 CUPTI 권한 (관련된 문제가 발생할 수 CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). 로 이동 NVIDIA 개발자 문서 Linux에서 이러한 문제를 해결하는 방법에 대해 자세히 알아.

Docker 환경에서 CUPTI 권한 문제를 해결하려면 다음을 실행하십시오.

docker run option '--privileged=true'

프로파일 러 도구

일부 모델 데이터를 캡처 한 후에 만 나타납니다 TensorBoard의 프로필 탭에서 프로파일에 액세스 할 수 있습니다.

Profiler에는 성능 분석에 도움이되는 다양한 도구가 있습니다.

  • 개요 페이지
  • 입력 파이프 라인 분석기
  • TensorFlow 통계
  • 추적 뷰어
  • GPU 커널 통계
  • 메모리 프로필 도구
  • 포드 뷰어

개요 페이지

개요 페이지는 프로필 실행 중 모델이 어떻게 수행되었는지에 대한 최상위보기를 제공합니다. 이 페이지에는 호스트 및 모든 장치에 대한 집계 된 개요 페이지와 모델 학습 성능을 개선하기위한 몇 가지 권장 사항이 표시됩니다. 호스트 드롭 다운에서 개별 호스트를 선택할 수도 있습니다.

개요 페이지에는 다음과 같은 데이터가 표시됩니다.

영상

  • 실적 요약 : 표시 모델의 성능에 대한 높은 수준의 요약. 성능 요약은 두 부분으로 구성됩니다.

    1. 단계 시간 분석 : 평균 단계 시간을 시간이 소비되는 여러 범주로 분류합니다.

      • 컴파일 : 커널 컴파일에 소요 된 시간입니다.
      • 입력 : 입력 데이터를 읽는 데 소요 된 시간입니다.
      • 출력 : 출력 데이터를 읽는 데 소요 된 시간입니다.
      • 커널 시작 : 호스트가 커널을 시작하는 데 소요 한 시간
      • 호스트 컴퓨팅 시간 ..
      • 장치 대 장치 통신 시간.
      • 온 디바이스 컴퓨팅 시간.
      • 파이썬 오버 헤드를 포함한 다른 모든 것.
    2. 장치 계산 정밀도-16 비트 및 32 비트 계산을 사용하는 장치 계산 시간의 백분율을보고합니다.

  • 단계 시간 그래프 : 샘플링 모든 단계에 걸쳐 디스플레이 (밀리 초) 디바이스 공정 시간의 그래프. 각 단계는 시간이 소요되는 여러 범주 (다른 색상)로 나뉩니다. 빨간색 영역은 장치가 호스트의 입력 데이터를 기다리는 동안 유휴 상태에있는 단계 시간 부분에 해당합니다. 녹색 영역은 장치가 실제로 작동 한 시간을 보여줍니다.

  • 장치에 10 TensorFlow 작업 (예 GPU) : 표시 최장를 실행 한 온 - 디바이스 작전.

    각 행에는 작업의 자체 시간 (모든 작업에 소요 된 시간의 백분율), 누적 시간, 카테고리 및 이름이 표시됩니다.

  • 실행 환경 : 표시 포함하여 모델 실행 환경에 대한 높은 수준의 요약 :

    • 사용 된 호스트 수.
    • 장치 유형 (GPU / TPU).
    • 장치 코어 수.
  • 다음 단계에 대한 권장 사항 : 모델이 입력 바인딩과 도구를 권장 보고서 때 찾아 해결 모델의 성능 병목 현상을 사용할 수 있습니다.

입력 파이프 라인 분석기

TensorFlow 프로그램이 파일에서 데이터를 읽을 때 파이프 라인 방식으로 TensorFlow 그래프의 맨 위에서 시작됩니다. 읽기 프로세스는 직렬로 연결된 여러 데이터 처리 단계로 나뉩니다. 여기서 한 단계의 출력은 다음 단계의 입력입니다. 읽기 데이터의이 시스템은 입력 파이프 라인이라고합니다.

파일에서 레코드를 읽기위한 일반적인 파이프 라인에는 다음 단계가 있습니다.

  1. 파일 읽기.
  2. 파일 전처리 (선택 사항).
  3. 호스트에서 장치로 파일 전송.

비효율적 인 입력 파이프 라인은 애플리케이션 속도를 크게 저하시킬 수 있습니다. 응용 프로그램은 (는) 입력 파이프 라인에 시간의 상당 부분을 지출 할 때 입력 바인딩 간주됩니다. 입력 파이프 라인 분석기에서 얻은 통찰력을 사용하여 입력 파이프 라인이 비효율적 인 부분을 이해합니다.

입력 파이프 라인 분석기는 프로그램이 입력 바운드 여부를 즉시 알려주고 입력 파이프 라인의 모든 단계에서 성능 병목 현상을 디버그하기 위해 장치 및 호스트 측 분석을 안내합니다.

데이터 입력 파이프 라인을 최적화하기위한 권장 모범 사례는 입력 파이프 라인 성능에 대한 지침을 확인하십시오.

입력 파이프 라인 대시 보드

입력 파이프 라인 분석, 선택 프로필을 열려면 다음 도구 드롭 다운에서 input_pipeline_analyzer 선택합니다.

영상

대시 보드에는 세 가지 섹션이 있습니다.

  1. 요약 : 얼마에 의해, 만약 그렇다면, 응용 프로그램이 입력 바인딩되어 있는지 여부에 대한 정보와 전체 입력 파이프 라인을 요약합니다.
  2. 장치 측 분석 : 상세한 디스플레이 장치의 공정 시간 및 각 단계에서의 코어를 통해 입력 데이터를 기다리는 시간 소비 장치의 범위를 포함한 장치 측 분석 결과.
  3. 호스트 측의 분석 : 쇼 호스트 입력 처리 시간에 대한 분석을 포함하는 호스트 측의 상세한 분석.

입력 파이프 라인 요약

프로그램이 호스트에서 입력을 대기에 소요되는 장치 시간의 백분율을 제시 준수 입력되면 요약 보고서. 계측 된 표준 입력 파이프 라인을 사용하는 경우 도구는 대부분의 입력 처리 시간이 소요 된 위치를보고합니다.

장치 측 분석

장치 측 분석은 장치와 호스트에서 소비 한 시간 및 호스트에서 입력 데이터를 기다리는 데 소비 한 장치 시간에 대한 통찰력을 제공합니다.

  1. 단계 시간 스텝 수에 대해 도시 : 샘플링 모든 단계에 걸쳐 디스플레이 (밀리 초) 디바이스 공정 시간의 그래프. 각 단계는 시간이 소요되는 여러 범주 (다른 색상)로 나뉩니다. 빨간색 영역은 장치가 호스트의 입력 데이터를 기다리는 동안 유휴 상태였던 단계 시간 부분에 해당합니다. 녹색 영역은 장치가 실제로 작동 한 시간을 보여줍니다.
  2. 단계 시간 통계 : 장치 공정 시간의 평균, 표준 편차를보고하고, 범위 ([최소값, 최대 값).

호스트 측 분석

호스트 측의 분석은 입력 처리 시간 (소요되는 시간의 고장보고 tf.data 여러 종류로 호스트 API를 본부)

  • 필요에 따라 파일에서 데이터 읽기 : 시간, 캐싱하지 않고 파일에서 데이터를 읽기 프리 페치 및 인터리빙에 보냈다.
  • 사전에 파일에서 데이터 읽기 : 시간, 캐싱을 포함한 프리 페치 및 인터리빙, 파일 읽기 보냈다.
  • 데이터 전처리 : 시간은 이미지 압축 해제 등의 전처리 작전에 보냈다.
  • 대기열에 데이터를 장치로 전송한다 : 시간이 장치에 데이터를 전송하기 전에 인피 큐에 데이터를 넣어 보냈다.

실행 시간별로 세분화하여 각각의 입력 작전에 대한 통계와 자신의 범주를 검사하기 위해 입력 연산 통계를 확장합니다.

영상

다음 정보가 포함 된 각 항목과 함께 소스 데이터 테이블이 나타납니다.

  1. 입력 연산 : 쇼 입력 연산의 TensorFlow 연산 이름입니다.
  2. 개수 : 쇼 연산 실행 인스턴스의 총 수를 프로파일 링 기간 동안.
  3. (ms 단위) 총 시간 : 해당 인스턴스 각각에 보낸 시간의 누적 합계를 표시합니다.
  4. 총 시간 % 쇼 입력 처리에 소요 된 총 시간의 분수로 연산에 소요되는 총 시간.
  5. (ms 단위) 총 자체 시간 : 해당 인스턴스의 각에 소요되는 자체 시간의 누적 합계를 표시합니다. 여기서 자체 시간은 호출하는 함수에 소요 된 시간을 제외하고 함수 본문 내부에서 소요 된 시간을 측정합니다.
  6. 총 자체 시간 %. 총 자체 시간을 입력 처리에 소요 된 총 시간의 일부로 표시합니다.
  7. 종류. 입력 작업의 처리 범주를 표시합니다.

TensorFlow 통계

TensorFlow Stats 도구는 프로파일 링 세션 중에 호스트 또는 기기에서 실행되는 모든 TensorFlow 작업 (op)의 성능을 표시합니다.

영상

이 도구는 두 개의 창에 성능 정보를 표시합니다.

  • 상단 창에는 최대 4 개의 원형 차트가 표시됩니다.

    1. 호스트에서 각 작업의 자체 실행 시간 분포.
    2. 호스트에서 각 작업 유형의 자체 실행 시간 분포.
    3. 장치에서 각 작업의 자체 실행 시간 분포.
    4. 장치에서 각 작업 유형의 자체 실행 시간 분포.
  • 아래쪽 창에는 TensorFlow 작업에 대한 데이터를보고하는 테이블이 표시되며 각 작업에 대한 행 하나와 데이터 유형별로 하나의 열이 있습니다 (열 제목을 클릭하여 열 정렬). CSV 파일로이 테이블에서 데이터를 내보낼 위쪽 창 오른쪽에 내보내기 CSV로 버튼을 클릭합니다.

    참고 :

    • 작업에 하위 작업이있는 경우 :

      • 작업의 총 "누적"시간에는 하위 작업 내부에서 보낸 시간이 포함됩니다.

      • 작업의 총 "자체"시간에는 하위 작업 내부에서 보낸 시간이 포함되지 않습니다.

    • 작업이 호스트에서 실행되는 경우 :

      • 작업으로 인해 발생하는 장치의 총 자체 시간 비율은 0이됩니다.
      • 이 작업을 포함하여 장치에서 총 자체 시간의 누적 백분율은 0이됩니다.
    • 작업이 기기에서 실행되는 경우 :

      • 이 작업으로 인해 호스트에서 발생한 총 자체 시간의 백분율은 0이됩니다.
      • 이 작업을 포함하여 호스트에서 총 자체 시간의 누적 백분율은 0이됩니다.

원형 차트 및 표에 유휴 시간을 포함하거나 제외하도록 선택할 수 있습니다.

추적 뷰어

추적 뷰어는 다음을 보여주는 타임 라인을 표시합니다.

  • TensorFlow 모델에 의해 실행 된 작업의 기간
  • 시스템의 어느 부분 (호스트 또는 장치)이 작업을 실행했는지. 일반적으로 호스트는 입력 작업을 실행하고 학습 데이터를 전처리하여 기기로 전송하는 반면 기기는 실제 모델 학습을 실행합니다.

추적 뷰어를 사용하면 모델의 성능 문제를 식별 한 다음 해결 단계를 수행 할 수 있습니다. 예를 들어 높은 수준에서 입력 또는 모델 학습이 대부분의 시간을 차지하는지 여부를 식별 할 수 있습니다. 드릴 다운하면 실행하는 데 가장 오래 걸리는 작업을 식별 할 수 있습니다. 트레이스 뷰어는 장치 당 1 백만 개의 이벤트로 제한됩니다.

추적 뷰어 인터페이스

트레이스 뷰어를 열면 가장 최근 실행이 표시됩니다.

영상

이 화면에는 다음과 같은 주요 요소가 있습니다.

  1. 타임 라인 창 : 쇼 작전이 장치와 시간이 지남에 따라 실행 호스트.
  2. 세부 정보 창 : 타임 라인 창에서 선택한 작전을위한 쇼 추가 정보를 제공합니다.

타임 라인 창에는 다음 요소가 포함됩니다.

  1. 상단 바 : 다양한 보조 컨트롤이 포함되어 있습니다.
  2. 시간 축 : 추적의 시작 쇼 시간 기준으로합니다.
  3. 제 및 추적 라벨 : 각 섹션은 여러 트랙을 포함하고 확장 섹션을 축소하기 위해 클릭 할 수있는 왼쪽에있는 삼각형이 있습니다. 시스템의 모든 처리 요소에 대해 하나의 섹션이 있습니다.
  4. 도구의 선택은 : 같은 줌, 팬, 선택하고, 타이밍 등의 추적 뷰어와 상호 작용하기위한 다양한 도구를 포함합니다. 시간 간격을 표시하려면 타이밍 도구를 사용하십시오.
  5. 이벤트 : 이러한 연산이 실행되는 시간이나 훈련 단계로 메타 이벤트의 지속 시간을 보여줍니다.
섹션 및 트랙

추적 뷰어에는 다음 섹션이 있습니다.

  • 소자 칩의 수 및 칩 내의 디바이스 노드로 라벨링 각 디바이스 노드에 대한 하나 개의 섹션 (예를 들어, /device:GPU:0 (pid 0) ). 각 장치 노드 섹션에는 다음 트랙이 포함됩니다.
    • 단계 : 장치에서 실행 된 교육 단계의 지속 시간을 표시합니다
    • TensorFlow 옵스 : 쇼 장치에서 실행되는 작전
    • XLA 옵스 : 쇼 XLA의 작업 (OPS) XLA가 사용하는 컴파일러 경우 장치가 실행 된 (각 TensorFlow 연산은 하나 개 또는 여러 XLA 작전으로 변환되는 XLA 컴파일러는 해당 장치에서 실행 코드로 XLA 작전을 변환합니다.).
  • 호스트 컴퓨터의 CPU에서 실행되는 스레드에 대한 섹션 중 하나는, "호스트 스레드를"이라는. 섹션에는 각 CPU 스레드에 대한 하나의 트랙이 포함됩니다. 섹션 레이블과 함께 표시되는 정보는 무시할 수 있습니다.
이벤트

타임 라인 내의 이벤트는 다른 색상으로 표시됩니다. 색상 자체에는 특별한 의미가 없습니다.

추적 뷰어는 TensorFlow 프로그램에서 Python 함수 호출의 추적을 표시 할 수도 있습니다. 당신이 사용하는 경우 tf.profiler.experimental.start API를, 당신은 사용하여 추적 파이썬을 사용할 수 있습니다 ProfilerOptions 프로파일 링을 시작할 때 namedtuple을. 당신이 프로파일에 대한 샘플링 모드를 사용하는 경우 또는, 당신은 캡처 프로필 대화 상자에서 드롭 다운 옵션을 사용하여 추적 레벨을 선택할 수 있습니다.

영상

GPU 커널 통계

이 도구는 모든 GPU 가속 커널에 대한 성능 통계 및 원래 작업을 보여줍니다.

영상

이 도구는 두 개의 창에 정보를 표시합니다.

  • 상단 창에는 총 경과 시간이 가장 높은 CUDA 커널을 보여주는 원형 차트가 표시됩니다.

  • 아래쪽 창에는 고유 한 각 커널 작업 쌍에 대한 다음 데이터가 포함 된 테이블이 표시됩니다.

    • 커널 작업 쌍으로 그룹화 된 총 경과 GPU 기간의 내림차순 순위입니다.
    • 시작된 커널의 이름입니다.
    • 커널에서 사용하는 GPU 레지스터 수입니다.
    • 사용 된 공유 (정적 + 동적 공유) 메모리의 총 크기 (바이트)입니다.
    • 블록 사이즈는 다음과 같이 표현 blockDim.x, blockDim.y, blockDim.z .
    • 그리드 차원은 다음과 같이 표현 gridDim.x, gridDim.y, gridDim.z .
    • 연산 여부 사용 자격이 텐서 코어를 .
    • 커널에 Tensor Core 명령어가 포함되어 있는지 여부.
    • 이 커널을 시작한 작업의 이름입니다.
    • 이 커널 작업 쌍의 발생 수입니다.
    • 총 경과 된 GPU 시간 (마이크로 초)입니다.
    • 평균 GPU 경과 시간 (마이크로 초)입니다.
    • 최소 경과 GPU 시간 (마이크로 초)입니다.
    • 마이크로 초 단위의 최대 GPU 경과 시간입니다.

메모리 프로필 도구

메모리 프로필 도구 모니터 프로파일 링 간격 동안 장치의 메모리 사용. 이 도구를 사용하여 다음을 수행 할 수 있습니다.

  • 최대 메모리 사용량과 TensorFlow 작업에 대한 해당 메모리 할당을 정확히 찾아 내 메모리 부족 (OOM) 문제를 디버그합니다. 당신은 또한 당신이 실행할 때 발생할 수있는 OOM 문제를 디버깅 할 수 있습니다 멀티 테넌시 (Multi-tenancy) 추론.
  • 메모리 조각화 문제를 디버그합니다.

메모리 프로필 도구는 데이터를 세 섹션으로 표시합니다.

  1. 메모리 프로필 요약
  2. 메모리 타임 라인 그래프
  3. 메모리 분석 표

메모리 프로필 요약

이 섹션은 아래와 같이 TensorFlow 프로그램의 메모리 프로필에 대한 높은 수준의 요약을 표시합니다.

메모리 프로필 요약에는 6 개의 필드가 있습니다.

  1. 메모리 ID : 드롭 다운 사용 가능한 모든 장치 메모리 시스템을 나열합니다. 드롭 다운에서 보려는 메모리 시스템을 선택합니다.
  2. #Allocation : 프로파일 기간 중에 메모리 할당의 수.
  3. #Deallocation : 프로파일 구간에서 메모리 할당 해제의 개수
  4. 메모리 용량 : 당신이 선택하는 것이 메모리 시스템 (기브)에 전체 용량.
  5. 피크 힙 사용법 : (기브)에 피크 메모리 사용량 모델이 실행을 시작하기 때문이다.
  6. 피크 메모리 사용량 : (기브)에 피크 메모리 사용량 프로파일 링 간격이다. 이 필드에는 다음 하위 필드가 포함됩니다.
    1. 타임 스탬프 : 피크 메모리 사용량이 타임 라인 그래프에 발생했을 때의 타임 스탬프.
    2. 스택 예약 : (기브에서) 스택에 예약 된 메모리의 양.
    3. 힙 할당 : (기브)에 힙에 할당 된 메모리의 양.
    4. 무료 메모리 : 사용 가능한 메모리의 양 (기브에서). 메모리 용량은 스택 예약, 힙 할당 및 사용 가능한 메모리의 합계입니다.
    5. 분할 : 분할의 비율 (이하이 더 낫다). 그것은의 비율로 계산됩니다 (1 - Size of the largest chunk of free memory / Total free memory) .

메모리 타임 라인 그래프

이 섹션에는 메모리 사용량 (GiB) 및 시간에 대한 조각화 비율 (ms)이 표시됩니다.

영상

X 축은 프로파일 링 간격의 타임 라인 (ms)을 나타냅니다. 왼쪽의 Y 축은 메모리 사용량 (GiB)을 나타내고 오른쪽의 Y 축은 조각화 비율을 나타냅니다. X 축의 각 시점에서 총 메모리는 스택 (빨간색), 힙 (주황색) 및 여유 (녹색)의 세 가지 범주로 나뉩니다. 특정 타임 스탬프 위로 마우스를 가져 가면 아래와 같이 해당 시점의 메모리 할당 / 할당 해제 이벤트에 대한 세부 정보를 볼 수 있습니다.

영상

팝업 창에는 다음 정보가 표시됩니다.

  • 타임 스탬프 (MS) : 타임 라인에서 선택한 이벤트의 위치입니다.
  • 이벤트 이벤트의 종류 (또는 할당 해제).
  • requested_size (지브는) 메모리의 양을 요구 하였다. 할당 해제 이벤트의 경우 음수가됩니다.
  • allocation_size (지브)에 할당 된 메모리의 실제 양. 할당 해제 이벤트의 경우 음수가됩니다.
  • tf_op : 할당 / 해제를 요청하는 TensorFlow 연산.
  • step_id :이 이벤트가 발생한 훈련 단계를.
  • REGION_TYPE이 할당 된 메모리를위한 데이터 엔티티 유형있다. 가능한 값은 temp 임시직 들어, output 활성화 및 그라디언트 및 persist / dynamic 가중치와 상수를.
  • DATA_TYPE : 텐서 요소 유형 (예 UINT8 8 비트 부호없는 정수).
  • tensor_shape : 텐서의 형상 / 할당 해제된다.
  • memory_in_use (지브) :이 시점에서 사용되고있는 총 메모리.

메모리 분석 표

이 표는 프로파일 링 간격에서 최대 메모리 사용량 시점의 활성 메모리 할당을 보여줍니다.

영상

각 TensorFlow Op에 대해 하나의 행이 있으며 각 행에는 다음 열이 있습니다.

  • 연산 이름 : TensorFlow 연산의 이름입니다.
  • 할당 크기 (기브) :이 연산에 할당 된 메모리의 총량.
  • 요청 된 크기 (기브) :이 연산에 대한 요청 된 메모리의 총량.
  • 대상 :이 연산에 대한 할당의 수입니다.
  • 지역 유형이 할당 된 메모리가 있음 데이터 개체 타입. 가능한 값은 temp 임시직 들어, output 활성화 및 그라디언트 및 persist / dynamic 가중치와 상수를.
  • 데이터 유형 : 텐서 요소 유형.
  • 모양 : 할당 된 텐서의 모양을.

포드 뷰어

Pod 뷰어 도구는 모든 작업자의 학습 단계 분석을 보여줍니다.

영상

  • 상단 창에는 단계 번호를 선택하는 슬라이더가 있습니다.
  • 아래쪽 창에는 누적 세로 막 대형 차트가 표시됩니다. 이것은 서로 위에 배치 된 세분화 된 단계 시간 범주의 높은 수준의보기입니다. 누적 된 각 열은 고유 한 작업자를 나타냅니다.
  • 누적 된 열 위로 마우스를 가져 가면 왼쪽의 카드에 단계 분류에 대한 자세한 내용이 표시됩니다.

tf.data 병목 현상 분석

tf.data 병목 현상 분석 도구는 자동으로 병목 현상을 감지 tf.data 프로그램에 입력 파이프 라인 및 오류를 수정하는 방법에 대한 권장 사항을 제공합니다. 그것은 사용하는 모든 프로그램과 함께 작동 tf.data 플랫폼에 관계없이 (CPU / GPU / TPU)의. 그것의 분석 및 권고 사항이 기반으로하는 가이드 .

다음 단계에 따라 병목 현상을 감지합니다.

  1. 가장 많이 입력 된 호스트를 찾습니다.
  2. a의 느린 실행 찾기 tf.data 입력 파이프 라인을.
  3. 프로파일 러 추적에서 입력 파이프 라인 그래프를 재구성합니다.
  4. 입력 파이프 라인 그래프에서 임계 경로를 찾습니다.
  5. 중요한 경로에서 가장 느린 변환을 병목 현상으로 식별합니다.

성능 분석 요약, 모든 입력 파이프 라인입력 파이프 라인 그래프의 요약 : UI는 세 부분으로 나누어 져 있습니다.

성능 분석 요약

영상

이 섹션에서는 분석 요약을 제공합니다. 그것은 느린에 대해보고 tf.data 프로필에서 검출 입력 파이프 라인. 이 섹션에서는 또한 입력 바운드가 가장 많은 호스트와 최대 지연 시간이있는 가장 느린 입력 파이프 라인을 보여줍니다. 가장 중요한 것은 입력 파이프 라인의 어느 부분이 병목인지 확인하고이를 해결하는 방법입니다. 병목 현상 정보는 반복기 유형 및 긴 이름과 함께 제공됩니다.

tf.data 반복기의 긴 이름을 읽는 방법

긴 이름으로 포맷 Iterator::<Dataset_1>::...::<Dataset_n> . 긴 이름으로 <Dataset_n> 반복자 유형과 일치하고 긴 이름의 다른 데이터 세트는 하향 변환을 나타낸다.

예를 들어 다음 입력 파이프 라인 데이터 세트를 고려하십시오.

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

위 데이터 세트의 반복자의 긴 이름은 다음과 같습니다.

반복자 유형 긴 이름
범위 Iterator :: Batch :: Repeat :: Map :: Range
지도 Iterator :: Batch :: Repeat :: Map
반복 반복자 :: 배치 :: 반복
일괄 반복자 :: 배치

모든 입력 파이프 라인 요약

영상

이 섹션에서는 모든 호스트의 모든 입력 파이프 라인에 대한 요약을 제공합니다. 일반적으로 하나의 입력 파이프 라인이 있습니다. 분배 전략을 사용하는 경우, 프로그램을 실행 한 호스트 입력 파이프가 tf.data 코드 및 호스트 입력 파이프 라인 데이터를 검색하고 장치로 전송 다중 입력 장치 파이프 라인.

각 입력 파이프 라인에 대해 실행 시간의 통계를 표시합니다. 통화가 50μs보다 오래 걸리면 느린 것으로 간주됩니다.

입력 파이프 라인 그래프

영상

이 섹션에서는 실행 시간 정보가 포함 된 입력 파이프 라인 그래프를 보여줍니다. "호스트"및 "입력 파이프 라인"을 사용하여 볼 호스트 및 입력 파이프 라인을 선택할 수 있습니다. 입력 파이프 라인의 실행은 당신이 순위 드롭 다운을 사용하여 선택할 수 있습니다 내림차순으로 실행 시간으로 분류되어 있습니다.

영상

중요 경로의 노드에는 굵은 윤곽선이 있습니다. 임계 경로에서 가장 긴 자체 시간을 가진 노드 인 병목 노드는 빨간색 윤곽선으로 표시됩니다. 중요하지 않은 다른 노드에는 회색 점선 윤곽선이 있습니다.

각 노드에서 시작 시간은 실행의 시작 시간을 나타냅니다. 가 있으면 동일한 노드는 예를 들어, 여러 번 실행될 수있다 Batch 입력 파이프 라인 연산이. 여러 번 실행되면 첫 실행 시작 시간입니다.

총 시간은 실행의 벽 시간입니다. 여러 번 실행되는 경우 모든 실행의 벽 시간의 합계입니다.

자체 시간은 바로 자식 노드와 중복 시간없이 총 시간입니다.

"# Calls"는 입력 파이프 라인이 실행 된 횟수입니다.

성능 데이터 수집

TensorFlow Profiler는 TensorFlow 모델의 호스트 활동 및 GPU 추적을 수집합니다. 프로그래밍 모드 또는 샘플링 모드를 통해 성능 데이터를 수집하도록 프로파일 러를 구성 할 수 있습니다.

프로파일 링 API

다음 API를 사용하여 프로파일 링을 수행 할 수 있습니다.

  • TensorBoard Keras 콜백 (사용하여 프로그래밍 모드 tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • 사용하여 프로그래밍 모드 tf.profiler 기능 API를

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • 컨텍스트 관리자를 사용하는 프로그래밍 모드

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • 모드를 샘플링 : 주문형 사용하여 프로파일 링 수행 tf.profiler.experimental.server.start 당신의 TensorFlow 모델 실행과 gRPC 서버를 시작합니다. gRPC 서버를 시작하고 모델을 실행 한 후, 당신은 TensorBoard 프로파일 플러그인에서 캡처 프로파일 버튼을 통해 프로필을 캡처 할 수 있습니다. 위의 Install profiler 섹션의 스크립트를 사용하여 TensorBoard 인스턴스가 아직 실행되고 있지 않은 경우 시작합니다.

    예로서,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    여러 작업자를 프로파일 링하는 예 :

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

지정 캡처 프로파일 대화 상자를 사용하여 :

  • 쉼표로 구분 된 프로필 서비스 URL 또는 TPU 이름 목록입니다.
  • 프로파일 링 기간.
  • 장치, 호스트 및 Python 함수 호출 추적의 수준입니다.
  • 프로파일 러가 처음에 실패한 경우 프로파일 캡처를 재 시도 할 횟수입니다.

사용자 지정 학습 루프 프로파일 링

당신의 TensorFlow 코드에서 사용자 정의 교육 루프를 프로파일하려면 악기와 교육 루프 tf.profiler.experimental.Trace API는 프로파일에 대한 단계 경계를 표시합니다.

name 인수 단계 이름에 대한 접두사로 사용하는 경우, step_num 키워드 인수는 단계 이름에 추가하고있다 _r 키워드 인수는이 추적 이벤트가 프로파일에 의해 단계 이벤트로 처리받을 수 있습니다.

예로서,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

그러면 프로파일 러의 단계 기반 성능 분석이 활성화되고 단계 이벤트가 추적 뷰어에 표시됩니다.

확인 당신이 내 데이터 세트 반복자 포함되어 있는지 확인 tf.profiler.experimental.Trace 입력 파이프 라인의 정확한 분석에 대한 상황을.

아래 코드 스 니펫은 안티 패턴입니다.

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

사용 사례 프로파일 링

프로파일 러는 4 개의 다른 축을 따라 여러 사용 사례를 다룹니다. 일부 조합은 현재 지원되며 다른 조합은 향후 추가 될 예정입니다. 사용 사례 중 일부는 다음과 같습니다.

  • 지역 대 원격 프로파일 링 : 이들은 당신의 프로파일 링 환경을 설정하는 일반적인 두 가지 방법이 있습니다. 로컬 프로파일 링에서 프로파일 링 API는 모델이 실행중인 동일한 시스템 (예 : GPU가있는 로컬 워크 스테이션)에서 호출됩니다. 원격 프로파일 링에서 프로파일 링 API는 모델이 실행되는 다른 머신 (예 : Cloud TPU)에서 호출됩니다.
  • 여러 노동자 프로파일 : TensorFlow의 분산 교육 기능을 사용하면 여러 컴퓨터를 프로파일 링 할 수 있습니다.
  • 하드웨어 플랫폼 : 프로필의 CPU, GPU를, 그리고 TPU를.

아래 표는 위에서 언급 한 TensorFlow 지원 사용 사례에 대한 간략한 개요를 제공합니다.

프로파일 링 API 현지 여러 작업자 하드웨어 플랫폼
TensorBoard Keras 콜백 지원 지원되지 않음 지원되지 않음 CPU, GPU
tf.profiler.experimental 시작 / 정지 API 지원 지원되지 않음 지원되지 않음 CPU, GPU
tf.profiler.experimental client.trace의 API 지원 지원 지원 CPU, GPU, TPU
컨텍스트 관리자 API 지원 지원되지 않음 지원되지 않음 CPU, GPU

최적의 모델 성능을위한 모범 사례

최적의 성능을 얻으려면 TensorFlow 모델에 해당하는 다음 권장 사항을 사용하세요.

일반적으로 장치에서 모든 변환을 수행하고 플랫폼에 대해 cuDNN 및 인텔 MKL과 같은 최신 호환 라이브러리 버전을 사용하는지 확인하십시오.

입력 데이터 파이프 라인 최적화

[#input_pipeline_analyzer]의 데이터를 사용하여 데이터 입력 파이프 라인을 최적화하세요. 효율적인 데이터 입력 파이프 라인은 장치 유휴 시간을 줄여 모델 실행 속도를 크게 향상시킬 수 있습니다. 에 설명 된 모범 사례를 통합하려고 tf.data API를 함께 더 나은 성능 데이터 입력 파이프 라인을보다 효율적으로 만들기 위해 가이드 아래에 있습니다.

  • 일반적으로 순차적으로 실행할 필요가없는 작업을 병렬화하면 데이터 입력 파이프 라인을 크게 최적화 할 수 있습니다.

  • 대부분의 경우 일부 호출의 순서를 변경하거나 모델에 가장 잘 작동하도록 인수를 조정하는 것이 도움이됩니다. 입력 데이터 파이프 라인을 최적화하는 동안 학습 및 역 전파 단계없이 데이터 로더 만 벤치마킹하여 최적화의 효과를 독립적으로 정량화합니다.

  • 합성 데이터로 모델을 실행하여 입력 파이프 라인이 성능 병목인지 확인하십시오.

  • 사용 tf.data.Dataset.shard 멀티 GPU 훈련. 처리량 감소를 방지하기 위해 입력 루프의 초기에 샤딩해야합니다. TFRecords로 작업 할 때 TFRecords의 내용이 아닌 TFRecords 목록을 분할해야합니다.

  • 동적으로의 값으로 설정하여 여러 작전을 병렬화 num_parallel_calls 사용 tf.data.AUTOTUNE .

  • 의 사용 제한을 고려 tf.data.Dataset.from_generator 가 느린 순수 TensorFlow 작전에 비교되고있다.

  • 의 사용 제한을 고려 tf.py_function 가 직렬화 할 수없는 분산 TensorFlow에서 실행되도록 지원되지 않으므로.

  • 사용 tf.data.Options 입력 파이프 라인 정적 최적화를 제어 할 수 있습니다.

또한 읽기 tf.data 성능 분석 가이드 귀하의 의견 파이프 라인을 최적화에 대한 자세한 지침을.

데이터 증대 최적화

화상 데이터로 작업 할 때 사용자의 확인 데이터 보강 등, 자르기, 반전 등 공간적 변환을 적용한 다른 데이터 유형에 캐스팅 회전시킴으로써보다 효율적인

NVIDIA® DALI 사용

GPU 대 CPU 비율이 높은 시스템이있는 경우와 같은 일부 경우에는 위의 모든 최적화가 CPU주기의 제한으로 인해 발생하는 데이터 로더의 병목 현상을 제거하기에 충분하지 않을 수 있습니다.

당신은 데이터로드 라이브러리 (사용, 컴퓨터 비전 및 오디오 깊은 학습 애플리케이션을위한 엔비디아의 GPU를 고려 사용하는 경우 DALI를 데이터 파이프 라인을 가속화하기 위해).

확인 작업 : NVIDIA® DALI 지원 달리 작전의 목록 문서를.

스레딩 및 병렬 실행 사용

여러 CPU 스레드에서 실행 작전 tf.config.threading API는 빠른을 실행합니다.

TensorFlow는 기본적으로 병렬 처리 스레드 수를 자동으로 설정합니다. TensorFlow 작업을 실행하는 데 사용할 수있는 스레드 풀은 사용 가능한 CPU 스레드 수에 따라 다릅니다.

사용하여 단일 연산 최대 병렬 고속화 제어 tf.config.threading.set_intra_op_parallelism_threads . 여러 작업을 병렬로 실행하면 모두 사용 가능한 스레드 풀을 공유합니다.

당신이 (그래프 그들 사이에 감독 경로 작전) 독립적 인 비 차단 작전이있는 경우, 사용 tf.config.threading.set_inter_op_parallelism_threads 동시에 가능한 스레드 풀을 사용하여 실행합니다.

여러 가지 잡다한

엔비디아 GPU에서 작은 모델로 작업 할 때, 당신은 설정할 수 있습니다 tf.compat.v1.ConfigProto.force_gpu_compatible=True 모든 CPU 텐서를 강제로이 모델의 성능에 상당한 향상을 제공하는 CUDA 고정 된 메모리를 할당 할 수 있습니다. 그러나 알 수없는 / 매우 큰 모델에 대해이 옵션을 사용하는 동안주의를 기울이십시오. 호스트 (CPU) 성능에 부정적인 영향을 미칠 수 있습니다.

장치 성능 향상

여기와에 설명 된 모범 사례에 따라 GPU의 성능 최적화 가이드 최적화에-장치 TensorFlow 모델의 성능을.

NVIDIA GPU를 사용하는 경우 다음을 실행하여 GPU 및 메모리 사용률을 CSV 파일에 기록합니다.

nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv

데이터 레이아웃 구성

채널 정보 (예 : 이미지)가 포함 된 데이터로 작업 할 때 데이터 레이아웃 형식을 최적화하여 마지막 채널을 선호합니다 (NCHW보다 NHWC).

채널 - 마지막 데이터 형식은 개선 텐서 코어 활용 및 AMP와 결합 특히 길쌈 모델에 상당한 성능 향상을 제공합니다. NCHW 데이터 레이아웃은 여전히 ​​텐서 코어에서 작동 할 수 있지만 자동 전치 작업으로 인해 추가 오버 헤드가 발생합니다.

당신은 설정하여 NHWC 레이아웃을 선호하는 데이터 배치를 최적화 할 수 있습니다 data_format="channels_last" 같은 층에 대한 tf.keras.layers.Conv2D , tf.keras.layers.Conv3Dtf.keras.layers.experimental.preprocessing.RandomRotation .

사용 tf.keras.backend.set_image_data_format Keras 백엔드 API에 대한 기본 데이터 레이아웃 형식을 설정합니다.

L2 캐시를 최대한 활용

When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.

import ctypes

_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128

Configure GPU thread usage

The GPU thread mode decides how GPU threads are used.

Set the thread mode to gpu_private to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.

import os

os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'

Configure GPU memory options

In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.

Also, use tf.config.experimental.set_memory_growth to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.

To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.

Miscellaneous

  • Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.

  • Disable reporting OOM errors during tensor allocation in production code. Set report_tensor_allocations_upon_oom=False in tf.compat.v1.RunOptions .

  • For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.

  • Use TF Stats to find out how efficiently on-device ops run.

  • Use tf.function to perform computations and optionally, enable the jit_compile=True flag ( tf.function(jit_compile=True ). To learn more, go to Use XLA tf.function .

  • Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.

  • Keep the device compute units busy.

  • Send data to multiple devices in parallel.

  • Consider using 16-bit numerical representations , such as fp16 —the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.

Additional resources

Known limitations

Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3

TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace API.

CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1 and libcupti.so.10.1 :

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1