TCMalloc 사용하여 TF 메모리 누수 방지
ProgrammingTensorflow 사용시 메모리 누수가 발생하는 경우가 있어 오랬동안 고생하다 최근에 찾은 솔루션을 정리한다. 방법은 시스템 malloc 을 TCMalloc 으로 교체하는 것이다.
일부 시스템에서의 malloc 이 Tensorflow 와 함께 사용될 경우 반복적인 시스템 메모리에 접근하는 상황에서 메모리 회수가 잘 안되는 것 같다. 내 경우엔 다른 머신간에 다른 양상이 나타났는데, ① 메모리 누수가 안 발생, ② 시스템 메모리가 꽉 차서 해당 프로세스 kill, ③ 시스템 메모리가 꽉 차서 PC 먹통 등으로 나타났다(3번 경우 때문에 재택근무 중 사무실 출근이 필요했음).
시스템 malloc 을 TCMalloc 으로 간단하게 대체하기 위해서 LD_PRELOAD 트릭을 사용한다. LD_PRELOAD 는 환경변수로 넣어주는데, 프로그램이 로드되기 직전에 LD_PRELOAD 로 지정한 공유 라이브러리를 먼저 로드한다. 이렇게 함으로써 해당 라이브러리 심볼이 우선권을 갖게 된다. TCMalloc 이 정의된 공유라이브러리를 지정하면 실행하는 프로그램에서 malloc 이 호출되는 부분이 TCMalloc 으로 대체되는(override) 것이다.
우선 타겟 환경(도커 등)에 TCMalloc 을 설치한다.
$ apt install libtcmalloc-minimal4
그리고 타겟 환경에서 아래 명령어를 사용하여 libtcmalloc-minimal4.so.4 의 경로를 확인한다.
$ dpkg -L libtcmalloc-minimal4
그리고 타겟 환경에서 명령어를 실행할 때 LD_PRELOAD 환경변수를 지정해주면 된다.
$ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4 train.py
내 경우에 메모리 누수현상은 사라졌지만 실행속도에서 큰 개선을 확인할 수는 없었다.
이 방법은 시스템 메모리 접근에 관련한 것이기 때문에 코드 자체를 tf.Function 으로 만 사용할 경우 누수 이슈가 안 나타날 수 있고 성능개선도 기대할 수 있을 것 같다. 내 경우에는 데이터셋 루프에서 시스템(cpu) 메모리로 가져와서 처리해야 편한 부분이 있어 이 방법이 현실적이고 빠른 해결책이다.
참고
'Programming' 카테고리의 다른 글
Difference between BN and IN (0) | 2020.10.13 |
---|---|
ML 프레임워크 GPU 연산 지원 확인하기 (0) | 2020.09.16 |
mkvirtualenv 실행시 ailed to find interpreter for Builtin discover of python_spec 에러 (0) | 2020.08.06 |
공용 .gitignore 를 건드리지 않고 .gitignore 설정하기 (0) | 2020.08.03 |
Python 업그레이드 후 virtualenv 문제 (0) | 2020.01.23 |