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.