수색…


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 창이 팝업되어 프로필 정보가 유향 그래프로 표시됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow