tensorflow
TensorFlow에서 메모리 누수를 디버깅하는 방법
수색…
Graph.finalize ()를 사용하여 그래프에 추가 할 노드 잡기
TensorFlow를 이용하는 가장 일반적인 모드는 먼저 흐름 등 TensorFlow 사업자의 그래프 (건물 포함 tf.constant()
및 tf.matmul()
다음 단계의 호출에 의해 실행 tf.Session.run()
(루프 방법을 예 훈련 루프).
메모리 누수의 일반적인 원인은 트레이닝 루프에 노드를 그래프에 추가하는 호출이 포함되어 있으며, 반복되는 모든 반복에서 실행되므로 그래프가 커질 수 있습니다. 이것은 명백 할 수 있습니다 (예 : tf.square()
와 같은 TensorFlow 연산자 호출). 암시 적 (예 : tf.train.Saver()
와 같은 연산자를 만드는 TensorFlow 라이브러리 함수 호출) 또는 미묘한 (예 : tf.convert_to_tensor()
를 암시 적으로 호출하고 그래프에 새로운 tf.constant()
를 추가하는 tf.Tensor
및 NumPy 배열의 오버로드 된 연산자입니다.
tf.Graph.finalize()
메서드는 누수를 잡는 데 도움이 될 수 있습니다. 그래프를 읽기 전용으로 표시하고 그래프에 아무 것도 추가되면 예외를 발생시킵니다. 예 :
loss = ...
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
sess.graph.finalize() # Graph is read-only after this statement.
for _ in range(1000000):
sess.run(train_op)
loss_sq = tf.square(loss) # Exception will be thrown here.
sess.run(loss_sq)
이 경우 오버로드 된 *
연산자는 새 노드를 그래프에 추가하려고 시도합니다.
loss = ...
# ...
with tf.Session() as sess:
# ...
sess.graph.finalize() # Graph is read-only after this statement.
# ...
dbl_loss = loss * 2.0 # Exception will be thrown here.
tcmalloc 할당 자 사용
메모리 할당 성능을 향상시키기 위해 많은 TensorFlow 사용자는 대용량 객체 (예 : 많은 텐서)를 할당하거나 할당 취소 할 때 tcmalloc
분열이 적기 때문에 기본 malloc()
구현 대신 tcmalloc
사용합니다. 일부 메모리 집약적 인 TensorFlow 프로그램은 힙 주소 공간 을 누설하는 것으로 알려져 있지만 malloc()
사용하는 개별 객체를 모두 해제하는 대신) 기본 malloc()
을 사용하지만 tcmalloc
전환 한 후에는 잘 수행됩니다. 또한 tcmalloc
에는 힙 프로파일 러가 포함되어있어 남아있는 누출이 발생한 위치를 추적 할 수 있습니다.
tcmalloc
의 설치는 운영 체제에 따라 다르지만 다음은 Ubuntu 14.04 (trusty) 에서 작동합니다 (여기서 script.py
는 TensorFlow Python 프로그램의 이름입니다).
$ sudo apt-get install google-perftools4
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 python script.py ...
위에서 언급했듯이 단순히 tcmalloc
전환하면 많은 명백한 누수가 해결 될 수 있습니다. 그러나 메모리 사용량이 계속 증가하는 경우 다음과 같이 힙 프로파일 러를 사용할 수 있습니다.
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 HEAPPROFILE=/tmp/profile python script.py ...
위의 명령을 실행하면 프로그램이 파일 시스템에 주기적으로 프로파일을 기록합니다. 프로파일 순서는 다음과 같습니다.
-
/tmp/profile.0000.heap
-
/tmp/profile.0001.heap
-
/tmp/profile.0002.heap
- ...
google-perftools
패키지의 일부로 설치할 수있는 google-pprof
도구 (예 : Ubuntu 14.04)를 사용하여 프로필을 읽을 수 있습니다. 예를 들어 위에 수집 한 세 번째 스냅 샷을 살펴 보겠습니다.
$ google-pprof --gv `which python` /tmp/profile.0002.heap
위의 명령을 실행하면 GraphViz 창이 팝업되어 프로필 정보가 유향 그래프로 표시됩니다.