Я нахожусь в процессе переноса тензорного потока на новую платформу.
Я в состоянии начать этап обучения 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