Самая важная вещь, которую нужно понять о TensorFlow, заключается в том, что по большей части ядро написано не на Python : оно написано на сочетании высокооптимизированного C ++ и CUDA (язык Nvidia для программирования графических процессоров). Многое из этого, в свою очередь, происходит за счет использования Eigen (высокопроизводительная числовая библиотека C ++ и CUDA) и cuDNN от NVidia (очень оптимизированная библиотека DNN для графических процессоров NVidia для таких функций, как свертки ).
Модель TensorFlow состоит в том, что программист использует «некоторый язык» (скорее всего, Python!) Для выражения модели. Эта модель, написанная в конструкциях TensorFlow, таких как:
h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...
на самом деле не выполняется при запуске Python. Вместо этого фактически создается граф потока данных, который говорит, что нужно принимать определенные входные данные, применять определенные операции, предоставлять результаты в качестве входных данных для других операций и так далее. Эта модель выполняется быстрым кодом C ++, и по большей части данные, передаваемые между операциями, никогда не копируются обратно в код Python .
Затем программист «управляет» выполнением этой модели, извлекая узлы - для обучения, обычно на Python, и для обслуживания, иногда на Python, а иногда на чистом C ++:
sess.run(eval_results)
Этот один Python (или вызов функции C ++) использует либо внутрипроцессный вызов C ++, либо RPC для распределенной версии для вызова сервера C ++ TensorFlow, чтобы сообщить ему о выполнении, а затем копирует результаты обратно.
Итак, с учетом сказанного, давайте перефразируем вопрос: почему TensorFlow выбрал Python в качестве первого хорошо поддерживаемого языка для выражения и управления обучением моделей?
Ответ на это прост: Python, вероятно, является наиболее удобным языком для широкого круга специалистов по обработке данных и экспертов по машинному обучению, который также легко интегрируется и контролирует серверную часть C ++, а также является общим, широко используемым как внутри, так и снаружи Google и с открытым исходным кодом. Учитывая, что для базовой модели TensorFlow производительность Python не так уж и важна, это было естественно. Еще одним огромным плюсом является то, что NumPy упрощает предварительную обработку в Python - также с высокой производительностью - перед тем, как передать ее TensorFlow для действительно загруженных процессором вещей.
Также существует множество сложностей в выражении модели, которая не используется при ее выполнении - вывод формы (например, если вы выполняете matmul (A, B), какова форма результирующих данных?) И автоматическое вычисление градиента . Оказалось, что было приятно иметь возможность выразить их на Python, хотя я думаю, что в долгосрочной перспективе они, вероятно, перейдут на бэкэнд C ++, чтобы упростить добавление других языков.
(Надежда, конечно, заключается в поддержке других языков в будущем для создания и выражения моделей. Вывести логический вывод на нескольких других языках уже довольно просто - C ++ уже работает, кто-то из Facebook предоставил привязки Go, которые мы сейчас рассматриваем , так далее.)