Introducción a PyTorch

PyTorch es una biblioteca de aprendizaje automático de Python de código abierto, basada en la biblioteca Torch, implementada en C++ en su núcleo, y utilizada en el campo de la inteligencia artificial, como visión por computadora y procesamiento de lenguaje natural.

PyTorch fue desarrollado inicialmente por el equipo de investigación de inteligencia artificial de Meta Platforms y ahora forma parte de la Linux Foundation.

Mucho software de aprendizaje profundo se construye sobre PyTorch, incluyendo la conducción autónoma de Tesla, Pyro de Uber, Transformers de Hugging Face, PyTorch Lightning y Catalyst.

PyTorch tiene principalmente dos grandes características:

  • Cálculo de tensores similar a NumPy, que puede acelerarse en aceleradores de hardware como GPU o MPS.
  • Redes neuronales profundas basadas en un sistema de diferenciación automática.

PyTorch incluye submódulos como torch.autograd, torch.nn, torch.optim, etc.

PyTorch incluye varias funciones de pérdida, como MSE (error cuadrático medio = norma L2), pérdida de entropía cruzada y pérdida de log-verosimilitud negativa (útil para clasificadores), entre otras.

Características de PyTorch

  • Grafo computacional dinámico (Dynamic Computation Graphs)Los grafos computacionales de PyTorch son dinámicos, lo que significa que se construyen en tiempo de ejecución y pueden cambiarse en cualquier momento. Esto proporciona una gran flexibilidad para la experimentación y la depuración, ya que los desarrolladores pueden ejecutar el código línea por línea y ver los resultados intermedios.

  • Diferenciación automática (Automatic Differentiation)El sistema de diferenciación automática de PyTorch permite a los desarrolladores calcular gradientes fácilmente, lo cual es crucial para entrenar modelos de aprendizaje profundo. Calcula automáticamente los gradientes de la función de pérdida con respecto a los parámetros del modelo mediante el algoritmo de retropropagación.

  • Cálculo de tensores (Tensor Computation)PyTorch proporciona operaciones tensoriales similares a las de NumPy, que pueden ejecutarse en CPU y GPU, acelerando así el proceso de cálculo. Los tensores son la estructura de datos básica en PyTorch, utilizados para almacenar y operar con datos.

  • API ricaPyTorch ofrece una gran cantidad de capas predefinidas, funciones de pérdida y algoritmos de optimización, que son componentes comunes para construir modelos de aprendizaje profundo.

  • Soporte para múltiples lenguajesAunque PyTorch tiene a Python como su interfaz principal, también ofrece una interfaz de C++, que permite una integración y control de más bajo nivel.

Grafo computacional dinámico (Dynamic Computation Graph)

Una de las características más notables de PyTorch es su mecanismo de grafo computacional dinámico.

A diferencia del grafo computacional estático (graph) de TensorFlow, PyTorch construye el grafo en el momento de la ejecución, lo que significa que en cada cálculo, el grafo cambia automáticamente según la forma de los datos de entrada.

Ventajas del grafo computacional dinámico:

  • Más flexible, especialmente adecuado para escenarios que requieren condiciones o recursividad.
  • Facilita la depuración y la modificación, permitiendo ver directamente los resultados intermedios.
  • Más cercano al estilo de programación en Python, fácil de aprender.

Tensor y autograd

La estructura de datos central en PyTorch es eltensor (Tensor), que es una matriz multidimensional que puede realizar cálculos de manera eficiente en CPU o GPU. Las operaciones de los tensores admiten el mecanismo de autograd, lo que permite calcular automáticamente los gradientes durante el proceso de retropropagación, algo fundamental para los algoritmos de optimización por descenso de gradiente en el aprendizaje profundo.

Tensor:

  • Admite cambiar entre CPU y GPU.
  • Proporciona una interfaz similar a NumPy, con soporte para operaciones a nivel de elemento.
  • Admite autograd, lo que facilita el cálculo de gradientes.

Autograd:

  • El motor de autograd integrado en PyTorch rastrea automáticamente todas las operaciones de los tensores y calcula los gradientes durante la retropropagación.
  • Mediante elrequires_gradatributo, se puede especificar que el tensor necesita calcular gradientes.
  • Admite una retropropagación eficiente, adecuada para el entrenamiento de redes neuronales.

Definición y entrenamiento de modelos

PyTorch proporciona eltorch.nnmódulo, que permite a los usuarios definir modelos de redes neuronales heredando lann.Moduleclase. Usando laforwardfunción para especificar la propagación hacia adelante, la retropropagación automática (a través deautograd) y el cálculo de gradientes también son manejados internamente por PyTorch.

Módulo de redes neuronales (torch.nn):

  • Proporciona capas comunes (como capa lineal, capa convolucional, capa de agrupación, etc.).
  • Admite la definición de arquitecturas de redes neuronales complejas (incluyendo redes con múltiples entradas y salidas).
  • Compatible con optimizadores (comotorch.optim) para su uso conjunto.

Aceleración por GPU

PyTorch es totalmente compatible con la ejecución en GPU para acelerar el entrenamiento de modelos de aprendizaje profundo. Mediante un simple.to(device)método, los usuarios pueden transferir modelos y tensores a la GPU para realizar cálculos. PyTorch admite el entrenamiento con múltiples GPU y puede utilizar la tecnología NVIDIA CUDA para mejorar significativamente la eficiencia computacional.

Soporte de GPU:

  • Selecciona automáticamente GPU o CPU.
  • Admite aceleración de operaciones a través de CUDA.
  • Admite cómputo paralelo con múltiples GPU (DataParallelotorch.distributed)。

Ecosistema y soporte comunitario

PyTorch, como proyecto de código abierto, cuenta con una gran comunidad y un amplio ecosistema. No solo se utiliza ampliamente en el ámbito académico, sino que también se ha implementado extensamente en la industria, especialmente en campos como visión por computadora y procesamiento de lenguaje natural. PyTorch también ofrece muchas herramientas y bibliotecas relacionadas con el aprendizaje profundo, como:

  • torchvision: conjuntos de datos y modelos para tareas de visión por computadora.
  • torchtext: conjuntos de datos y herramientas de preprocesamiento para tareas de procesamiento de lenguaje natural.
  • torchaudio: kit de herramientas para procesamiento de audio.
  • PyTorch Lightning: una biblioteca de alto nivel que simplifica el código de PyTorch, centrada en la iteración rápida de la investigación y la experimentación.

Comparación con otros frameworks

PyTorch, debido a su flexibilidad, facilidad de uso y soporte comunitario, se ha convertido en el framework preferido de muchos investigadores y desarrolladores de aprendizaje profundo.

TensorFlow vs PyTorch

  • El grafo computacional dinámico de PyTorch lo hace más flexible, adecuado para experimentación e investigación rápidas; mientras que el grafo computacional estático de TensorFlow tiene más espacio para la optimización en entornos de producción.
  • PyTorch es más conveniente para la depuración, mientras que TensorFlow es más maduro en la implementación y admite una gama más amplia de hardware y plataformas.
  • En los últimos años, TensorFlow también ha introducido grafos dinámicos (como TensorFlow 2.x), lo que hace que ambos sean funcionalmente más similares.
  • Otros frameworks de aprendizaje profundo, como Keras, Caffe, etc., también tienen cierta aplicación, pero PyTorch, debido a su flexibilidad, facilidad de uso y soporte comunitario, se ha convertido en el framework preferido de muchos investigadores y desarrolladores de aprendizaje profundo.
CaracterísticaTensorFlowPyTorch
Empresa desarrolladoraGoogleFacebook (FAIR)
Tipo de grafo computacionalGrafo computacional estático (definido antes de ejecutarse)Grafo computacional dinámico (ejecutado al definirse)
FlexibilidadBaja (el grafo se construye en tiempo de compilación, no es fácil de modificar)Alta (el grafo se crea dinámicamente en tiempo de ejecución, fácil de modificar y depurar)
DepuraciónDifícil (se necesita usartf.debuggingo herramientas externas para depurar)Fácil (se puede depurar directamente en Python)
Facilidad de usoBaja (más complejo, muchas API, curva de aprendizaje pronunciada)Alta (API simple, sintaxis más cercana a Python, fácil de aprender)
DespliegueFuerte (admite una amplia gama de hardware, como TensorFlow Lite, TensorFlow.js)Más débil (relativamente pocas herramientas y plataformas de despliegue, aunque tiene soporte de TensorFlow)
Soporte comunitarioMuy fuerte (comunidad madura y grande, amplios tutoriales y documentación)Muy fuerte (comunidad activa, especialmente en el mundo académico, ecosistema en rápido crecimiento)
Entrenamiento de modelosAdmite entrenamiento distribuido y admite múltiples dispositivos (como CPU, GPU, TPU)Compatibilidad con entrenamiento distribuido, compatible con múltiples GPU, CPU y TPU
Nivel de APIAPI de alto nivel: Keras; API de bajo nivel: TensorFlow CoreAPI de alto nivel: TorchVision, TorchText, etc.; API de bajo nivel: Torch
RendimientoAlto (maduro en optimización, adecuado para entornos de producción)Alto (adecuado para investigación y desarrollo de prototipos, el rendimiento en producción también está mejorando)
Derivación automáticaSítf.GradientTapeImplementa derivación dinámica (más compleja)SíautogradDerivación dinámica (más simple e intuitiva)
Ajuste y escalabilidadFuerte (admite ejecución en múltiples plataformas, como TensorFlow Serving, etc.)Más débil (aunque sobresale en entornos académicos y experimentales, el soporte en entornos de producción es relativamente limitado)
Flexibilidad del marcoBaja (TensorFlow 2.x introdujo características de gráficos dinámicos, pero aún no es completamente flexible)Alta (los gráficos dinámicos aportan mayor flexibilidad)
Soporte de múltiples lenguajesSoporta múltiples lenguajes (Python, C++, Java, JavaScript, etc.)Principalmente soporta Python (pero también tiene API de C++)
Compatibilidad y migraciónTensorFlow 2.x tiene buena compatibilidad con versiones anterioresMala compatibilidad con TensorFlow, migración difícil

PyTorch vs NumPy

Características PyTorch NumPy
Objetivo Especializado en aprendizaje profundo Computación científica general
Soporte de GPU Soporte nativo de CUDA No compatible directamente
Diferenciación automática Derivación automática integrada Requiere calcular gradientes manualmente
Redes neuronales Módulos abundantes de redes neuronales Requiere implementación desde cero
Costo de aprendizaje Relativamente alto Relativamente bajo

Historia y evolución de PyTorch

El predecesor de PyTorch es Torch, un marco de computación científica basado en el lenguaje Lua. Con el auge de Python en el campo del aprendizaje automático, el equipo de Facebook decidió trasladar las ideas centrales de Torch a Python, dando así origen a PyTorch.

  • 2016: Facebook lanzó la versión 0.1 de PyTorch
  • 2017: PyTorch 0.2 introdujo soporte para entrenamiento distribuido
  • 2018: Se lanzó PyTorch 1.0, añadiendo capacidades de implementación en producción
  • 2019: PyTorch 1.3 introdujo soporte para dispositivos móviles
  • 2020: PyTorch 1.6 añadió entrenamiento automático de precisión mixta
  • 2021: PyTorch 1.9 introdujo TorchScript y frontend de C++
  • 2022: PyTorch 1.12 optimizó el rendimiento y la estabilidad
  • 2023: Se lanzó PyTorch 2.0, introduciendo un modo de compilación que mejoró significativamente el rendimiento
Otras extensiones