GPU Profiling은 성능을 측정하고 분석하여 병목 현상을 찾아내고 효율을 높이기 위한 과정으로 작업에서 소요하는 시간과 자원 사용 현황을 파악하고 병목이 발생하는 부분, 비효율적인 코드, 메모리 사용 문제 등을 식별할 수 있습니다.
본 문서에서는 뉴론 시스템에서 NVIDIA Nsight System과 Nsight Compute 를 활용할 수 있는 방법에 대해 예시로 소개 드립니다.
가. SLURM 스케줄러 옵션 설정
profiling 작업 시, 계산노드 설정 변경이 필요하므로 아래와 같이 --exclusive 옵션과 --constrain=hwperf 옵션을 추가로 입력해주어야 합니다.
--exclusive은 노드를 전용으로 사용할 수 있는 옵션으로, 사용 가능한 노드가 확보될 때까지 대기시간이 다소 길어질 수 있습니다.
NVIDIA HPC SDK 에는 nvcc 와 같은 컴파일러와 nsys, ncu 프로파일링 툴이 모두 설치되어 있습니다. 뉴론 시스템에는 NVIDIA HPC SDK가 설치되어 있으며 module 로 환경설정이 가능합니다.
NVIDIA HPC SDK module 설정 예시
다. 프로파일링 과정
1. 실행코드 컴파일
CUDA 코드 컴파일 예시
CUDA + MPI 코드 컴파일 예시
※ -g –G 옵션은 디버깅을 위한 옵션
※ 본 예시에서는 아래CUDA + MPI 코드를 컴파일 하므로 nvcc -ccbin mpicxx 로 컴파일 진행합니다.
vectoradd 실행코드 예
2. nsys 프로파일링
nsys profile 은 Nsight Systems의 명령으로, 프로그램 전체 실행을 시간축으로 기록하는 프로파일러입니다. CPU, CUDA 커널/메모리, MPI/NCCL, OS 이벤트 등의 정보를 한 타임라인에 보여주기 때문에 어디서 많은 시간이 소비되는지 한 눈에 파악할 수 있습니다.
단일노드, 멀티 GPU 에서의 nsys profile 실행 명령, 옵션 예시
멀티노드, 멀티 GPU 에서의 nsys profile 실행 명령, 옵션 예시
특정 프로세스만 프로파일링
많은 프로세스로 실행되는 소프트웨어는 프로파일링 시 부하가 발생할 수 있으며 이런 경우 wrapper 스크립트를 작성하고, 특정 프로세스만 선택적으로 프로파일링 할 수 있습니다.
※ nsys profile 은일부 랭크만 프로파일링 시, mpirun 옵션에서-x NSYS_MPI_STORE_TEAMS_PER_RANK=1 옵션 추가 입력 필요
nsys_wrapper.sh
3. ncu 프로파일링
ncu 는 Nsight Compute의 명령으로, 특정 CUDA 커널 내부를 깊게 분석할 수 있는 프로파일러 입니다. SM 점유율, WARP 효율, 메모리 대역폭/캐시 등 세밀한 정보를 수집합니다. 커널이 왜 느린지 어떻게 튜닝할지 판단할 때 활용할 수 있는 도구입니다.
단일노드, 멀티 GPU
멀티노드, 멀티 GPU
특정 프로세스만 프로파일링
ncu_wrapper.sh
4. nsys-ui 실행
nsys profile 실행 후 생성된 report 파일은은 nsys-ui 명령으로 GUI 환경에서 확인하실 수 있습니다.
nsys-ui 실행
※ 로그인 노드에서 실행하는 예시이며 X Window System 설정이 되어 있어야 합니다.
WindowsOS :
SSH 클라이언트 프로그램 X11 Forwarding 설정, X서버 프로그램(Xming 또는 VcXsrv 등) 실행
MacOS :
뉴론 접속 시 ssh -X 옵션으로 접속, X서버 프로그램(XQuartz) 실행
실행화면
5. ncu-ui 실행
ncu 실행 후 생성된 report 파일은 ncu-ui 명령으로 GUI 환경에서 확인하실 수 있습니다.
ncu-ui 실행
※ 로그인 노드에서 실행하는 예시이며 X Window System 설정이 되어 있어야 합니다.
WindowsOS :
SSH 클라이언트 프로그램 X11 Forwarding 설정, X서버 프로그램(Xming 또는 VcXsrv 등) 실행
MacOS :
뉴론 접속 시 ssh -X 옵션으로 접속, X서버 프로그램(XQuartz) 실행