이 튜토리얼에서는 다음을 수행합니다. 소스코드는 여기
이 튜토리얼의 마지막 부분에는 간략한 요약 과 추가 리소스 목록이 포함되어 있습니다.
IPU에서 이 튜토리얼을 실행하려면 Poplar SDK 환경을 활성화해야 합니다(IPU 시스템 시작 안내서 참조 ).
또한 C++11 표준과 호환되는 C++ 도구 체인이 필요합니다. 이 튜토리얼의 빌드 명령은 GCC를 사용합니다.
IPU에 대한 코드를 프로파일링하는 방법에는 세 가지가 있습니다.
PopVision 그래프 분석기는 훨씬 더 자세한 정보를 제공하므로 이 튜토리얼은 세 부분으로 나누어져 있습니다. 먼저 세 가지 다른 프로파일링 방법을 시도하고, 다음으로 일반 PopVision 그래프 분석기 기능을 보여주고, 마지막으로 PopVision 그래프 분석기의 각 정보 탭을 살펴보겠습니다.
프로파일링 도구는 PopVision 그래프 분석기 사용자 가이드 에 설명되어 있습니다 . 이 튜토리얼에서는 Poplar 프로그램을 프로파일링하는 방법을 보여 주지만 이러한 기술은 PyTorch 및 TensorFlow 프레임워크에 적용 가능합니다.
개발자 페이지 에서 PopVision 그래프 분석기를 다운로드하여 설치하세요 . 로컬 시스템에 PopVision 그래프 분석기를 다운로드 및 설치하고 이를 사용하여 원격 시스템에 있는 파일에 액세스할 수 있으므로 원격 시스템에 PopVision Graph 분석기를 다운로드하여 설치할 필요가 없습니다.
튜토리얼 전 미리 보기로 PopVision 시작하기 비디오를 시청하고 추가로 시도해 볼 수 있는 내용을 확인하는 것도 유용합니다 .
IPUModel 및 IPU 하드웨어에서 실행: 이전 튜토리얼과 마찬가지로 이 튜토리얼에서는 IPUModelIPU 하드웨어에 액세스하지 않고도 튜토리얼을 실행할 수 있도록 을 기본값으로 사용합니다. IPU 하드웨어와 IPU 하드웨어 사이에는 몇 가지 차이점이 있으며 IPUModel, 이는 관련성이 있는 시점에서 논의될 것입니다.
튜토리얼 1에서는 IPU 하드웨어에서 실행되도록 튜토리얼 코드를 수정하는 방법에 대한 설명을 제공하지만, 이 튜토리얼에서는 - tut4_ipu_model.cpp및 에 대한 코드 예제를 제공합니다 tut4_ipu_hardware.cpp. 을 참조하겠지만 별도의 언급이 없는 한 지침은 파일 이름 제외와 tut4_ipu_model.cpp동일합니다 .tut4_ipu_hardware.cpp
tut4_profiling작업 디렉터리로 사용하세요 . 이 튜토리얼은 코드 완성에 관한 것이 아닙니다. 목표는 여기에 제시된 프로파일링 옵션을 이해하고 실험하는 것입니다.
tut4_profiling/tut4_ipu_model.cpp편집기에서 파일 복사본을 엽니다 .
engine.printProfileSummary(std::cout, {{"showExecutionSteps", "true"}});
그러면 명령줄 프로필 요약이 출력됩니다. 옵션 을 활성화하면 showExecutionSteps프로필 요약에 IPUModel의 주기 추정치 또는 IPU 하드웨어의 측정된 주기가 포함된 프로그램 실행 시퀀스도 포함됩니다. 그러나 하드웨어에서는 계측을 활성화해야 합니다. 그렇지 않으면 주기가 기록되지 않습니다. 계측이 활성화되는 방법을 보려면 debug.instrument에서 엔진 옵션을 찾아보세요 .tut4_ipu_hardware.cpp
g++ --std=c++11 tut4_ipu_model.cpp -lpoplar -lpopops -lpoplin -lpoputil -o tut4
./tut4
코드에는 이미 addCodelets장치측 라이브러리 코드를 추가하는 함수가 포함되어 있습니다. 자세한 내용은 Poplar 및 PopLibs 사용 설명서의 PopLibs 섹션을 참조하세요 .
프로그램이 실행되면 프로파일링 데이터가 인쇄됩니다. 공부하기 쉽도록 파일로 리디렉션할 수 있습니다.
실행 프로필을 검토하고 이해하는 데 시간을 투자하세요. 예를 들어:
프로필 요약 에 대한 자세한 내용은 Poplar 및 PopLibs 사용자 가이드의 프로필 요약 섹션을 참조하세요 .
보고서 만들기:
engine.printProfileSummary(std::cout, {{"showExecutionSteps", "true"}});
PopVision Graph Analyser를 사용할 때는 필요하지 않지만 충돌하지도 않습니다. 프로필 보고서 파일 생성은 API 또는 환경 변수를 사용하여 변경할 수 있는 포플러 엔진 옵션에 의해 활성화됩니다.
g++ --std=c++11 tut4_ipu_model.cpp -lpoplar -lpopops -lpoplin -lpoputil -o tut4
POPLAR_ENGINE_OPTIONS='{"autoReport.all":"true","autoReport.directory":"./report"}' ./tut4
-autoReport.all모든 기본 프로파일링 옵션을 켭니다.
-autoReport.directory현재 디렉터리를 기준으로 출력 디렉터리를 설정합니다.
다음 섹션에서는 이러한 파일을 사용하는 방법을 설명합니다. PopVision 분석 API와 함께 사용하거나 PopVision 그래프 분석기 도구를 사용하여 탐색할 수 있습니다.
이 섹션에서는 PopVision 분석 API(libpva)를 사용하여 C++ 또는 Python을 사용하여 프로필 파일에서 정보를 쿼리하는 방법을 설명합니다. PopVision 분석 라이브러리(libpva) 사용 설명서 에서 자세한 내용을 확인할 수 있습니다 .
libpva는 파일을 쿼리하는 데 사용되므로 이전 섹션에서 생성한 파일을 디렉터리에 profile.pop복사 하고 이를 작업 디렉터리로 만듭니다.profile.poptut4_profiling/libpva
이제 현재 작업 디렉터리에 세 개의 파일이 표시됩니다.
C++ 및 Python 소스 파일을 연구하여 작동 방식을 이해하세요. 다음을 사용하여 C++ 프로그램을 컴파일합니다.
g++ --std=c++11 cpp_example.cpp -lpva -ldl -o cpp_example
이제 다음을 사용하여 C++ 프로그램을 실행할 수 있습니다.
./cpp_example
또는 다음을 사용하여 Python 프로그램을 실행할 수 있습니다.
python3 python_example.py
두 프로그램 모두 다음과 유사한 동일한 예제 정보를 인쇄해야 합니다.
Example information from profile: Number of compute sets: 9 Number of
tiles on target: 1472 Version of Poplar used: 2.3.0 (d9e4130346)
이 예제 정보를 확장하려면 소스 파일을 수정해야 할 수도 있습니다.
개발자 페이지 에서 다운로드한 PopVision 그래프 분석기 애플리케이션을 엽니다 .
위 폴더 의 로컬 복사본을 열거나 reportSSH를 통해 원격으로 열 수 있습니다.
PopVision Graph Analyser를 실행하고 을 클릭합니다 .'Open a Report..'
폴더의 로컬 또는 원격 복사본으로 이동합니다.
열기를 클릭하면 요약 탭이 열리고 특정 파일을 열 수도 있으며 해당 탭으로 바로 이동합니다.
영상
영상
다양한 탭을 클릭하고 마우스를 움직여 일부 기능을 살펴보세요. 대부분의 항목 위로 마우스를 가져가면 도구 설명이나 문서에 대한 링크가 표시됩니다. 이 문서는 응용 프로그램 자체( 또는 왼쪽 하단의 문서 아이콘)와 PopVision Graph Analysis User Guide 에 모두 포함되어 있습니다 .Help -> Documentation
전체 보고서는 다음 방법으로 다시 로드할 수 있습니다.
-새로고침 아이콘(왼쪽 하단)
-보고서를 닫았다가 다시 엽니다(닫기 아이콘, 왼쪽 하단).
-새 파일( )을 직접 엽니다.File -> Open New Window
튜토리얼의 이 섹션은 기본 기능에 대한 소개입니다. PopVision 그래프 분석기 사용자 가이드는 자세한 지침을 제공합니다.
캡처된 프로파일링 데이터의 양과 유형은 POPLAR_ENGINE_OPTIONS환경 변수로 설정됩니다. 기본값은 POPLAR_ENGINE_OPTIONS='{"autoReport.all":"true"}'직렬화된 그래프를 제외한 모든 기본 프로파일링 정보를 캡처합니다.
프로파일링 데이터의 특정 측면만 수집하려는 경우 각 항목을 개별적으로 설정할 수 있습니다.
POPLAR_ENGINE_OPTIONS='{"autoReport.outputGraphProfile":"true"}'
반대로 특정 측면을 제외하려면 autoReport.alltrue로 설정하고 개별적으로 비활성화할 수 있습니다.
POPLAR_ENGINE_OPTIONS='{"autoReport.all":"true", "autoReport.outputExecutionProfile":"false"}'
환경 변수는 를 사용하여 지속되도록 만들 수 export있지만 일반적인 사용은 범위를 지정하기 위해 프로파일링할 프로그램과 동일한 줄에 환경 변수를 지정하는 것입니다. 다양한 프로파일링 기능을 켜고 끄면서 실험해 보세요. Poplar 프로그램은 해당 실행에 대해 설정된 기능에 해당하는 폴더의 파일만 덮어씁니다. 따라서 해당 실행에서 작성되지 않은 파일은 삭제되지 않습니다.
이에 대한 자세한 내용은 PopVision 그래프 분석기 설명서의 IPU 보고서 캡처 섹션에 자세히 설명되어 있습니다.
또 다른 유용한 기능은 두 보고서를 직접 비교하는 기능입니다. 기본 메뉴를 클릭하는 대신 을 클릭하고 파일 창을 열어 두 보고서로 이동한 후 을 클릭하세요 . 이를 위해서는 두 개의 보고서가 필요하므로 하나 이상의 텐서 크기(예: m1 , m2 ) 를 수정하세요 .'Open a Report…''Compare two Reports…'Compare{900, 600} -> {1600, 700}{600, 300} -> {700, 300}
두 번째 보고서를 두 번째 디렉터리에 다시 컴파일하고 캡처합니다.
g++ --std=c++11 tut4_ipu_model.cpp -lpoplar -lpopops -lpoplin -lpoputil -o tut4
POPLAR_ENGINE_OPTIONS='{"autoReport.all":"true","autoReport.directory":"./report_2"}' ./tut4
작성한 원본 보고서와 두 번째 보고서를 비교하세요. 시작하려면 요약, 메모리 및 활성 탭을 살펴보세요. 예를 들어 활동성 탭은 다음과 같습니다.
영상
다음 몇 가지 섹션에서도 이 추가 보고서를 사용할 것입니다.
어려움에 직면한 경우 PopVision 그래프 분석기 설명서의 보고서 열기 섹션에 보고서 열기에 대한 전체 연습이 제공됩니다.
하드웨어를 사용하고 있고 프로그램이 IPU 타일에 맞지 않으면 메모리 부족(OOM) 오류가 발생합니다. 이는 프로그램을 실행하는 그래프 컴파일 단계에서 발생합니다( g++ 컴파일하는 동안이 아니라 실제로 프로그램을 실행할 때).
IPUModel은 OOM 오류가 발생해도 멈추지 않도록 설계되었습니다(OOM인 모델을 구축하고 실행하는 데 사용할 수 있음). 따라서 이 섹션에서는 하드웨어를 사용한다고 가정합니다.
Tensor m1 = graph.addVariable(FLOAT, {9000, 7500}, "m1");
Tensor m2 = graph.addVariable(FLOAT, {7500, 300}, "m2");
(이것은 하드웨어에 있으므로 수정하십시오 tut4_ipu_hardware.cpp).
g++ --std=c++11 tut4_ipu_hardware.cpp -lpoplar -lpopops -lpoplin -lpoputil -o tut4
POPLAR_ENGINE_OPTIONS='{"autoReport.all":"true","autoReport.directory":"./report_OOM"}' ./tut4
메모리 부족 오류로 인해 프로그램이 실패하는 것을 볼 수 있습니다.
terminate called after throwing an instance of 'poplar::graph_memory_allocation_error'
what(): Out of memory: Cannot fit all variable data onto one or more tiles. Profile saved to: ./report_OOM/profile.pop
그리고 폴더에는 /report_OOM프로필 파일 세트가 포함되어 있습니다.
참고: Poplar SDK 2.1 릴리스부터 Poplar 엔진 옵션 "debug.allowOutOfMemory"의 값은 기본적으로 true로 설정됩니다. 이를 통해 OOM이 발생하면 컴파일이 완료되어 분석할 수 있는 메모리 추적이 포함된 프로필 파일이 생성됩니다. 사용 가능한 프로파일링 파일 세트가 생성되더라도 컴파일이 성공하지 못하고 실행이 발생하지 않는다는 점에 유의하는 것이 중요합니다. 이는 "autoReport.all":"true"를 사용하더라도 실행 추적을 얻을 수 없음을 의미합니다. “debug.allowOutOfMemory” 옵션이 false로 설정된 경우 OOM 오류로 인해 프로그램 실행이 실패하면 컴파일이 중단되고 분석할 수 있는 프로필 파일이 생성되지 않습니다.
PopVision Graph Analyser 로 보고서를 열면 /report_OOM메모리 추적이 완료된 것을 볼 수 있습니다. 이제 프로그램이 OOM 상태가 된 원인을 조사하고 잠재적으로 문제를 해결할 수 있습니다.
튜토리얼의 다음 부분에서는 각 탭과 탭에 포함된 정보를 자세히 살펴봅니다.
탭 을 사용하면 타일 전체의 메모리 사용률을 조사할 수 있습니다. 위에서 보고서 중 하나를 열고 왼쪽에 있는 탭 아이콘을 클릭하세요.Memory ReportMemory Report
영상
세부정보 섹션에 모든 타일의 데이터가 어떻게 표시되는지 확인하세요.
그래프 위에 마우스를 올려놓은 상태에서 마우스 휠을 위아래로 스크롤하여 타일 영역이 어떻게 확대 및 축소되는지 확인하세요.
오른쪽 상단에는 상자가 있습니다 . 관심 있는 타일을 입력하고 세부 정보 섹션에 해당 특정 타일에 대한 세부 정보가 어떻게 표시되는지 확인하세요.Select tile
-여러 개의 타일 번호를 쉼표로 구분하여 입력하여 두 개 이상의 서로 다른 타일을 비교할 수 있습니다.
-그래프의 선을 Shift 키를 누른 채 클릭하여 동일한 동작을 얻을 수도 있습니다.
오른쪽 상단에는 옵션 세트도 있습니다. 및 를 켜십시오 .Include GapsShow Max Memory
-Show Max Memory타일당 사용 가능한 최대 메모리를 표시합니다. 하나 이상의 타일이 끝나면 OOM이 됩니다.
-Include Gaps메모리의 공백을 보여줍니다. IPU 타일의 일부 메모리 뱅크는 특정 유형의 데이터용으로 예약되어 있습니다. 이로 인해 타일 메모리에 '간격'이 나타납니다.
-격차는 OOM을 압박하기에 충분할 수 있으므로 OOM 문제를 조사할 때 이 두 가지를 모두 사용하는 것이 유용합니다.
두 보고서를 와 활성화 상태로 비교하세요.Show Max MemoryInclude Gaps
텐서와 매핑을 다양하게 변경하세요. 도구의 메모리 탭에서 효과를 확인할 수 있습니다.
메모리 보고서에 대한 자세한 내용은 PopVision 그래프 분석기 설명서의 메모리 보고서 섹션에 나와 있습니다.
이 탭을 사용하면 컴파일된 코드를 시각화할 수 있습니다. IPU에서 실행되는 프로그램 단계의 계층적 보기를 보여줍니다. 위에서 보고서 중 하나를 열고 왼쪽에 있는 프로그램 트리 탭 아이콘을 클릭하세요.Program Tree
영상
프로그램 트리에 대한 자세한 내용은 PopVision 그래프 분석기 설명서의 프로그램 트리 섹션에 나와 있습니다.
이 탭에는 코드 크기, 사이클 수, FLOP 및 메모리 사용에 대한 통계를 보여주는 소프트웨어 계층에 대한 모델의 모든 작업 테이블이 표시됩니다. 위에서 보고서 중 하나를 열고 왼쪽에 있는 작업 탭 아이콘을 클릭하세요.Operations Summary
영상
상단 패널에는 기본 정보 열 세트와 함께 현재 선택된 소프트웨어 계층(기본 계층은 PopLibs)의 작업을 나열하는 테이블이 표시됩니다.
-표시된 열은 Columns창 오른쪽 상단에 있는 드롭다운 메뉴를 사용하여 수정할 수 있습니다.
작업 중 하나를 클릭하면 matMul하단 패널에 해당 작업에 대한 요약이 표시됩니다.
-작업을 선택하지 않은 경우 이 탭에는 선택한 소프트웨어에 대한 작업 분석이 표시됩니다.
하단 패널의 각 탭을 클릭합니다(상단 패널에서 작업이 선택됨).
-Summary: 기본 테이블 열의 데이터입니다.
-Program Tree: 선택한 작업과 관련된 프로그램 단계.
-Code: 선택한 작업에 대해 실행된 코드 그래프입니다.
-Cycles: 선택한 작업에 사용된 사이클 수.
-FLOPS: 선택한 작업에 대해 실행된 부동 소수점 작업 수입니다.
-Debug: 선택한 작업의 디버그 정보.
작업에 대한 자세한 내용과 각 하단 패널 탭의 기능에 대한 전체 설명은 PopVision 그래프 분석기 설명서의 작업 요약 섹션에 나와 있습니다.
이는 프로그램의 각 단계에서 변수 상태에 대한 자세한 분석을 제공합니다. 일부 변수는 프로그램 전체에 걸쳐 메모리에 유지됩니다. 이를 '항상 라이브' 변수라고 합니다. 일부 변수는 메모리가 재사용됨에 따라 할당 및 할당 해제됩니다. 이를 '항상 활성이 아닌' 변수라고 합니다. 메모리 보고서는 이를 추적하지만 활성 보고서는 이를 시각화합니다.
위에서 보고서 중 하나를 열고 왼쪽에 있는 탭 아이콘을 클릭하세요.Liveness Report
영상
옵션에서 켜세요.Include Always Live
다양한 시간 단계를 클릭하면서 하단 패널의 / / 및 탭 에 어떤 세부정보가 제공되는지 확인하세요 .Always Live VariablesNot Always Live VariablesVerticesCycle Estimates
프로그램 트리와 일치하는 프로그램 단계를 기록해 두십시오.
활성 보고서에 대한 자세한 내용은 PopVision 그래프 분석기 설명서의 활성 보고서 섹션에 나와 있습니다.
이는 계측된 프로그램의 각 단계에서 소비하는 클록 사이클 수를 보여줍니다. 위에서 보고서 중 하나를 열고 왼쪽에 있는 탭 아이콘을 클릭하세요.Execution Trace
영상
실행 추적에 대한 자세한 내용은 PopVision 그래프 분석기 설명서의 실행 추적 섹션에 나와 있습니다.
추가 작업으로 튜토리얼 코드를 수정하고 PopVision Graph Analyser의 다양한 탭에서 효과를 확인하거나 자신의 코드를 사용해 보세요.
이 튜토리얼에서는 Poplar 프로그램에서 유용한 프로파일링 정보를 추출하는 방법을 배웠습니다. 먼저 콘솔에 정보 요약을 인쇄하는 방법을 사용한 다음 환경 변수를 설정하여 보고서를 생성하는 방법을 배웠고 PopVision 분석 API를 사용하여 보고서에서 일부 정보를 추출했습니다. 마지막으로 보다 편리하고 사용하기 쉬운 프로파일링 도구인 PopVision Graph Analyser에 대해 자세히 살펴보았습니다. 이 튜토리얼에서는 Poplar 프로그램을 프로파일링했지만 IPU에서 TensorFlow 및 PyTorch 애플리케이션용 PopVision Graph Analyser를 사용하는 것은 동일한 환경 변수를 설정하는 경우입니다. 이에 대한 자세한 내용은 PopVision 그래프 분석기 사용자 가이드 에 설명되어 있습니다 .
다음 튜토리얼 에서는 행렬-벡터 곱셈을 수행하는 포플러 애플리케이션을 작성하게 됩니다.
IPU 애플리케이션 프로파일링에 대해 자세히 알아보려면 PopVision 시스템 분석 도구인 PopVision Trace Instrumentation Library(libpvti)를 검색하고 이 문서에 소개된 PopVision 분석 API(libpva)에 대해 자세히 알아볼 수 있는 PopVision 튜토리얼 도 확인하세요. 지도 시간.