질문이있다? TensorFlow 포럼 방문 포럼 에서 커뮤니티와 연결

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

Profiler와 함께 제공되는 도구를 사용하여 TensorFlow 모델의 성능을 추적합니다. 모델이 호스트 (CPU), 장치 (GPU) 또는 호스트와 장치의 조합에서 어떻게 작동하는지 확인합니다.

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

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

Cloud TPU에서 모델 성능을 프로파일 링하려면 Cloud TPU 가이드를 참조하세요.

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

GitHub 저장소 에서 install_and_run.py 스크립트를 다운로드하고 실행하여 프로파일 러를 설치 합니다 .

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

  1. TensorFlow GPU 지원 소프트웨어 요구 사항에 나열된 NVIDIA® GPU 드라이버 및 CUDA® 툴킷 요구 사항을 충족 합니다.
  2. 경로에 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 라이브러리가 있는지 확인하십시오.

권한 문제 해결

Docker 환경 또는 Linux에서 CUDA® Toolkit으로 프로파일 링을 실행할 때 부족한 CUPTI 권한 ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES )과 관련된 문제가 발생할 수 있습니다. Linux에서 이러한 문제를 해결할 수있는 방법에 대해 자세히 알아 보려면 NVIDIA 개발자 문서 를 참조하십시오.

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

docker run option '--privileged=true'

프로파일 러 도구

일부 모델 데이터를 캡처 한 후에 만 ​​나타나는 TensorBoard의 프로필 탭에서 프로필러에 액세스합니다.

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

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

개요 페이지

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

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

영상

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

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

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

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

  • 기기에서 상위 10 개의 TensorFlow 작업- 가장 오래 실행 된 기기 내 작업을 표시합니다.

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

  • 실행 환경- 다음을 포함한 모델 실행 환경의 상위 수준 요약을 표시합니다.

    • 사용 된 호스트 수
    • 장치 유형 (GPU / TPU)
    • 장치 코어 수
  • 다음 단계에 대한 권장 사항- 모델이 입력 제한 일 때보고하고 모델 성능 병목 현상을 찾아 해결하는 데 사용할 수있는 도구를 권장합니다.

입력 파이프 라인 분석기

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

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

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

비효율적 인 입력 파이프 라인은 애플리케이션 속도를 크게 저하시킬 수 있습니다. 애플리케이션은 입력 파이프 라인에서 상당한 시간을 소비하는 경우 입력 바운드 로 간주됩니다. 입력 파이프 라인 분석기에서 얻은 통찰력을 사용하여 입력 파이프 라인이 비효율적 인 부분을 이해합니다.

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

데이터 입력 파이프 라인을 최적화하기위한 권장 모범 사례는 입력 파이프 라인 성능에 대한 지침을 참조하세요.

입력 파이프 라인 대시 보드

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

영상

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

  1. 요약- 애플리케이션이 입력 바인딩되었는지 여부에 대한 정보와 함께 전체 입력 파이프 라인을 요약합니다.
  2. 장치 측 분석- 장치 단계 시간 및 각 단계의 코어에서 입력 데이터를 기다리는 데 소요 된 장치 시간 범위를 포함하여 자세한 장치 측 분석 결과를 표시합니다.
  3. 호스트 측 분석- 호스트의 입력 처리 시간 분석을 포함하여 호스트 측에 대한 자세한 분석을 표시합니다.

입력 파이프 라인 요약

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

장치 측 분석

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

  1. 단계 번호에 대해 플로팅 된 단계 시간- 샘플링 된 모든 단계에 대한 장치 단계 시간 (밀리 초) 그래프를 표시합니다. 각 단계는 시간이 소요되는 여러 범주 (다른 색상)로 나뉩니다. 빨간색 영역은 장치가 호스트의 입력 데이터를 기다리는 동안 유휴 상태에있는 단계 시간 부분에 해당합니다. 녹색 영역은 장치가 실제로 작동 한 시간을 보여줍니다.
  2. 단계 시간 통계-장치 단계 시간 의 평균, 표준 편차 및 범위 ([최소, 최대])를보고합니다.

호스트 측 분석

호스트 측 분석은 호스트의 입력 처리 시간 ( tf.data API 작업에 소요 된 시간)을 여러 범주로 분류하여보고합니다.

  • 요청시 파일에서 데이터 읽기- 캐싱, 프리 페치 및 인터리빙없이 파일에서 데이터를 읽는 데 소요 된 시간
  • 미리 파일에서 데이터 읽기- 캐싱, 프리 페치 및 인터리빙을 포함하여 파일을 읽는 데 소요 된 시간
  • 데이터 사전 처리- 이미지 압축 해제와 같은 사전 처리 작업에 소요 된 시간
  • 장치로 전송할 데이터를 대기열에 추가-데이터를 장치로 전송하기 전에 데이터를 인피 드 대기열에 넣는 데 소요 된 시간

입력 작업 통계 를 확장하여 실행 시간별로 분류 된 개별 입력 작업 및 범주에 대한 통계 를 확인합니다.

영상

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

  1. 입력 작업-입력 작업 의 TensorFlow 작업 이름을 표시합니다.
  2. 개수- 프로파일 링 기간 동안 작업 실행의 총 인스턴스 수를 표시합니다.
  3. 총 시간 (밀리 초)- 각 인스턴스에 소요 된 시간의 누적 합계를 표시합니다.
  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 Ops- . 기기에서 실행 된 작업을 표시합니다.
    • XLA 작업-XLA가 사용 된 컴파일러 인 경우 기기에서 실행 된 XLA 작업 (작업)을 표시합니다 (각 TensorFlow 작업은 하나 이상의 XLA 작업으로 변환됩니다. XLA 컴파일러는 XLA 작업을 기기에서 실행되는 코드로 변환합니다).
  • 호스트 시스템의 CPU에서 실행되는 스레드에 대한 한 섹션 인 "호스트 스레드" . 섹션에는 각 CPU 스레드에 대한 하나의 트랙이 포함됩니다. 섹션 레이블과 함께 표시되는 정보는 무시할 수 있습니다.
이벤트

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

추적 뷰어는 TensorFlow 프로그램에서 Python 함수 호출의 추적을 표시 할 수도 있습니다. tf.profiler.experimental.start() API를 사용하는 경우 프로파일 링을 시작할 때 tf.profiler.experimental.start() 이라는 ProfilerOptions 를 사용하여 Python 추적을 활성화 할 수 있습니다. 또는 프로파일 링에 샘플링 모드를 사용하는 경우 Capture Profile 대화 상자의 드롭 다운 옵션을 사용하여 추적 수준을 선택할 수 있습니다.

영상

GPU 커널 통계

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

영상

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

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

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

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

메모리 프로필 도구

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

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

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

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

메모리 프로필 요약

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

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

  1. 메모리 ID-사용 가능한 모든 장치 메모리 시스템을 나열하는 드롭 다운입니다. 드롭 다운에서 보려는 메모리 시스템을 선택하십시오.
  2. #Allocation-프로파일 링 간격 동안 만들어진 메모리 할당 수
  3. #Deallocation-프로파일 링 간격의 메모리 할당 해제 수
  4. 메모리 용량-선택한 메모리 시스템의 총 용량 (GiB)
  5. 최대 힙 사용량-모델 실행이 시작된 이후의 최대 메모리 사용량 (GiB)
  6. 최대 메모리 사용량-프로파일 링 간격의 최대 메모리 사용량 (GiB)입니다. 이 필드에는 다음 하위 필드가 포함됩니다.
    1. 타임 스탬프-타임 라인 그래프에서 최대 메모리 사용량이 발생한 시점의 타임 스탬프
    2. 스택 예약-스택에 예약 된 메모리 양 (GiB)
    3. 힙 할당-힙에 할당 된 메모리 양 (GiB)
    4. 사용 가능한 메모리-사용 가능한 메모리 양 (GiB)입니다. 메모리 용량은 스택 예약, 힙 할당 및 사용 가능한 메모리의 합계입니다.
    5. 조각화-조각화 비율입니다 (낮을수록 좋음). (1-여유 메모리의 가장 큰 청크 크기 / 총 여유 메모리)의 백분율로 계산됩니다.

메모리 타임 라인 그래프

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

영상

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

영상

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

  • timestamp (ms)-타임 라인에서 선택한 이벤트의 위치
  • event-이벤트 유형 (할당 또는 할당 해제)
  • request_size (GiBs)-요청 된 메모리 양입니다. 할당 해제 이벤트의 경우 음수가됩니다.
  • 할당 _ 크기 (GiB)-할당 된 실제 메모리 양입니다. 할당 해제 이벤트의 경우 음수가됩니다.
  • tf_op-할당 / 할당 해제를 요청하는 TensorFlow Op
  • step_id-이 이벤트가 발생한 학습 단계
  • region_type-이 할당 된 메모리의 대상이되는 데이터 엔티티 유형입니다. 가능한 값은 temp 대한 임시, 활성화 및 기울기에 대한 output , 가중치 및 상수에 대한 persist / dynamic 입니다.
  • data_type-텐서 요소 유형 (예 : 8 비트 부호없는 정수의 경우 uint8)
  • tensor_shape-할당 / 할당 해제되는 텐서의 모양
  • memory_in_use (GiBs)-이 시점에서 사용중인 총 메모리

메모리 분석 표

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

영상

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

  • 작업 이름-TensorFlow 작업의 이름
  • 할당 크기 (GiB)-이 작업에 할당 된 총 메모리 양
  • 요청 된 크기 (GiB)-이 작업에 대해 요청 된 총 메모리 양
  • 발생-이 작업에 대한 할당 수
  • 지역 유형-이 할당 된 메모리가 대상인 데이터 엔티티 유형입니다. 가능한 값은 temp 대한 임시, 활성화 및 기울기에 대한 output , 가중치 및 상수에 대한 persist / dynamic 입니다.
  • 데이터 유형-텐서 요소 유형
  • Shape-할당 된 텐서의 모양

포드 뷰어

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

영상

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

tf.data 병목 분석

tf.data 병목 현상 분석은 프로그램의 tf.data 입력 파이프 라인에서 병목 현상을 자동으로 감지하고이를 해결하는 방법에 대한 권장 사항을 제공합니다. 플랫폼 (CPU / GPU / TPU) 또는 프레임 워크 (TensorFlow / JAX)에 관계없이 tf.data를 사용하는 모든 프로그램에서 작동합니다. 분석 및 권장 사항은이 가이드를 기반으로합니다.

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

  1. 가장 많이 입력 된 호스트를 찾습니다.
  2. 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보다 오래 걸리면 느린 것으로 간주됩니다.

입력 파이프 라인 그래프

영상

이 섹션에서는 실행 시간 정보와 함께 입력 파이프 라인 그래프를 보여줍니다. "호스트"및 "입력 파이프 라인"을 사용하여 볼 호스트 및 입력 파이프 라인을 선택할 수 있습니다. 입력 파이프 라인의 실행은 "Rank"를 사용하여 선택할 수있는 내림차순으로 실행 시간별로 정렬됩니다.

영상

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

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

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

"셀프 시간"은 직계 자식 노드와 겹치는 시간이없는 "총 시간"입니다.

"# 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 프로필 플러그인의 Capture Profile 버튼을 통해 프로필을 캡처 할 수 있습니다. 위의 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 개의 다른 축을 따라 여러 사용 사례를 다룹니다. 일부 조합은 현재 지원되며 다른 조합은 향후 추가 될 예정입니다. 사용 사례 중 일부는 다음과 같습니다.

  • 로컬 vs. 원격 프로파일 링 : 프로파일 링 환경을 설정하는 두 가지 일반적인 방법입니다. 로컬 프로파일 링에서 프로파일 링 API는 모델이 실행중인 동일한 머신 (예 : GPU가있는 로컬 워크 스테이션)에서 호출됩니다. 원격 프로파일 링에서 프로파일 링 API는 모델이 실행되는 다른 머신 (예 : Cloud TPU)에서 호출됩니다.
  • 여러 작업자 프로파일 링 : TensorFlow의 분산 학습 기능을 사용할 때 여러 머신을 프로파일 링 할 수 있습니다.
  • 하드웨어 플랫폼 : CPU, GPU, TPU를 프로파일 링합니다.

아래 표는 TensorFlow의 다양한 프로파일 링 API에서 지원하는 위 사용 사례에 대한 간략한 개요입니다.

프로파일 링 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과 같은 최신 호환 라이브러리 버전을 사용하는지 확인하십시오.

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

효율적인 데이터 입력 파이프 라인은 장치 유휴 시간을 줄여 모델 실행 속도를 크게 향상시킬 수 있습니다. 데이터 입력 파이프 라인을보다 효율적으로 만들려면 여기 에 설명 된대로 다음 모범 사례를 통합하는 것이 좋습니다.

  • 데이터 프리 페치
  • 데이터 추출 병렬화
  • 데이터 변환 병렬화
  • 메모리에 데이터 캐시
  • 사용자 정의 함수 벡터화
  • 변환 적용시 메모리 사용량 감소

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

장치 성능 향상

  • 훈련 미니 배치 크기 늘리기 (훈련 루프의 한 번 반복에서 장치 당 사용되는 훈련 샘플 수)
  • TF Stats를 사용하여 온 디바이스 작업이 얼마나 효율적으로 실행되는지 확인
  • tf.function 을 사용하여 계산을 수행하고 선택적으로 experimental_compile 플래그를 활성화합니다.
  • 단계 사이의 호스트 Python 작업을 최소화하고 콜백을 줄입니다. 모든 단계가 아닌 몇 단계마다 메트릭 계산
  • 장치 컴퓨팅 장치를 계속 바쁘게 유지
  • 병렬로 여러 장치에 데이터 보내기
  • 채널을 먼저 선호하도록 데이터 레이아웃을 최적화합니다 (예 : NHWC보다 NCHW). NVIDIA® V100과 같은 특정 GPU는 NHWC 데이터 레이아웃에서 더 나은 성능을 발휘합니다.
  • IEEE 또는 Brain 부동 소수점 bfloat16 형식에 지정된 반 정밀도 부동 소수점 형식 인 fp16 과 같은 16 비트 숫자 표현을 사용하는 것이 fp16 .
  • Keras 혼합 정밀도 API 사용 고려
  • GPU에서 훈련 할 때 TensorCore를 사용하십시오. GPU 커널은 정밀도가 fp16이고 입력 / 출력 차원이 8 또는 16으로 나눌 수있는 경우 (int8의 경우) TensorCore를 사용합니다.

추가 자료

알려진 제한 사항

TensorFlow 2.2 및 TensorFlow 2.3에서 여러 GPU 프로파일 링

TensorFlow 2.2 및 2.3은 단일 호스트 시스템에 대해서만 다중 GPU 프로파일 링을 지원합니다. 다중 호스트 시스템에 대한 다중 GPU 프로파일 링은 지원되지 않습니다. 다중 작업자 GPU 구성을 프로파일 링하려면 각 작업자를 독립적으로 프로파일 링해야합니다. TensorFlow 2.4에서는 tf.profiler.experimental.trace API를 사용하여 여러 작업자를 프로파일 링 할 수 있습니다.

여러 GPU를 프로파일 링하려면 CUDA® Toolkit 10.2 이상이 필요합니다. TensorFlow 2.2 및 2.3은 최대 10.1의 CUDA® Toolkit 버전 만 지원하므로 libcudart.so.10.1libcupti.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