O PyTorch é um framework de deep learning de código aberto baseado em software, usado para construir redes neurais, combinando a biblioteca de aprendizado de máquina (ML) do Torch com uma API de alto nível baseada em Python. Sua flexibilidade e facilidade de uso, entre outros benefícios, o tornaram o framework líder de ML para comunidades acadêmicas e de pesquisa.
O PyTorch é compatível com uma ampla variedade de arquiteturas de redes neurais, desde algoritmos de regressão linear simples até redes neurais convolucionais complexas e modelos de transformadores generativos usados para tarefas como visão computacional e processamento de linguagem natural (NLP). Desenvolvido com base na linguagem de programação Python amplamente conhecida e oferecendo extensas bibliotecas de modelos pré-configurados (e até treinados previamente), o PyTorch permite que cientistas de dados construam e executem redes sofisticadas de deep learning, minimizando o tempo e o trabalho em programação e estrutura matemática.
O PyTorch também permite que cientistas de dados executem e testem partes do código em tempo real, em vez de esperar que todo o código seja implementado, o que, para grandes modelos de deep learning, pode exigir muito tempo. Isso torna o PyTorch uma excelente plataforma para prototipagem rápida e ainda acelera muito o processo de depuração.
Originalmente desenvolvido pela Facebook AI Research (agora Meta), o PyTorch tornou-se código aberto em 2017 e está sob a administração da PyTorch Foundation (que faz parte da Fundação Linux mais ampla) desde 2022. A fundação serve como um espaço neutro para a comunidade de deep learning colaborar no desenvolvimento adicional do ecossistema PyTorch.
Em 2023, a IBM tornou-se um dos principais membros da PyTorch Foundation, já tendo colaborado em dois grandes projetos: permitindo um treinamento mais eficiente de modelos de base de IA flexíveis com bilhões de parâmetros e tornando o checkpointing para treinamento de IA consideravelmente mais econômico. O portfólio IBM watsonx usa o PyTorch para fornecer uma stack de software de nível empresarial para modelos de base de inteligência artificial, desde o treinamento de ponta a ponta até o ajuste fino dos modelos.
A estrutura matemática e de programação do PyTorch simplifica e agiliza os fluxos de trabalho de machine learning, sem limitar a complexidade ou o desempenho de redes neurais profundas.
Python é uma linguagem de programação de alto nível e de uso geral, amplamente utilizada na ciência de dados, o que a torna uma opção intuitiva para cientistas de dados que ampliam seu trabalho para modelar ativamente redes de deep learning. A sintaxe simples do Python é fácil de ler, leva relativamente pouco tempo para ser aprendida e pode ser executada em qualquer sistema operacional, incluindo Windows, macOS, Linux ou Unix. O Python tem sido a segunda linguagem de programação mais usada no GitHub há mais de três anos, tendo ultrapassado o Java em 2019. Sua popularidade continua a crescer, com um aumento de 22,5% em 2022.1
Essa flexibilidade e simplicidade ajudaram a promover uma comunidade online robusta de desenvolvedores do Python, trabalhando em conjunto em uma ampla variedade de bibliotecas e APIs do Python, como Numerical Python (NumPy) para operações matemáticas, Pandas para manipulação de dados ou matplotlib para visualização de dados e recursos educacionais. Essa comunidade também produziu um grande volume de bibliotecas Pytorch que reduzem a monotonia e a adivinhação da programação para aprendizado de máquina, liberando desenvolvedores e cientistas de dados para se concentrar na inovação em vez de escrever tarefas rotineiras.
Em qualquer algoritmo de machine learning, mesmo aqueles aplicados a informações não numéricas, como sons ou imagens, os dados devem ser representados na forma numérica. Em PyTorch, isso é alcançado através de tensores, que servem como unidades fundamentais de dados utilizados para computação na plataforma.
No contexto do machine learning, um tensor é uma matriz numérica multidimensional que funciona como um dispositivo matemático de contabilidade. De forma linguística, o "tensor" funciona como um termo genérico, incluindo algumas entidades matemáticas mais conhecidas:
Os tensores do PyTorch funcionam de forma semelhante aos ndarrays usados no NumPy, mas ao contrário dos ndarrays, que só podem ser executados em unidades centrais de processamento (CPUs), os tensores também podem ser executados em unidades de processamento gráfico (GPUs). As GPUs permitem uma computação muito mais rápida do que as CPUs, o que é uma grande vantagem, considerando os grandes volumes de dados e o processamento paralelo típicos do deep learning.
Além de codificar as entradas e saídas de um modelo, os tensores PyTorch também codificam os parâmetros do modelo: os pesos, os vieses e os gradientes que são "aprendidos" no aprendizado de máquina. Esta propriedade de tensores permite a diferenciação automática, uma das características mais importantes do PyTorch.
O PyTorch emprega módulos como blocos de construção de modelos de deep learning, o que permite a construção rápida e direta de redes neurais sem o trabalho tedioso de codificação manual de cada algoritmo.
Os módulos podem conter (e geralmente contêm) outros módulos aninhados. Além de permitir a criação de redes neurais multicamadas mais elaboradas, isso também permite que esses modelos complexos de deep learning sejam facilmente salvos como um único módulo nomeado e transferidos entre diversas máquinas, CPUs ou GPUs. Os modelos PyTorch podem até ser executados em ambientes diferentes do Python, como C++, usando Torchscript, ajudando a preencher a lacuna entre os protótipos de pesquisa e a implementação em produção.
De um modo geral, há três classes principais de módulos utilizadas para construir e otimizar modelos de deep learning no PyTorch:
São implementados módulos nn como camadas de uma rede neural. O pacote torch.nn contém uma grande biblioteca de módulos que executam operações comuns, como convoluções, pool e regressão. Por exemplo, torch.nn.Linear(n,m) chama um algoritmo de regressão linear com n entradas e m saídas (cujas entradas e parâmetros iniciais são, então, estabelecidos em linhas de código subsequentes).
O módulo autograd proporciona uma maneira simples de calcular automaticamente os gradientes, usados para otimizar os parâmetros do modelo por meio de gradiente descendente, para qualquer função operada dentro de uma rede neural. Anexando qualquer tensor com sinais requires_grad=True para o autograd de que todas as operações nesse tensor devem ser rastreadas, o que permite a diferenciação automática.
Módulos Optim aplicam algoritmos de otimização a esses gradientes. O Torch.optim oferece módulos para vários métodos de otimização, como descendente de gradiente estocástico (SGD) ou propagação quadrada média raiz (RMSprop), para atender às necessidades específicas de otimização.
Os gráficos dinâmicos de computação (DCGs) são a maneira como os modelos de deep learning são representados no PyTorch. De uma forma abstrata, gráficos de computação associam o fluxo de dados entre as diferentes operações em um sistema matemático: no contexto de deep learning, eles essencialmente traduzem o código de uma rede neural em um fluxograma indicando as operações executadas em cada nó e as dependências entre diferentes camadas na rede, arranjo de etapas e sequências que transformam dados de entrada em dados de saída.
O que diferencia os gráficos dinâmicos de computação (como os usados no PyTorch) dos gráficos de computação estática (como os usados no TensorFlow) é que os DCGs adiam a especificação exata de cálculos e relacionamentos entre eles até o tempo de execução. Em outras palavras, enquanto um gráfico de computação estática exige que a arquitetura de toda a rede neural seja totalmente determinada e compilada para ser executada, os DCGs podem ser iterados e modificados em tempo real.
Isso torna os DCGs particularmente úteis para depuração e prototipagem, pois partes específicas do código de um modelo podem ser alteradas ou executadas isoladamente sem a necessidade de redefinir o modelo inteiro, o que, para os modelos de deep learning muito grandes usados para tarefas sofisticadas de visão computacional e PNL, pode ser um desperdício de tempo e recursos computacionais. Os benefícios dessa flexibilidade se estendem ao treinamento do modelo, pois os gráficos de computação dinâmica são facilmente gerados em sentido inverso durante a retropropagação.
Embora sua estrutura fixa possa capacitar maior eficiência computacional, gráficos computacionais estáticos têm flexibilidade limitada: por exemplo, a construção de um modelo que utiliza um número variável de camadas dependendo dos dados de entrada, como uma rede neural convolucional (CNN) capaz de processar imagens de diferentes tamanhos, é proibitivamente difícil com gráficos estáticos.
Um método amplamente utilizado para treinar redes neurais, especialmente em aprendizado supervisionado, é a retropropagação. Primeiro, em uma passagem adiante, um modelo é alimentado com algumas entradas (x) e prevê algumas saídas (y); trabalhando para trás a partir dessa saída, é utilizada uma função de perda para medir o erro das previsões do modelo em valores diferentes de x. Ao diferenciar essa função de perda para encontrar sua derivada, o gradiente descendente pode ser utilizado para ajustar os pesos na rede neural, uma camada de cada vez.
O módulo autograd do PyTorch alimenta sua técnica de diferenciação automática com uma fórmula de cálculo chamada regra de cadeia, calculando derivadas complexas e dividindo-as em derivadas mais simples e combinando-as mais tarde. O Autograd calcula e registra automaticamente gradientes para todas as operações executadas em um gráfico computacional, reduzindo enormemente o trabalho braçal da retropropagação.
Executando um modelo que já foi treinado, o autograd passa a ser um uso desnecessário de recursos computacionais. A anexação de qualquer operação do tensor com requires_grad=False sinalizará PyTorch para parar de rastrear gradientes.
O trabalho com grandes conjuntos de dados necessários para treinar modelos de deep learning pode ser complexo e computacionalmente exigente. O PyTorch oferece duas primitivas de dados, conjuntos de dados e dataloaders para facilitar o carregamento de dados e tornar o código mais legível.
As principais funcionalidades do PyTorch são complementadas por um ecossistema robusto de ferramentas, bibliotecas e extensões desenvolvido por membros da comunidade PyTorch. Muitas bibliotecas de código aberto adicionais, contendo módulos de propósito específico, redes neurais pré-configuradas e até modelos treinados previamente, estão disponíveis para complementar a biblioteca Torch instalada previamente.
Torchvision é um kit de ferramentas que contém módulos, arquiteturas de rede e conjuntos de dados para várias tarefas de classificação de imagem, detecção de objetos e segmentação de imagem.
O TorchText oferece recursos como conjuntos de dados, transformações básicas de processamento de texto e modelos treinados previamente para uso em NLP.
O Open Neural Network Exchange (ONNX) garante a interoperabilidade entre as estruturas de IA, permitindo que os usuários transfiram facilmente seus modelos PyTorch para outras plataformas.
Há muitos tutoriais úteis disponíveis em PyTorch.org. Por exemplo, este tutorial intermediário ensina os fundamentos do aprendizado por reforço profundo treinando uma IA para jogar um videogame.
O PyTorch pode ser instalado e executado em diversas configurações em sistemas locais e plataformas em nuvem.
Executar o PyTorch localmente requer a instalação do Python, usando o gerenciador de pacotes Anaconda, o Homebrew ou o site do Python.
O PyTorch pode ser instalado localmente via Anaconda usando o comando conda install pytorch torchvision -c pytorch, ou via pip usando o comando pip3 install torch torchvision. O Anaconda é recomendado, pois oferece todas as dependências do PyTorch (inclusive o Python) em uma instalação de área de testes.2
O PyTorch também pode ser executado em plataformas de nuvem, incluindo Amazon Web Services, Google Cloud e Microsoft Azure.
Recomenda-se (mas não é obrigatório) trabalhar com GPUs da NVIDIA para tirar proveito da compatibilidade do PyTorch com a CUDA (Compute Unified Device Architecture), que oferece um treinamento e desempenho consideravelmente mais rápidos do que o que pode ser proporcionado por CPUs.
1 Octoverse 2022: The top programming languages, Github, 17 de novembro de 2022
2 PyTorch: Get Started – Start Locally