¿En qué se diferencia PyTorch de TensorFlow? ¿Cuáles son las ventajas de usar uno versus el otro? ¿Cuándo debo usar uno u otro?

Después de leer los documentos de Pytorch y los ejemplos de código en github, me parece que la principal diferencia entre PyTorch y Tensorflow (o Theano) es que PyTorch admite la creación de gráficos de cálculo dinámico (DCG), mientras que Tensorflow y Theano usan un gráfico de cálculo estático (SCG) Esto se describe en su página acerca de [1]. Sin embargo, PyTorch no es la única biblioteca de DNN que admite DCG, recientemente se lanzó la biblioteca DyNet [2] de CMU que también admite esta función y está dirigida a aplicaciones de PNL. Antes de esto, estaba Chainer [3], que admite DCG. Este hilo de Hackernews habla más sobre esto

Hace solo unos meses, la gente decía que el ecosistema de la biblioteca de aprendizaje profundo era …

La principal utilidad de un gráfico de cálculo dinámico es que le permite procesar entradas y salidas complejas, sin preocuparse de convertir cada lote de entrada en un gran tensor de grasa. Una de las principales utilidades es la ejecución de redes neuronales recurrentes en entradas y salidas de longitud variable. En SCG, lo lograría al rellenar las entradas y salidas y agruparlas. Esto causa problemas porque si las interacciones son complejas, el relleno puede agregar parámetros adicionales en el modelo, lo que puede interferir. Sin embargo, en DCG usted escribe su función para procesar las entradas y salidas, de la manera exacta que desea. Esto se vuelve aún más útil cuando está haciendo convoluciones gráficas o NN basados ​​en árbol recursivo.

La desventaja del enfoque DCG es que no admite operaciones de procesamiento por lotes para salidas de entrada complejas, tan eficientemente como el SCG y, por lo tanto, tiende a ser más lento, especialmente en las GPU (esto se basa en mi experiencia con algunos modelos DyNet que utilicé). Además, si la red es grande, entonces el enfoque DCG requiere mucha memoria para almacenar el gráfico computacional, que generalmente se optimiza mucho en un marco SCG.

También me gustaría señalar que hay formas en que Tensorflow admite muchas de estas operaciones a través de RNN dinámicos y hubo un documento reciente en revisión en ICLR 2017 [4], que detalla algunas nuevas operaciones que se agregarán en Tensorflow para admitir DCG

Además, Pytorch extiende el ecosistema numpy y scipy al proporcionar soporte para la diferenciación automática inspirada en (biblioteca AutoGrad [5]), así como soporte de GPU usando el backend CUDA. Esto le brinda la funcionalidad para escribir sus redes neuronales usando construcciones numpy like, y los gradientes se calculan automáticamente para usted.

Pytorch también comparte la base de código subyacente con el popular marco basado en lua llamado Torch [6], que se usa mucho en Facebook, Twitter, Harvard NLP y muchos otros lugares.

Finalmente, me parece que PyTorch intenta hacer que las operaciones de Tensor de escritura sean más amigables con Python y quiere invitar a más personas del fondo numpy / scipy a usar DNN para su trabajo.

Actualización: he agregado algunos detalles más sobre el Autograd después de un comentario.

Notas al pie

[1] PyTorch | Acerca de

[2] clab / dynet

[3] Un marco flexible para redes neuronales

[4] https://openreview.net/pdf?id=ry…

[5] HIPS / autogrado

[6] Antorcha | Computación científica para LuaJIT.

TensorFlow es “Define-and-Run”, mientras que PyTorch es “Define-by-Run”. En el marco Definir y ejecutar, se definirían condiciones e iteraciones en la estructura del gráfico y luego se ejecutarían. En Define-by-Run, la estructura del gráfico se define sobre la marcha durante el cálculo hacia adelante, esa es una forma natural de codificación.

En otras palabras, permite la construcción dinámica de gráficos computacionales. Los gráficos de cálculo dinámico surgen siempre que la cantidad de trabajo que debe hacerse es variable. Esto puede ser cuando estamos procesando texto, un ejemplo son unas pocas palabras y otro son párrafos de texto.

Aunque hay algunas construcciones dinámicas en TensorFlow, no son flexibles y son bastante limitantes. Recientemente, un equipo de Google creó “TensorFlow Fold”, que maneja gráficos de computación dinámicos pero aún no se ha publicado ni publicado.

También hay Chainer, DyNet, que proporciona la misma funcionalidad. De hecho, la base de código del autograduado de PyTorch se inició con una bifurcación de chainer, pero luego la reescribieron en una C. pura altamente optimizada. Como afirma James Bradbury, su motor de diferenciación automática es varias veces más rápido que otros.

El gráfico de cálculo dinámico es el próximo campo de batalla para los marcos de Deep Learning.

Actualización: ahora, también puede crear gráficos dinámicos en TensorFlow utilizando TensorFlow Fold.

Referencia – PyTorch – Tensores y redes neuronales dinámicas en Python

Comencemos desde NumPy (verás por qué un poco más tarde).

Puede crear un algoritmo de aprendizaje automático incluso con NumPy, pero crear una red neuronal profunda se está volviendo exponencialmente más difícil. NumPy está diseñado para cálculos (rápidos) y no para aprendizaje automático. Por lo general, se usa para el aprendizaje automático junto con un paquete de aprendizaje automático.

PyTorch

PyTorch es similar a NumPy en la forma en que administra los cálculos, pero tiene un fuerte soporte de GPU. De manera similar a NumPy, también tiene un servidor C (el lenguaje de programación), por lo que ambos son mucho más rápidos que las bibliotecas nativas de Python. NumPy podría ser acelerado por GPU (con algún código adicional), pero no tiene este fuerte soporte de GPU que PyTorch o TensorFlow tienen. Finalmente, PyTorch fue diseñado específicamente para la funcionalidad de GPU en Python.

TensorFlow

TensorFlow, por otro lado, fue escrito principalmente en C ++ y CUDA (lenguaje de NVIDIA para programar GPU), y no fue creado específicamente para Python. Proporciona funcionalidades en C, C ++, Java, Go (lenguaje de Google), y hay soporte comunitario para Haskell y Rust [1]. Entonces, con TF, Python no te restringe . Incluso si la sintaxis difiere un poco entre los idiomas, los conceptos son los mismos.

Comparación

Ahora, PyTorch tiene funcionalidades de redes neuronales profundas y es por eso que a menudo se compara con TensorFlow, sklearn, etc. Además, TensorFlow tiene una lógica peculiar (con conceptos como marcadores de posición, sesiones, etc.). Entonces, para TensorFlow, debe hacer un esfuerzo adicional. Conociendo NumPy (que es mi suposición subyacente para el querido lector), es más fácil cambiar a PyTorch que TensorFlow, es por eso que está ganando popularidad tan rápido.

Como Google utilizó TensorFlow durante tanto tiempo, es muy fácil implementar algoritmos que lo utilicen. Así que puedes pensar en ello como más orientado al producto . Lógicamente, desea poder implementar los algoritmos que está creando (puede consultar TensorFlow Serving [2] para obtener más información al respecto).

PyTorch, por otro lado, es más reciente, por lo que no tiene la gama completa de capacidades de otros paquetes. Estoy seguro de que esto cambiará y están en camino de ponerse al día. Sin embargo, TensorFlow tiene este módulo tf.contrib . Ese es el código, aportado por la comunidad, que probablemente se integrará en el núcleo del TF. El punto es que la comunidad TensorFlow es más fuerte, porque TF es más antigua. No sé si PyTorch alcanzará a la comunidad de TF (eso depende de los usuarios y la adopción).

Opinión

Por lo tanto, mi veredicto sería que TensorFlow ha resistido la prueba del tiempo (si puede usar esta expresión para un marco que no es tan antiguo en sí mismo) y aún es más ampliamente adoptado. Tiene más capacidades y una mejor escalabilidad para proyectos más grandes (proyectos de la escala de Google). PyTorch seguramente está ganando impulso, ya que es más fácil de aprender pero no tiene la misma integración. Es muy bueno para proyectos pequeños que deben realizarse con bastante rapidez, pero no es óptimo para la implementación del producto.

Razones prácticas para aprender ambos

Si desea trabajar en la industria, es probable que una empresa tenga un marco personalizado. En su CV, se espera que tenga experiencia con (a) paquetes de aprendizaje automático. En cualquier caso, no esperarán que hayas trabajado con todos ellos. Si tiene que elegir uno solo de ellos, me parece que buscar el paquete “más fácil de aprender” se ve peor. Así que aprende ambos o ve con TF.

***

Descargo de responsabilidad : actualmente estamos ejecutando una campaña de Indiegogo, con el fin de lanzar nuestro producto The 365 Data Science Online Program. Es un lugar donde encontrará todo lo que necesita para comenzar una carrera en ciencia de datos, desde Matemáticas y Estadísticas, pasando por R, Python y SQL, hasta aprendizaje automático y aprendizaje profundo (con TensorFlow).

Haga clic aquí para apoyarnos y obtener acceso temprano.

Notas al pie

[1] TensorFlow

[2] Introducción | TensorFlow

En esta publicación, quiero explorar algunas de las similitudes y diferencias clave entre dos marcos de aprendizaje profundo populares: PyTorch y TensorFlow. ¿Por qué esos dos y no los otros? Hay muchos marcos de aprendizaje profundo y muchos de ellos son herramientas viables, elegí esos dos solo porque estaba interesado en compararlos específicamente.

Orígenes

TensorFlow es desarrollado por Google Brain y se utiliza activamente en Google tanto para necesidades de investigación como de producción. Su predecesor de código cerrado se llama DistBelief.

PyTorch es un primo del marco Torch basado en lua que se usa activamente en Facebook. Sin embargo, PyTorch no es un simple conjunto de envoltorios para admitir el lenguaje popular, se reescribió y diseñó para ser rápido y sentirse nativo.


La mejor manera de comparar dos marcos es codificar algo en ambos. He escrito un cuaderno de jupyter para esta publicación y puedes obtenerlo aquí. Todo el código se proporcionará en la publicación también.

Primero, codifiquemos un aproximador simple para la siguiente función en ambos marcos:

Intentaremos encontrar el parámetro desconocido phi dado datos x y valores de función f (x) . Sí, usar el descenso de gradiente estocástico para esto es una exageración y la solución analítica se puede encontrar fácilmente, pero este problema servirá a nuestro propósito como un simple ejemplo.

Primero resolveremos esto con PyTorch:

Si tiene alguna experiencia en marcos de aprendizaje profundo, puede haber notado que estamos implementando el descenso de gradiente a mano. No es muy conveniente, ¿eh? Con mucho gusto, PyTorch tiene optimize módulo de optimize que contiene implementaciones de algoritmos de optimización populares como RMSProp o Adam. Usaremos SGD con impulso

Como puede ver, dedujimos rápidamente el verdadero exponente de los datos de entrenamiento. Y ahora sigamos con TensorFlow:

Como puede ver, la implementación en TensorFlow también funciona (sorprendentemente). Se necesitaron más iteraciones para recuperar el exponente, pero estoy seguro de que la causa es que no violé los parámetros del optimizador lo suficiente como para alcanzar resultados comparables.

Ahora estamos listos para explorar algunas diferencias.

Diferencia # 0 – adopción

Actualmente, muchos investigadores y profesionales de la industria consideran que TensorFlow es una herramienta para llevar. El marco está bien documentado y, si la documentación no es suficiente, hay muchos tutoriales extremadamente bien escritos en Internet. Puede encontrar cientos de modelos implementados y entrenados en github, comience aquí.

PyTorch es relativamente nuevo en comparación con su competidor (y todavía está en beta), pero está cobrando impulso rápidamente. La documentación y los tutoriales oficiales también son agradables. PyTorch también incluye varias implementaciones de arquitecturas populares de visión por computadora que son súper fáciles de usar.

Diferencia n. ° 1: definición de gráfico dinámico frente a estático

Ambos marcos funcionan con tensores y ven cualquier modelo como un gráfico acíclico dirigido (DAG), pero difieren drásticamente en cómo se pueden definir.

TensorFlow sigue la expresión ‘datos como código y código es información’. En TensorFlow, usted define el gráfico estáticamente antes de que un modelo pueda ejecutarse. Toda la comunicación con el mundo exterior se realiza a través de tf.Session object y tf.Placeholder que son tensores que serán sustituidos por datos externos en tiempo de ejecución.

En PyTorch, las cosas son mucho más imperativas y dinámicas: puede definir, cambiar y ejecutar nodos a medida que avanza, sin interfaces de sesión especiales o marcadores de posición. En general, el marco está más estrechamente integrado con el lenguaje Python y se siente más nativo la mayoría de las veces. Cuando escribe en TensorFlow, a veces siente que su modelo está detrás de una pared de ladrillos con varios agujeros pequeños para comunicarse. De todos modos, esto todavía suena como una cuestión de gustos más o menos.

Sin embargo, esos enfoques difieren no solo en una perspectiva de ingeniería de software: hay varias arquitecturas de redes neuronales dinámicas que pueden beneficiarse del enfoque dinámico. Recuerde RNN: con gráficos estáticos, la longitud de la secuencia de entrada se mantendrá constante. Esto significa que si desarrolla un modelo de análisis de sentimientos para oraciones en inglés, debe fijar la longitud de la oración a un valor máximo y rellenar todas las secuencias más pequeñas con ceros. No es muy conveniente, ¿eh? Y obtendrá más problemas en el dominio de los RNN recursivos y los RNN de árbol. Actualmente, Tensorflow tiene soporte limitado para entradas dinámicas a través de Tensorflow Fold. PyTorch lo tiene por defecto.

Diferencia # 2 – Depuración

Dado que el gráfico de cálculo en PyTorch se define en tiempo de ejecución, puede utilizar nuestras herramientas de depuración de Python favoritas, como pdb, ipdb, depurador de PyCharm o antiguas declaraciones de impresión de confianza.

Este no es el caso con TensorFlow. Tiene una opción para usar una herramienta especial llamada tfdbg que permite evaluar las expresiones de flujo de tensor en tiempo de ejecución y examinar todos los tensores y operaciones en el alcance de la sesión. Por supuesto, no podrá depurar ningún código de Python con él, por lo que será necesario usar pdb por separado.

Diferencia # 3 – Visualización

Tensorboard es impresionante cuando se trata de visualización. Esta herramienta viene con TensorFlow y es muy útil para depurar y comparar diferentes carreras de entrenamiento. Por ejemplo, considere que entrenó un modelo, luego ajustó algunos hiperparámetros y lo entrenó nuevamente. Ambas ejecuciones se pueden mostrar en Tensorboard simultáneamente para indicar posibles diferencias. Tensorboard puede:

  • Mostrar gráfico del modelo
  • Trazar variables escalares
  • Visualizar distribuciones e histogramas.
  • Visualiza imágenes
  • Visualiza incrustaciones
  • Reproducir audio

Tensorboard puede mostrar varios resúmenes que se pueden recopilar a través del módulo tf.summary . Definiremos operaciones de resumen para nuestro ejemplo de exponente de juguete y usaremos tf.summary.FileWriter para guardarlas en el disco.

Para iniciar Tensorboard ejecute tensorboard --logdir=./tensorboard . Esta herramienta es muy conveniente de usar en instancias en la nube ya que es una aplicación web.

Actualmente, PyTorch no tiene equivalente para Tensorboard, sin embargo, existen integraciones. De lo contrario, puede utilizar herramientas de trazado estándar: matplotlib y seaborn.

Diferencia # 4 – Implementación

Si comenzamos a hablar sobre la implementación, TensorFlow es un claro ganador por ahora: tiene TensorFlow Serving, que es un marco para implementar sus modelos en un servidor gRPC especializado. Mobile también es compatible.

Cuando volvemos a PyTorch, podemos usar Flask u otra alternativa para codificar una API REST en la parte superior del modelo. Esto podría hacerse también con los modelos TensorFlow si gRPC no es una buena combinación para su caso de uso. Sin embargo, TensorFlow Serving puede ser una mejor opción si el rendimiento es una preocupación.

Tensorflow también admite entrenamiento distribuido que PyTorch no tiene por ahora.

Diferencia # 5 – Un marco o una biblioteca

Construyamos un clasificador CNN para dígitos escritos a mano. Ahora PyTorch realmente comenzará a parecerse a un marco . Recuerde que un marco de programación nos brinda abstracciones útiles en cierto dominio y una forma conveniente de usarlas para resolver problemas concretos. Esa es la esencia que separa un marco de una biblioteca.

Aquí presentamos el módulo de datasets que contiene contenedores para conjuntos de datos populares utilizados para comparar arquitecturas de aprendizaje profundo. También nn.Module se usa para construir un clasificador de red neuronal convolucional personalizado. nn.Module es un bloque de construcción que PyTorch nos brinda para crear arquitecturas complejas de aprendizaje profundo. Hay grandes cantidades de módulos listos para usar en el paquete torch.nn que podemos usar como base para nuestro modelo. Observe cómo PyTorch usa un enfoque orientado a objetos para definir bloques de construcción básicos y nos da algunos ‘rieles’ para avanzar mientras brinda la capacidad de extender la funcionalidad a través de subclases.

Aquí va una versión ligeramente modificada de https://github.com/pytorch/examp …:

Plain TensorFlow se parece mucho más a una biblioteca que a un framework: todas las operaciones son de bajo nivel y necesitará escribir mucho código repetitivo incluso cuando no lo desee (definamos esos sesgos y pesos una y otra vez y … )

A medida que pasó el tiempo, un ecosistema completo de envoltorios de alto nivel comenzó a surgir alrededor de TensorFlow. Cada uno de esos objetivos simplifica la forma en que trabaja con la biblioteca. Muchos de ellos se encuentran actualmente en el módulo tensorflow.contrib (que no se considera una API estable) y algunos comenzaron a migrar al repositorio principal (ver tf.layers ).

Por lo tanto, tiene mucha libertad sobre cómo usar TensorFlow y qué marco se adaptará mejor a la tarea: TFLearn, tf.contrib.learn, Sonnet, Keras, tf.layers simples, etc. Para ser honesto, Keras merece otra publicación pero Actualmente está fuera del alcance de esta comparación.

Aquí usaremos tf.layers y tf.contrib.learn para construir nuestro clasificador CNN. El código sigue el tutorial oficial sobre tf.layers:

Por lo tanto, tanto TensorFlow como PyTorch proporcionan abstracciones útiles para reducir las cantidades de código repetitivo y acelerar el desarrollo del modelo. La principal diferencia entre ellos es que PyTorch puede sentirse más “pitónico” y tiene un enfoque orientado a objetos, mientras que TensorFlow tiene varias opciones entre las que puede elegir.

Personalmente, considero que PyTorch es más claro y amigable para los desarrolladores. Es torch.nn.Module le brinda la capacidad de definir módulos reutilizables de una manera OOP y este enfoque me parece muy flexible y poderoso. Más tarde, puede componer todo tipo de módulos a través de torch.nn.Sequential (hola Keras ✋). Además, tiene todos los módulos integrados en una forma funcional, lo que puede ser muy conveniente. En general, todas las partes de la API juegan bien juntas.

Por supuesto, puede escribir código muy limpio en TensorFlow simple, pero solo requiere más habilidad y prueba y error antes de obtenerlo. Cuando se trata de marcos de alto nivel como Keras o TFLearn, prepárate para perder al menos parte de la flexibilidad que TensorFlow tiene para ofrecer.

Conclusión

TensorFlow es una biblioteca de aprendizaje profundo muy potente y madura con fuertes capacidades de visualización y varias opciones para usar para el desarrollo de modelos de alto nivel. Tiene opciones de implementación listas para producción y soporte para plataformas móviles. TensorFlow es una buena opción si usted:

  • Desarrollar modelos para la producción.
  • Desarrollar modelos que deben implementarse en plataformas móviles.
  • Desea un buen apoyo de la comunidad y una documentación completa
  • Desea recursos de aprendizaje enriquecidos en varias formas (TensorFlow tiene un MOOC completo)
  • Quiere o necesita usar Tensorboard
  • Necesidad de usar entrenamiento modelo distribuido a gran escala

PyTorch sigue siendo un marco joven que está ganando impulso rápidamente. Puede que le quede bien si:

  • Investigue o su producción los requisitos no funcionales no son muy exigentes
  • Desea una mejor experiencia de desarrollo y depuración
  • Amo todas las cosas Pythonic

Si tiene el tiempo, el mejor consejo sería probar ambos y ver qué se adapta mejor a sus necesidades.

Gracias.

Aquí hay una publicación de blog reciente bien escrita que compara sistemáticamente PyTorch y TensorFlow usando varios aspectos como tiempo de aceleración, creación y depuración de gráficos, cobertura, serialización, implementación, carga de datos, administración de dispositivos, etc. Espero que esto sea útil.

  1. Utiliza la creación de gráficos dinámicos, lo que permite una mayor flexibilidad en la computación. Por ejemplo, imagine que está creando una red como HyperNetworks (por David Ha) o “Thin Nets”, la matriz de peso del gráfico se generaría estáticamente, esto ralentizaría enormemente el marco. La capacidad de PyTorch para hacer esto sobre la marcha permite que este proceso se desarrolle sin problemas.
  2. Está en Python, que es más bonito que Lua (en mi humilde opinión y en la opinión de muchos otros)

PyTorch es mejor para la creación rápida de prototipos para aficionados y para proyectos a pequeña escala. TensorFlow es mejor para implementaciones a gran escala, especialmente cuando se considera la implementación multiplataforma e integrada. Su uso debe depender completamente del tipo de proyecto en el que está trabajando, como se mencionó anteriormente, elija PyTorch si lo está utilizando para un proyecto pequeño.

Puede leer un artículo detallado sobre esto, aquí PyTorch vs Tensorflow