Безопасна ли Keras?

Я использую Python и Keras (в настоящее время использую бэкэнд Theano, но у меня нет проблем с переключением). У меня есть нейронная сеть, в которой я загружаю и обрабатываю несколько источников информации параллельно. В настоящее время я запускаю каждый из них в отдельном процессе и загружает свою собственную копию сети из файла. Это кажется пустой тратой памяти, поэтому я думал, что было бы более эффективно иметь один многопоточный процесс с одним экземпляром сети, который используется всеми потоками. Тем не менее, мне интересно, защищен ли Keras потоком с помощью бэкэнд. Если я запускаю .predict(x) на двух разных входах одновременно в разных потоках, я буду запускать условия гонки или другие проблемы?

Спасибо

Ответ 1

Да, Keras является потокобезопасным, если вы уделяете ему немного внимания.

Фактически, в обучении подкрепления существует алгоритм, называемый Критики актера асинхронного преимущества (A3C), где каждый агент полагается на одну и ту же нейронную сеть на скажите им, что они должны делать в определенном состоянии. Другими словами, каждый поток вызывает model.predict одновременно, как и в вашей проблеме. Пример реализации с Keras этого здесь.

Однако вы должны обратить особое внимание на эту строку, если заглянете в код: model._make_predict_function() # have to initialize before threading

Это никогда не упоминается в документах Keras, но необходимо, чтобы он работал одновременно. Короче говоря, _make_predict_function - это функция, которая компилирует функцию predict. В настройке нескольких потоков вы должны вручную вызвать эту функцию для компиляции predict заранее, в противном случае функция predict не будет скомпилирована до тех пор, пока вы ее не запустите в первый раз, что будет проблематично, если многие потоки вызовут его сразу. Вы можете увидеть подробное объяснение здесь.

Я до сих пор не встречал никаких других проблем с многопоточными потоками в Keras.