paint-brush
Liberando aceleração 2x para DNNs: transformando modelos com redes neurais integrais em apenas 1 minutopor@thestage
1,192 leituras
1,192 leituras

Liberando aceleração 2x para DNNs: transformando modelos com redes neurais integrais em apenas 1 minuto

por TheStage AI6m2023/08/31
Read on Terminal Reader

Muito longo; Para ler

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.
featured image - Liberando aceleração 2x para DNNs: transformando modelos com redes neurais integrais em apenas 1 minuto
TheStage AI HackerNoon profile picture
0-item
1-item


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.


Aplicações de INNs. Durante a inferência, pode-se alterar o tamanho da rede dinamicamente dependendo do hardware ou das condições dos dados. A redução de tamanho é estruturada e leva automaticamente à compressão e aceleração da rede neural.



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:


  1. Uma breve introdução aos INNs.
  2. Visão geral da rede EDSR para tarefas de super-resolução.
  3. Aplicativo de estrutura TorchIntegral para obter EDSR integral em uma única linha de código.
  4. Poda estrutural do INN sem ajuste fino do INN (pipeline rápido).
  5. Implante modelos removidos em GPUs Nvidia.


Para mais informações e atualizações, verifique os seguintes recursos:

Local do projeto INN

Projeto INN Github

Código de suporte deste artigo


Mapas de características de EDSR discreto.


Mapas de recursos do INN EDSR. É fácil perceber que os canais nas DCIs são organizados continuamente.


INNs para poda de DNNs sem ajuste fino

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.


Visão geral da avaliação integral da camada totalmente conectada.


Poda de super-resolução de imagem EDSR 4x

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.


Arquitetura EDSR. A arquitetura EDSR consiste em uma sequência de blocos residuais, seguida por um bloco de upsample. Este bloco upsample é composto por várias convoluções e camadas Upsample.


Esquerda: Arquitetura de bloco residual. À direita: bloco de upsampling para superresolução de 4x, cada camada de upsample tem escala de 2x.


Especificidades da remoção da arquitetura EDSR

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.


Removendo grupos de dependências. Numa sequência de blocos residuais, a segunda convolução 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.


Conversão do modelo EDSR para INN EDSR

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.


Conversão de DNN para INN. Estamos usando a formulação do Problema do Caixeiro Viajante para permutar pesos discretos. Após a permutação, obtivemos pesos mais suaves, sem queda na qualidade do DNN pré-treinado.


 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()


Ajuste de grade de integração: poda estruturada pós-treinamento de DNNs

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.


Desempenho

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') 


Esquerda. Imagem ampliada bicúbica 4x. Certo. Modelo EDSR 50% compactado usando INN.


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

Conclusão

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:


Local do projeto INN

Projeto INN Github

Código de suporte deste artigo


Obrigado pela sua atenção!


Também publicado aqui .