2017-01-03 3 views
0

동기 부여 : GPU의 메모리 용량을 압도하기 위해 많은 수의 레이어를 모을 수있는 시나리오를 상상하기 쉽습니다.TensorFlow : 레이어 활성화 저장소 지정

이 문제에 대한 잠재적 인 해결책은 레이어 간의 역방향 계산 기능을 활용하는 것입니다. 나는. backprop 동안 다시 조금씩 '패션 : 레이어 j'여기

enter image description here

당신이 단순히 메모리와 컴퓨팅 활성화의 최종 같은 계층 활성화를 저장할 수의 출력은 다음 층의 출력의 함수이다 '.


문제 : 나는 TensorFlow에서 수동 메모리 관리에 익숙 해요 하나의 메모리에 유지해야하고 어떤을 폐기 될 수 TensorFlow 어떤 변수 지정에 대한 이동하는 방법에 대한 정보를 찾을 수 없어.

구현의 다른 측면은 사용자 지정 그라데이션 계산을 지정하는 것입니다. 이것은 내가 충분히 잘 문서화되어 있으며 달성 가능해야한다고 생각합니다. 그러나 누군가가 이와 관련하여주의해야 할 점이 있다면, 나는 그것을 듣고 감사하게 생각합니다.

답변

3

중간 결과를 무시하고 나중에 다시 계산하여 메모리를 절약하려고합니다. 나는 두 가지 접근법을 볼 수있다. 하나는 그래프를 재구성하여 재 계산하고 다른 하나는 중간 결과에 영구적 인 텐서를 사용하고 수동으로 삭제를 제어하는 ​​것입니다.

첫 번째 방법은 다음 계산과 그레디언트 그래프를 고려하십시오.

는 다음과 같이 그래프를 수정 contrib.graph_editor를 사용합니다. 지금은 가능

주에만 2 활성화를위한 충분한 메모리를 필요로 실행 순서를 선택합니다. 그러나 TensorFlow는 일반적으로이 실행 순서를 선택하지 않고 시작 부분에 a2 텐서를 모두 계산하므로 최대 4 회의 활성을 저장할 수있는 충분한 메모리가 필요합니다. 극단적 인 예는 caterpillar graph을 참조하십시오.

해결 방법은 제어 종속성을 추가하여 특정 실행 순서를 강제하는 것입니다.

이 제 a2 노드는 강제 b3 후에 계산 될 수있다. TensorFlow는 더 이상 텐서가 필요 없게되면 메모리를 해제하기 때문에이 그래프의 모든 실행 순서는 3 대신 2 회의 활성화를 저장하는 피크 메모리를 필요로합니다.

위의 예제를 구현하는 notebook입니다.A2-> A3 간다 계산이 반전 할 경우

두 번째 방법은 영구 텐서를 사용하는 것을 다음과 같이

, 당신은 당신의 그래프를 해킹 것입니다. 실행 호출이 완료된 후 TensorFlow에 특정 텐서를 유지하도록 알릴 수 있습니다. 변수와 달리 이러한 개체는 메모리를 확보하기 위해 삭제할 수 있습니다. .run 호출이 많으며 실행 당 200 초의 지연이 추가되지만 모든 그래프 재 작성보다 쉬울 수도 있습니다. 나는이 경로를 탐색하지는 않았지만 여기에 영구적 인 텐서 (delete_session_tensor 명령을 사용하여 삭제가 수행됨)를 사용하는 example이 있습니다.

+0

매우 잘 대답했습니다. 매우 감사! –

+0

마지막 두 그래프는'a2'가'a1'의 활성화로 계산되지만, w.r.t. 내 질문에 그것은 a3에서'a2 = f (a3)'로 계산되어야한다. –

+1

아, 무슨 뜻인지 알 겠어, 당신은 당신의 레이어가 뒤집을 수 있다고 말하면서, 당신은 실제로 그것들을 거꾸로 계산할 수 있습니까? 그렇다면 예를 들어, a2 = f (a3)와 같은 일을하기 위해 배선을 추가해야 할 것입니다. ReluGrad는 표준 예제로 입력 대신 출력에서 ​​ReLU의 그래디언트를 계산할 수 있습니다. 가장 집중적 인 부분은 어려울 것 같습니다. matmul 및 convolution 레이어가 거꾸로가는 경우에는 역행렬이 필요합니다. –

관련 문제