Redes Neurais Integrais (DCIs) são arquiteturas flexíveis que, treinadas uma vez, podem ser transformadas em tamanhos arbitrários definidos pelo usuário, sem qualquer ajuste fino. Como as ondas sonoras (música) podem ser amostradas em qualquer taxa de amostragem desejada (qualidade de som), os INNs podem alterar a forma dos dados e parâmetros (qualidade DNN) dinamicamente.
A equipe do TheStage.ai apresentou seu artigo, “Redes Neurais Integrais”, na conferência IEEE/CVF CVPR 2023. Este trabalho foi reconhecido como um dos 12 artigos 'Candidatos ao Prêmio' apresentados no evento. INNs são uma nova classe de redes neurais que combinam parâmetros contínuos e operadores integrais para representar camadas básicas. Durante o estágio de inferência, os INNs são convertidos em uma representação DNN simples por amostragem discreta de pesos contínuos. Os parâmetros de tais redes são contínuos ao longo das dimensões do filtro e do canal, o que leva à poda estruturada sem ajuste fino apenas pela redistretização ao longo dessas dimensões.
Neste artigo, iremos guiá-lo através do processo de transformação de um modelo EDSR de super-resolução de imagem 4x em um INN e, em seguida, mostraremos como obter a poda estruturada do modelo. Por fim, converteremos o INN de volta em um DNN discreto e o implantaremos em uma GPU Nvidia para inferência eficiente. Este artigo prosseguirá da seguinte forma:
Para mais informações e atualizações, verifique os seguintes recursos:
Código de suporte deste artigo
As camadas nas INNs são substituídas por operadores integrais, mas a avaliação prática dos operadores integrais requer a discretização dos sinais de entrada para a utilização de métodos de integração numérica. Acontece que as camadas nas INNs são projetadas de forma a coincidir com as camadas DNN clássicas (convoluções totalmente conectadas) após a discretização.
A super-resolução de imagem é uma tarefa bem conhecida de visão computacional em que uma imagem deve ser aprimorada com um operador de degradação conhecido ou desconhecido. Consideramos a forma clássica de super-resolução usando redução da resolução bicúbica como operador de degradação.
Muitas arquiteturas podem ser usadas para tarefas de super-resolução de imagens, incluindo redes neurais de ponta baseadas em modelos de difusão e transformadores. Neste documento, focaremos na arquitetura EDSR 4x. A arquitetura EDSR é adequada para nossa demonstração, pois compreende ResNet (que é amplamente utilizado em muitos problemas de aprendizagem profunda) e um bloco de upsampling de 4x no final. Uma descrição esquemática do EDSR pode ser encontrada nas figuras a seguir.
A poda estruturada, que envolve a exclusão de filtros ou canais inteiros, tem implicações únicas para blocos residuais, que servem como blocos de construção primários no EDSR. Como cada estado é atualizado adicionando um bloco Conv -> ReLU -> Conv à entrada, os sinais de entrada e saída devem ter o mesmo número de parâmetros. Isso pode ser gerenciado com eficiência no TorchIntegral criando um gráfico de dependência de poda . A figura abaixo ilustra que a segunda convolução de cada bloco residual forma um único grupo.
Para podar a segunda convolução em um bloco residual, é necessário podar todas as segundas convoluções em cada bloco residual. Porém, para uma configuração mais flexível, removemos os filtros das primeiras convoluções e, portanto, os canais das segundas convoluções, em todos os blocos residuais.
Para conversões de DNNs pré-treinados, utilizamos nosso algoritmo especial de permutação de canais de filtro com interpolação mais suave. O algoritmo de permutação preserva a qualidade do modelo enquanto faz com que os pesos dos DNNs pareçam amostrados de funções contínuas.
import torch import torchintegral as inn from super_image import EdsrModel # creating 4x EDSR model model = EdsrModel.from_pretrained("eugenesiow/edsr", scale=4).cuda() # Transform model layers to integral. # continous_dims and discrete dims define which dimensions # of parameters tensors should be parametrized continuously # or stay fixed size as in discrete networks. # In our case we make all filter and channel dimensions # to be continuous excluding convolutions of the upsample block. model = inn.IntegralWrapper(init_from_discrete=True)( model, example_input, continuous_dims, discrete_dims ).cuda()
O ajuste da grade de integração é a operação que seleciona suavemente (sob otimização SGD) tensores de parâmetros cujos filtros devem ser amostrados para números definidos pelo usuário. Ao contrário dos métodos de exclusão de filtro/canal, os INNs geram filtros que podem combinar vários filtros discretos devido à operação de interpolação.
INNs introduzem operação de seleção suave por índice no tensor de parâmetros ao longo das dimensões do filtro e do canal.
# Set trainable gird for each integral layer # Each group should have the same grid # During the sum of continuous signals # We need to sample it using the same set of points for group in model.groups: new_size = 224 if 'operator' in group.operations else 128 group.reset_grid(inn.TrainableGrid1D(new_size)) # Prepare model for tuning of integration grid model.grid_tuning() # Start training train(model, train_data, test_data)
O ajuste da grade de integração é um processo de otimização rápido que pode ser realizado em um pequeno conjunto de calibração. O resultado desta otimização é uma DNN estruturalmente comprimida. Testes em uma única Nvidia A4000 mostram que o ajuste da grade de integração no conjunto de dados Div2k completo requer 4 minutos . Uma configuração distribuída em 4x A4000 demonstra uma aceleração de quase 4x, resultando em um tempo de otimização de apenas 1 minuto .
Durante nossos experimentos, descobrimos que 500 imagens fornecem o mesmo resultado que um conjunto completo de trens Div2k de 4.000 imagens.
O modelo INN resultante pode ser facilmente convertido em um modelo discreto e implantado em qualquer GPU NVIDIA. Fornecemos quadros por segundo (FPS) no RTX A4000 com resolução de entrada de 64x64. O modelo compactado atinge uma aceleração de quase 2x. Para converter o modelo INN removido em um modelo discreto, a seguinte linha de código pode ser usada:
model = model.transform_to_discrete() # then model can be compiled, for instance # compilation can add an additional 1.4x speedup for inference model = torch.compile(model, backend='cudagraphs')
Modelo | Tamanho FP16 | FPS RTX A4000 | PSNR |
---|---|---|---|
Origem EDSR. | 75MB | 170 | 30,65 |
POUSADA EDSR 30% | 52MB | 230 | 30h43 |
POUSADA EDSR 40% | 45MB | 270 | 30h34 |
POUSADA EDSR 50% | 37MB | 320 | 30h25 |
Neste artigo, apresentamos uma visão geral do artigo candidato ao prêmio CVPR2023, “Redes Neurais Integrais”. Ele foi aplicado para a poda pós-treinamento do modelo EDSR 4x, alcançando uma aceleração de quase 2x com uma única linha de código e ajuste fino de 1 minuto da grade de integração.
Em nossos artigos futuros, apresentaremos mais aplicações dos INNs e cobriremos mais detalhes sobre a implantação eficiente de modelos. Fique atento:
Código de suporte deste artigo
Obrigado pela sua atenção!
Também publicado aqui .