• Introdução
• Instalação
• camadas
• Funções de matemática
• Fallback de Pytorch
• Testes
Attorch é um subconjunto do módulo nn
de Pytorch, escrito puramente em Python usando o Triton do Openai. Seu objetivo é ser uma coleção facilmente hackeable, independente e legível de módulos de rede neural, mantendo ou melhorando a eficiência do Pytorch. Em outras palavras, pretende ser um projeto bifurcável dotado de um design simples e intuitivo que possa servir como um ponto de partida acessível para aqueles que procuram desenvolver operações de aprendizado profundo personalizado, mas não estão satisfeitas com a velocidade de uma implementação pura de Pytorch e não possui a experiência técnica ou os recursos para escrever kernels de Cuda.
Já existem várias estruturas maravilhosas do tipo pytorch, alimentadas por Triton, incluindo Kernl, Xformers, Unsloth e fla
, mas a maioria se concentra principalmente em aplicações de transformadores e PNL, enquanto o Attorch visa ser mais inclusivo, apresentando também uma variedade de camadas relativas a áreas além da visão de computador. Além disso, o Attorch não é um pacote somente de inferência e suporta totalmente passes para a frente e para trás, o que significa que pode ser usado durante o treinamento e a inferência, embora seu desempenho para o último geralmente não esteja em pé de igualdade com mecanismos de inferência dedicados.
As únicas dependências de Attorch são torch==2.4.0
e triton==3.0.0
. Instale as versões especificadas dessas duas bibliotecas e clone este repositório para começar.
As camadas atualmente implementadas, com suporte automático de precisão mista (AMP), são, são,
attorch.Conv1d
: 1D-Convolve sobre a entrada usando pesos, adicionando opcionalmente viés.attorch.Conv2d
: 2D-Convolve sobre a entrada usando pesos, adicionando opcionalmente viés.attorch.MultiheadAttention
: Aplica a atenção do produto de pontos em escala de várias cabeças às entradas.attorch.Hardsigmoid
: aplica sigmóide duro à entrada, opcionalmente fusando o abandono.attorch.Hardswish
: aplica -se duro à entrada, opcionalmente, fusando o abandono.attorch.LeakyReLU
: aplica um relu com vazamento à entrada, opcionalmente, fusando o abandono.attorch.GELU
: aplica Gelu à entrada, opcionalmente, fusando o abandono.attorch.ReLU
: aplica -se à entrada, opcionalmente, fusando o abandono.attorch.ReLU6
: aplica -se a Relu6 à entrada, opcionalmente, fusando o abandono.attorch.SELU
: aplica Selu à entrada, opcionalmente fusando o abandono.attorch.SiLU
: aplica Silu à entrada, opcionalmente, fusando o abandono.attorch.Mish
: aplica -se a mish à entrada, opcionalmente, fusando o abandono.attorch.Sigmoid
: aplica sigmoid à entrada, opcionalmente fusando o abandono.attorch.Tanh
: aplica Tanh à entrada, opcionalmente, fusando o abandono.attorch.GLU
: aplica a unidade linear fechada com uma função de ativação arbitrária à entrada.attorch.LogSoftmax
: normaliza a entrada usando o softmax e pega seu log.attorch.Softmax
: normaliza a entrada usando o softmax.attorch.Softmin
: normaliza a entrada usando o softmin.attorch.BatchNorm1d
: O lote normaliza a entrada 2D ou 3D, opcionalmente fundindo uma função de ativação e adicionando um resíduo ao resultado da pré-ativação.attorch.BatchNorm2d
: O lote normaliza a entrada 4D, opcionalmente fundindo uma função de ativação e adicionando um resíduo ao resultado da pré-ativação.attorch.LayerNorm
: camada-normaliza a entrada.attorch.RMSNorm
: Raiz-quadrado-quadrado-normaliza a entrada.attorch.Linear
: Transforma linearmente a entrada usando pesos, opcionalmente adicionando viés e fundindo uma função de ativação.attorch.Dropout
: Zeros aleatoriamente elementos na entrada durante o treinamento.attorch.L1Loss
: mede o erro absoluto médio entre a entrada e o destino.attorch.MSELoss
: mede o erro quadrático médio entre a entrada e o destino.attorch.CrossEntropyLoss
: mede a perda média de entropia cruzada entre a entrada e o alvo, com a reformulação opcional de cada classe.attorch.NLLLoss
: mede a perda de probabilidade de log negativa entre a entrada e o destino, com a reformulação opcional de cada classe.Salvo indicação em contrário em seus documentos, as camadas acima mencionadas se comportam de forma idêntica aos seus equivalentes de pytorch.
Os núcleos de Triton são geralmente compostos por duas partes: uma lida com o carregamento e o armazenamento dos tensores relevantes, o outro transforma os dados usando funções matemáticas apropriadas. Por exemplo, um kernel de normalização da camada lê uma ou várias linhas da entrada (carga), padroniza os recursos (matemática) e grava os resultados em um contêiner (armazenamento). Uma seleção dessas funções matemáticas puras é fornecida pela attorch.math
, o objetivo é facilitar a implementação de núcleos personalizados e fusão da Operação. Embora apenas os passes avançados das mencionados funções estejam disponíveis em attorch.math
, graças à sua pureza e ausência de ações de E/S, seus gradientes podem ser derivados automaticamente através da Biblioteca triton-autodiff
. Partes significativas dos grãos de Attorch podem ser refatórias suplantando seus bits de attorch.math
com as transformações de attorch.math
correspondentes.
Para permitir uma integração mais fácil das camadas de Attorch e Pytorch, é oferecido attorch.nn
, que fornece uma interface aos módulos de Attorch com fallback de Pytorch, caso uma camada desejada não esteja disponível, como visto abaixo.
from attorch import nn
lin = nn . Linear ( 10 , 20 ) # Uses attorch's linear layer
gap = nn . AdaptiveAvgPool2d ( 1 ) # Uses PyTorch's global pooling since GAP is not available in attorch
Cada módulo pode ser testado em relação à sua contraparte Pytorch para garantir a correção. Esses testes são incluídos em tests/
e podem ser executados usando pytest
. Deve -se notar que alguns podem falhar devido a problemas de precisão numérica, mas na maioria dos casos de uso prático, isso não deve ser um problema.