TensorFlow, почему Python был выбранным языком?
Python позволяет создавать модули расширения с использованием C и C ++, взаимодействовать с собственным кодом и при этом получать преимущества, которые дает вам Python.
TensorFlow использует Python, но он также содержит большое количество C++ .
Это позволяет упростить интерфейс для экспериментов с меньшими затратами труда на Python и повысить производительность путем программирования наиболее важных частей на C ++.
Недавно я начал изучать глубокое обучение и другие методы ML, и я начал искать фреймворки, которые упрощают процесс построения сети и обучения, а затем я обнаружил, что TensorFlow, имея небольшой опыт в этой области, для меня кажется, что скорость большой фактор для того, чтобы сделать большую систему ML еще больше, если работать с глубоким обучением, так почему же Google выбрал python для TensorFlow? Не лучше ли сделать это на языке, который можно скомпилировать и не интерпретировать?
Каковы преимущества использования Python над языком, подобным C ++, для машинного обучения?
TF не написан на питоне. Он написан на C ++ (и использует высокопроизводительные числовые libraries и код CUDA ), и вы можете проверить это, посмотрев на их github . Таким образом, ядро написано не на python, а TF предоставляет интерфейс для многих других языков ( python, C ++, Java, Go )
Если вы пришли из мира анализа данных, вы можете думать об этом как о numpy (не написанном на python, но предоставляющем интерфейс для Python) или, если вы веб-разработчик, - думать о нем как о базе данных (PostgreSQL, MySQL, который может быть вызван из Java, Python, PHP)
Интерфейс Python (язык, на котором люди пишут модели в TF) является самым популярным по many reasons . На мой взгляд, основная причина историческая: большинство пользователей ML уже используют ее (другой популярный выбор - R), поэтому, если вы не предоставите интерфейс для python, ваша библиотека, скорее всего, обречена на мрак.
Но написание на python не означает, что ваша модель выполнена на python. Напротив, если вы правильно написали свою модель, Python никогда не будет выполнен во время оценки графа TF (за исключением tf.py_func() , который существует для отладки, и его следует избегать в реальной модели именно потому, что он выполняется на Сторона питона).
Это отличается от, например, NumPy. Например, если вы выполните np.linalg.eig(np.matmul(A, np.transpose(A)) (который является eig(AA') ), операция вычислит транспонирование на некотором быстром языке (C ++ или fortran), вернитесь это к python, взять его из python вместе с A, и вычислить умножение на каком-нибудь быстром языке и вернуть его в python, затем вычислить собственные значения и вернуть его в python. Таким образом, дорогостоящие операции, такие как matmul и eig, рассчитываются эффективно, вы все равно теряете время, перемещая результаты в python назад и принудительно. TF не делает этого , как только вы определили график, ваш тензор передается не в python, а в C ++ / CUDA / что-то еще
Последнее соотношение, которое вы можете проверить github показывает, что внутри TensorFlow C ++ занимает
50% кода, а Python -
И C ++, и Python являются официальными языками в Google, поэтому неудивительно, почему это так. Если бы мне пришлось обеспечить быструю регрессию, где присутствуют C ++ и Python .
C ++ находится внутри вычислительной алгебры, а Python используется для всего остального, включая тестирование. Зная, насколько повсеместно сейчас тестирование, неудивительно, почему код Python вносит такой большой вклад в TF.
Самое важное, что нужно понять о TensorFlow, - это то, что ядро по большей части не написано на Python : оно написано в комбинации высокооптимизированных C ++ и CUDA (язык Nvidia для программирования графических процессоров). Многое из этого происходит, в свою очередь, с помощью Eigen (высокопроизводительная цифровая библиотека C ++ и CUDA) и cuDNN NVidia (очень оптимизированная библиотека DNN для графических процессоров NVidia для таких функций, как convolutions ).
Модель для TensorFlow такова, что программист использует «некоторый язык» (скорее всего, Python!) Для выражения модели. Эта модель, написанная в конструкциях TensorFlow, таких как:
фактически не выполняется при запуске Python. Вместо этого на самом деле создается граф потока данных, который говорит, что нужно принимать определенные входные данные, применять определенные операции, предоставлять результаты в качестве входных данных для других операций и так далее. Эта модель выполняется быстрым кодом C ++, и по большей части данные, проходящие между операциями, никогда не копируются обратно в код Python .
Затем программист «запускает» выполнение этой модели, потянув за узлы - для обучения, обычно на Python, и для обслуживания, иногда на Python, а иногда на необработанном C ++:
Этот один вызов Python (или вызов функции C ++) использует либо внутрипроцессный вызов C ++, либо RPC для распределенной версии, чтобы вызвать сервер C ++ TensorFlow, чтобы сообщить о его выполнении, а затем скопировать обратно результаты.
Итак, сказав это, давайте перефразируем вопрос: почему TensorFlow выбрал Python в качестве первого хорошо поддерживаемого языка для выражения и управления обучением моделей?
Ответ на этот вопрос прост: Python, пожалуй, самый удобный язык для широкого круга специалистов по данным и машинного обучения, который также легко интегрируется и контролирует бэкэнд C ++, а также является общим, широко используемым как внутри, так и снаружи. Google и с открытым исходным кодом. Учитывая, что с базовой моделью TensorFlow производительность Python не так важна, это было естественное соответствие. Это также огромный плюс в том, что NumPy позволяет легко выполнять предварительную обработку в Python, в том числе с высокой производительностью, перед передачей ее в TensorFlow для действительно ресурсоемких задач.
Существует также сложность в выражении модели, которая не используется при ее выполнении - вывод формы (например, если вы делаете matmul (A, B), какова форма получаемых данных?) И автоматическое вычисление gradient . Оказывается, было бы неплохо иметь возможность выражать их в Python, хотя я думаю, что в долгосрочной перспективе они, вероятно, перейдут на бэкэнд C ++, чтобы упростить добавление других языков.
(Конечно, в будущем мы надеемся на поддержку других языков для создания и выражения моделей. Уже довольно просто выполнить вывод, используя несколько других языков - C ++ работает сейчас, кто-то из Facebook предоставил привязки Go которые мы сейчас рассматриваем , и т.д.)