Утечка промежуточных тензоров в пользовательских / портированных операторах - PullRequest
0 голосов
/ 10 октября 2019

Я нахожусь в процессе переноса тензорного потока на новую платформу.

Я в состоянии начать этап обучения MNIST *, но в итоге я вылетел из-за утечки памяти.

Я сузил утечку до тензоров, которые используются во всех операциях (Производитель / Потребитель).

Это некоторый вывод, который я сгенерировал, который приводит меня к такому выводу (часть TRef :(?) Показывает ссылку на тензоры токаcount):

TRef:(1) Conv2D In[0]: Tensor(0x7f98f8004380)<type: float shape: [32,28,28,1]
TRef:(1) Conv2D In[1]: Tensor(0x7f98f8004530)<type: float shape: [3,3,1,32]
TRef:(2) Conv2D Ou[0]: Tensor(0x7f98f8003f00)<type: float shape: [32,26,26,32]

// All tensors with TRef == 1 get freed here (Conv2D In[0],Conv2D In[1])

TRef:(2) BiasAdd In[0]: Tensor(0x7f98f8003f00)<type: float shape: [32,26,26,32]
TRef:(1) BiasAdd In[1]: Tensor(0x7f98f806ac60)<type: float shape: [32]
TRef:(2) BiasAdd Ou[0]: Tensor(0x7f98f8004530)<type: float shape: [32,26,26,32] // This gets used later

// All tensors with TRef == 1 get freed here (BiassAdd In[1])
// All tensors with TRef == 2 never get freed

Поэтому я предполагаю, что мне нужно что-то добавить / изменить, чтобы счетчик ссылок (в конце концов) упал до нуля и освободился тензор.

Я мог быиспользуйте для этого Unref (), но я не нашел явных вызовов Unref в существующих версиях CPU / GPU.

Это наводит меня на мысль, что тензор потока делает это каким-то другим способом, о котором я не знаю.

Кто-нибудь знает, как исправить эту утечку?

Обновление (23 октября): я пытался выяснить, что делать, и нашел это: https://github.com/miglopst/cs263_spring2018/wiki/Memory-management-for-tensorflow, с этой стороны яnterested:

Для выходных тензоров, то есть когда они заканчивают использоваться в качестве входных тензоров.

Где выходные тензоры «помечены» как законченные?

* Я использую модель / код MNIST из этого: https://www.tensorflow.org/beta/tutorials/images/intro_to_cnns

...