Integrale neuronale Netze (INNs) sind flexible Architekturen, die einmal trainiert werden und ohne Feinabstimmung in eine beliebige benutzerdefinierte Größe umgewandelt werden können. Da Schallwellen (Musik) mit jeder gewünschten Abtastrate (Klangqualität) abgetastet werden können, können INNs die Form von Daten und Parametern (DNN-Qualität) dynamisch ändern.
Das Team von TheStage.ai präsentierte seinen Artikel „Integral Neural Networks“ auf der IEEE/CVF CVPR 2023-Konferenz. Diese Arbeit wurde als eine von nur 12 „Award Candidate“-Arbeiten ausgezeichnet, die auf der Veranstaltung vorgestellt wurden. INNs sind eine neue Klasse neuronaler Netze, die kontinuierliche Parameter und Integraloperatoren kombinieren, um grundlegende Schichten darzustellen. Während der Inferenzphase werden INNs durch diskrete Stichproben aus kontinuierlichen Gewichten in eine Vanilla-DNN-Darstellung umgewandelt. Die Parameter solcher Netzwerke sind entlang der Filter- und Kanaldimensionen kontinuierlich, was zu einer strukturierten Bereinigung ohne Feinabstimmung allein durch Neudiskretisierung entlang dieser Dimensionen führt.
In diesem Artikel führen wir Sie durch den Prozess der Umwandlung eines 4x-Bild-EDSR-Modells mit Superauflösung in ein INN und zeigen Ihnen dann, wie Sie eine strukturierte Bereinigung des Modells erreichen. Schließlich werden wir die INN wieder in eine diskrete DNN umwandeln und sie für eine effiziente Inferenz auf einer Nvidia-GPU bereitstellen. Dieser Artikel wird wie folgt ablaufen:
Weitere Informationen und Aktualisierungen finden Sie in den folgenden Ressourcen:
Schichten in INNs werden durch Integraloperatoren ersetzt, aber die praktische Auswertung von Integraloperatoren erfordert die Diskretisierung von Eingangssignalen für die Verwendung numerischer Integrationsmethoden. Es stellt sich heraus, dass die Schichten in INNs so gestaltet sind, dass sie nach der Diskretisierung mit klassischen DNN-Schichten (vollständig verbunden, Faltungen) übereinstimmen.
Die Superauflösung von Bildern ist eine bekannte Computer-Vision-Aufgabe, bei der ein Bild mit einem bekannten oder unbekannten Verschlechterungsoperator verbessert werden soll. Wir betrachten die klassische Superauflösungsform mit bikubischem Downsampling als Degradationsoperator.
Viele Architekturen können für Bild-Superauflösungsaufgaben verwendet werden, einschließlich hochwertiger neuronaler Netze, die auf Diffusionsmodellen und Transformatoren basieren. In diesem Dokument konzentrieren wir uns auf die 4x EDSR-Architektur. Die EDSR-Architektur ist für unsere Demonstration gut geeignet, da sie ResNet (das bei vielen Deep-Learning-Problemen weit verbreitet ist) und einen 4x-Upsampling-Block am Ende umfasst. Eine schematische Beschreibung von EDSR finden Sie in den folgenden Abbildungen.
Das strukturierte Bereinigen, bei dem ganze Filter oder Kanäle gelöscht werden, hat einzigartige Auswirkungen auf Restblöcke, die als primäre Bausteine in EDSR dienen. Da jeder Zustand durch Hinzufügen eines Conv -> ReLU -> Conv-Blocks zum Eingang aktualisiert wird, müssen die Eingangs- und Ausgangssignale die gleiche Anzahl von Parametern haben. Dies kann in TorchIntegral effizient verwaltet werden, indem ein Pruning-Abhängigkeitsdiagramm erstellt wird. Die folgende Abbildung zeigt, dass die zweite Faltung jedes Restblocks eine einzelne Gruppe bildet.
Um die zweite Faltung in einem Restblock zu beschneiden, müssen alle zweiten Faltungen in jedem Restblock beschnitten werden. Für einen flexibleren Aufbau bereinigen wir jedoch die Filter der ersten Faltungen und damit die Kanäle der zweiten Faltungen in allen Restblöcken.
Für Konvertierungen aus den vorab trainierten DNNs verwenden wir unseren speziellen Filterkanal-Permutationsalgorithmus mit weiterer glatter Interpolation. Der Permutationsalgorithmus bewahrt die Modellqualität und sorgt gleichzeitig dafür, dass die Gewichte der DNNs so aussehen, als wären sie aus kontinuierlichen Funktionen entnommen.
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()
Bei der Optimierung des Integrationsgitters handelt es sich um die Operation, die Parametertensoren (unter SGD-Optimierung) reibungslos auswählt, deren Filter für benutzerdefinierte Zahlen abgetastet werden sollen. Im Gegensatz zu den Filter-/Kanallöschmethoden generieren INNs Filter, die aufgrund der Interpolationsoperation mehrere diskrete Filter kombinieren können.
INNs führen eine Soft-Select-by-Index-Operation für den Tensor von Parametern entlang der Filter- und Kanaldimensionen ein.
# 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)
Die Optimierung des Integrationsgitters ist ein schneller Optimierungsprozess , der mit einem kleinen Kalibrierungssatz durchgeführt werden kann. Das Ergebnis dieser Optimierung ist ein strukturell komprimiertes DNN. Tests an einem einzelnen Nvidia A4000 zeigen, dass die Optimierung des Integrationsrasters für den gesamten Div2k-Datensatz 4 Minuten erfordert . Ein verteilter Aufbau auf 4x A4000 zeigt eine fast vierfache Geschwindigkeitssteigerung, was zu einer Optimierungszeit von nur 1 Minute führt.
Während unserer Experimente haben wir herausgefunden, dass 500 Bilder das gleiche Ergebnis liefern wie ein vollständiger Div2k-Zugsatz mit 4000 Bildern.
Das resultierende INN-Modell kann problemlos in ein diskretes Modell umgewandelt und auf jeder NVIDIA-GPU bereitgestellt werden. Wir bieten Bilder pro Sekunde (FPS) auf der RTX A4000 mit einer Eingangsauflösung von 64x64. Das komprimierte Modell erreicht eine fast zweifache Geschwindigkeitssteigerung. Um das beschnittene INN-Modell in ein diskretes Modell umzuwandeln, kann die folgende Codezeile verwendet werden:
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')
Modell | Größe FP16 | FPS RTX A4000 | PSNR |
---|---|---|---|
EDSR Orig. | 75 MB | 170 | 30.65 |
INN EDSR 30 % | 52 MB | 230 | 30.43 |
INN EDSR 40 % | 45 MB | 270 | 30.34 |
INN EDSR 50 % | 37 MB | 320 | 30.25 |
In diesem Artikel haben wir einen Überblick über das CVPR2023-Kandidatenpapier „Integrale neuronale Netze“ gegeben. Es wurde für die Bereinigung des 4x-EDSR-Modells nach dem Training angewendet und erreichte mit einer einzigen Codezeile und einer einminütigen Feinabstimmung des Integrationsrasters eine fast zweifache Beschleunigung.
In unseren zukünftigen Artikeln werden wir weitere Anwendungen der INNs vorstellen und weitere Details zur effizienten Modellbereitstellung behandeln. Bleiben Sie dran:
Danke für Ihre Aufmerksamkeit!
Auch hier veröffentlicht.