Les réseaux de neurones intégraux (INN) sont des architectures flexibles qui, formées une fois, peuvent être transformées en une taille arbitraire définie par l'utilisateur sans aucun réglage précis. Comme les ondes sonores (musique) peuvent être échantillonnées à n’importe quelle fréquence d’échantillonnage souhaitée (qualité du son), les DCI peuvent modifier dynamiquement la forme des données et des paramètres (qualité DNN).
L'équipe de TheStage.ai a présenté son article « Integral Neural Networks » lors de la conférence IEEE/CVF CVPR 2023. Ce travail a été reconnu comme l'un des 12 seuls articles « candidats au prix » présentés lors de l'événement. Les DCI sont une nouvelle classe de réseaux neuronaux qui combinent des paramètres continus et des opérateurs intégraux pour représenter les couches de base. Au cours de l'étape d'inférence, les DCI sont convertis en une représentation DNN vanille par échantillonnage discret à partir de poids continus. Les paramètres de tels réseaux sont continus le long des dimensions du filtre et du canal, ce qui conduit à un élagage structuré sans réglage fin simplement par re-discrétisation le long de ces dimensions.
Dans cet article, nous vous guiderons à travers le processus de transformation d'un modèle EDSR de super-résolution d'image 4x en un INN, puis vous montrerons comment réaliser un élagage structuré du modèle. Enfin, nous reconvertirons l'INN en un DNN discret et le déploierons sur un GPU Nvidia pour une inférence efficace. Cet article se déroulera comme suit :
Pour plus d’informations et de mises à jour, veuillez consulter les ressources suivantes :
Code de support de cet article
Les couches des DCI sont remplacées par des opérateurs intégraux, mais l'évaluation pratique des opérateurs intégraux nécessite la discrétisation des signaux d'entrée pour l'utilisation de méthodes d'intégration numérique. Il s’avère que les couches des DCI sont conçues de manière à coïncider avec les couches DNN classiques (entièrement connectées, convolutions) après discrétisation.
La super-résolution d'image est une tâche de vision par ordinateur bien connue dans laquelle une image doit être améliorée avec un opérateur de dégradation connu ou inconnu. Nous considérons la forme classique de super-résolution utilisant le sous-échantillonnage bicubique comme opérateur de dégradation.
De nombreuses architectures peuvent être utilisées pour des tâches de super-résolution d’images, notamment des réseaux de neurones haut de gamme basés sur des modèles de diffusion et des transformateurs. Dans ce document, nous nous concentrerons sur l'architecture 4x EDSR. L'architecture EDSR est bien adaptée à notre démonstration car elle comprend ResNet (qui est largement utilisé dans de nombreux problèmes d'apprentissage profond) et un bloc de suréchantillonnage 4x à la fin. Une description schématique de l’EDSR peut être trouvée dans les figures suivantes.
L'élagage structuré, qui implique la suppression de filtres ou de canaux entiers, a des implications uniques pour les blocs résiduels, qui servent de principaux éléments de base dans EDSR. Étant donné que chaque état est mis à jour en ajoutant un bloc Conv -> ReLU -> Conv à l'entrée, les signaux d'entrée et de sortie doivent avoir le même nombre de paramètres. Cela peut être géré efficacement dans TorchIntegral en créant un graphique de dépendances d'élagage . La figure ci-dessous illustre que la deuxième convolution de chaque bloc résiduel forme un seul groupe.
Pour élaguer la deuxième convolution dans un bloc résiduel, il est nécessaire d’élaguer toutes les secondes convolutions dans chaque bloc résiduel. Cependant, pour une configuration plus flexible, nous élaguons les filtres des premières convolutions, et donc les canaux des secondes convolutions, dans tous les blocs résiduels.
Pour les conversions à partir des DNN pré-entraînés, nous utilisons notre algorithme spécial de permutation des canaux de filtre avec une interpolation plus fluide. L'algorithme de permutation préserve la qualité du modèle tout en donnant l'impression que les poids des DNN sont échantillonnés à partir de fonctions continues.
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()
Le réglage de la grille d'intégration est l'opération qui sélectionne en douceur (sous optimisation SGD) les tenseurs de paramètres dont les filtres doivent être échantillonnés pour les nombres définis par l'utilisateur. Contrairement aux méthodes de suppression de filtre/canal, les DCI génèrent des filtres qui peuvent combiner plusieurs filtres discrets grâce à l'opération d'interpolation.
Les DCI introduisent une opération de sélection douce par index sur le tenseur des paramètres selon les dimensions du filtre et du 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)
Le réglage de la grille d'intégration est un processus d'optimisation rapide qui peut être effectué sur un petit ensemble d'étalonnage. Le résultat de cette optimisation est un DNN structurellement compressé. Les tests sur un seul Nvidia A4000 montrent que le réglage de la grille d'intégration sur l'ensemble de données Div2k complet nécessite 4 minutes . Une configuration distribuée sur 4x A4000 démontre une accélération presque 4x, ce qui se traduit par un temps d'optimisation de seulement 1 minute .
Au cours de nos expériences, nous avons constaté que 500 images donnent le même résultat qu’un train Div2k complet de 4000 images.
Le modèle INN résultant peut être facilement converti en un modèle discret et déployé sur n'importe quel GPU NVIDIA. Nous fournissons des images par seconde (FPS) sur le RTX A4000 avec une résolution d'entrée de 64x64. Le modèle compressé atteint une accélération presque 2x. Pour convertir le modèle INN élagué en un modèle discret, la ligne de code suivante peut être utilisée :
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')
Modèle | Taille FP16 | FPS RTX A4000 | PSNR |
---|---|---|---|
EDSR orig. | 75 Mo | 170 | 30h65 |
AUBERGE EDSR 30% | 52 Mo | 230 | 30.43 |
AUBERGE EDSR 40% | 45 Mo | 270 | 30.34 |
AUBERGE EDSR 50% | 37 Mo | 320 | 30h25 |
Dans cet article, nous avons présenté un aperçu de l'article candidat au prix CVPR2023, « Réseaux de neurones intégraux ». Il a été appliqué pour l'élagage post-formation du modèle EDSR 4x, atteignant une accélération de près de 2x avec une seule ligne de code et un réglage fin d'une minute de la grille d'intégration.
Dans nos prochains articles, nous présenterons plus d'applications des DCI et couvrirons plus de détails sur le déploiement efficace de modèles. Restez à l'écoute:
Code de support de cet article
Merci pour votre attention!
Également publié ici .