[Solved] Nvidia Visual Profiler : GC Overhead
Environment
Arch : ppc64le(Power9)
OS : RHEL 7.6
CUDA : v10.1
GPU : Tesla V100-SXM2-16GB
Purpose
machine learning python코드를 돌려 GPU와 CPU간의 memcopy를 nvvp로 시각화 해보고자 함
Problem
파이썬 코드를 돌리면서 nvprof로 정보 수집 시작
$ nvprof --log-file /tmp/tensorlogs/nvprof/nvprof1.%p.txt --export-profile /tmp/tensorlogs/nvprof/nvprof1.%p.nvvp --print-gpu-trace --profile-child-processes python tf_cnn_benchmarks.py
파일 생성까지 정상적으로 이루어짐
Nvidia Visual Profiler를 오픈함과 동시에 생성했던 nvprof파일을 profiling
$ nvvp nvprof1.129182.nvvp
ERROR
로딩 중에 다음과 같은 에러가 발생
Exception in thread "LoadPdm" java.lang.OutOfMemoryError: GC overhead limit exceeded
...
Exception in thread "LoadPdm" java.lang.OutOfMemoryError: Java heap space
...
Solution
Caused by : Java OutOfMemoryError
출력된 오류 메세지와 같이 메모리가 초과되어 발생되는 에러.
메모리가 부족하여 Garbage Collection이 이루어졌으나 확보된 메모리가 전체 메모리의 2%에 불과할 경우에 발생함.
앞선 nvprof파일을 보면 수집시간이 굉장히 짧음에도 불구하고 크기가 굉장히 큰 것을 확인할 수 있음. (여담으로 1시간짜리는 2GB가 넘었음..)
위 링크에 따르면 NVVP에서 OOM이 발생하는 이유는 CUDA 툴킷 설치의 libnvvp / nvvp.ini 파일에 지정된 Java 최대 힙 크기 설정 때문임.
default로 힙 크기를 1GB로 제한하도록 Java VM을 구성하게됨.
How to solve?
힙크기떄문에 문제가 생기는 거니 힙크기를 늘려주면 된다!
- 최소 힙 크기(-Xms)를 2GB로 늘리자
- 최대 힙 크기(-Xmx)는 돌리고자 하는 파일의 5~6배정도 크기면 적당
- 기본 32 비트 모드 대신 64 비트 모드로 실행하도록 Java에 지시 (힙 크기> 4GB를 원하는 경우에 필요함.) (-d64)
- Java의 병렬 가비지 수집 시스템을 사용하면 지정된 입력 크기에 필요한 메모리 공간을 줄이고 메모리 오류를보다 효과적으로 잡아낼 수 있음. (-XX : + UseConcMarkSweepGC -XX : + CMSIncrementalMode)
결론 :
$ nvvp -vm -d64 -vmargs -Xms2g -Xmx22g -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
이렇게 실행하자!
성공!@@@@@@@@!!!!
댓글남기기