TensorFlow, почему Python был выбран языком?


148

Недавно я начал изучать глубокое обучение и другие методы машинного обучения, и я начал искать фреймворки, которые упрощают процесс построения сети и ее обучения, затем я нашел TensorFlow, имея небольшой опыт в этой области, для меня скорость - это большой фактор для того, чтобы сделать большую систему машинного обучения еще более эффективной при работе с глубоким обучением, так почему же Google выбрал Python для создания TensorFlow? Разве не лучше было бы сделать это над языком, который можно компилировать и не интерпретировать?

Каковы преимущества использования Python перед таким языком, как C ++, для машинного обучения?


2
Мелкая придирка: составление и интерпретация - не противоположности. Кроме того, любой язык программирования может быть реализован с помощью компилятора или интерпретатора, либо обоих. Есть хороший ответ о различиях в разработке программного обеспечения.
8bittree

Ответы:


246

Самая важная вещь, которую нужно понять о 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, которые мы сейчас рассматриваем , так далее.)


1
Как вы определяете «логический вывод» в книге « It's already quite straightforward to run inference using several other languagesБыть программистом на Прологе», это просто мне не подходит; это кажется неуместным словом.
Guy Coder

1
Выполняется только прямой проход модели. Применение его к данным и обучению.
dga

Что касается вывода о форме. Я конвертирую некоторые нейронные сети в статически типизированный язык только для обучения, и набор Duck в Ptyhon определенно упрощает написание этой части кода. С другой стороны, написание кода Python без типов значительно усложняет изучение Ptyhon, чтобы получить типы прямо перед запуском. Я вижу гораздо больше ошибок времени выполнения при использовании Ptyhon, чем при использовании другого языка, например F #. Возможно, стоит отметить, что Duck набирает ответ.
Guy Coder

2
Хотя это правда, я думаю, что типизация Python была косвенной причиной. Из языков, обычно используемых в Google --- quora.com/… --- Python лучше всего подходит для среднего доктора философии по машинному обучению. Единственным реальным выбором был бы C ++ (я не знаю много людей, которые используют Lua, язык, который использует Torch), а C ++ довольно далек от зоны комфорта набора инструментов ML. Многие люди, занимающиеся машинным обучением, пришли из Matlab, и их популярность набирает обороты. Утиная печать, вероятно, в основе популярности, конечно, но это выходит за рамки моих возможностей.
dga

Спасибо, хорошее резюме. Guy Coder --- что касается смысла «вывода» в игре, см. Статью в Википедии о статистическом выводе . Это индуктивный вывод, в отличие от дедуктивного вывода, выполняемого Прологом.
Боб Карпентер

39

TF не написан на питоне. Он написан на C ++ (и использует высокопроизводительные числовые библиотеки и код CUDA ), и вы можете проверить это, посмотрев на их github . Таким образом, ядро ​​написано не на python, а TF предоставляет интерфейс для многих других языков ( python, C ++, Java, Go ).

введите описание изображения здесь

Если вы пришли из мира анализа данных, вы можете думать об этом как о numpy (не написанном на python, но предоставляющем интерфейс для Python), или, если вы веб-разработчик, подумайте об этом как о базе данных (PostgreSQL, MySQL, которая может быть вызван из Java, Python, PHP)


Интерфейс Python (язык, на котором люди пишут модели в TF) является самым популярным по многим причинам . На мой взгляд, основная причина историческая: большинство пользователей ML уже используют его (еще один популярный выбор - R), поэтому, если вы не предоставите интерфейс для python, ваша библиотека, скорее всего, обречена на безвестность.


Но написание на python не означает, что ваша модель выполняется на python. Напротив, если вы правильно написали свою модель, Python никогда не будет выполняться во время оценки графа TF (за исключением tf.py_func () , который существует для отладки и его следует избегать в реальной модели именно потому, что он выполняется на Сторона Python).

Это отличается от, например, 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 / что-то еще.


В этом контексте мой пост в блоге может быть интересным: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd

4

Python позволяет создавать модули расширения с использованием C и C ++, взаимодействуя с собственным кодом, и при этом получать преимущества, которые дает Python.

Да, TensorFlow использует Python, но он также содержит большое количество C ++ .

Это позволяет упростить интерфейс для экспериментов с меньшими затратами на человеческое мышление с Python и повысить производительность за счет программирования наиболее важных частей на C ++.


0

Последнее соотношение, которое вы можете проверить отсюда, показывает, что TensorFlow C ++ занимает ~ 50% кода, а Python занимает ~ 40% кода.

И C ++, и Python являются официальными языками Google, поэтому неудивительно, почему это так. Если бы мне пришлось обеспечить быструю регрессию там, где присутствуют C ++ и Python ...

C ++ находится внутри вычислительной алгебры, а Python используется для всего остального, в том числе для тестирования. Зная, насколько повсеместно тестирование сегодня, неудивительно, почему код Python так много способствует TF.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.