Heim >Technologie-Peripheriegeräte >KI >Der Durchsatz wurde um das 30-fache erhöht: Die CV-Pipeline bewegt sich in Richtung Full-Stack-Parallelisierung
John Ousterhout, ein Stanford-Professor und Erfinder der Tcl-Sprache, schrieb einst ein Buch „The Philosophy of Software Design“, Systemdiskussion Es erläutert die allgemeinen Prinzipien und Methoden des Softwaredesigns. Der Kernpunkt des Buches ist, dass der Kern des Softwaredesigns darin besteht, die Komplexität zu reduzieren.
Tatsächlich gilt dieser Standpunkt auch für Softwaredesign, das eine Anpassung der zugrunde liegenden Hardware beinhaltet.
Nehmen Sie die Entwicklung visueller Modelle als Beispiel. In der Vergangenheit wurde bei der Entwicklung visueller Modelle im Allgemeinen mehr Wert auf die Optimierung des Modells selbst gelegt, um Geschwindigkeit und Wirkung zu verbessern. Den Bildvorverarbeitungs- (Vorverarbeitungs-) und Nachbearbeitungsphasen wird jedoch wenig Aufmerksamkeit geschenkt.
Wenn die Modellberechnung, also die Hauptphase des Modelltrainings und der Inferenz, immer effizienter wird, werden die Vor- und Nachbearbeitungsphasen von Bildern zunehmend zum Leistungsengpass bei Bildverarbeitungsaufgaben.
Insbesondere im traditionellen Bildverarbeitungsprozess vor und nach dem Der Verarbeitungsteil wird normalerweise von der CPU betrieben, was dazu führt, dass 50 % bis mehr als 90 % der Arbeitslast im gesamten Prozess auf die Vor- und Nachverarbeitung entfallen und somit zum Leistungsengpass des gesamten Algorithmusprozesses werden.
#🎜 🎜 #Die oben genannten Probleme sind die Haupteinschränkungen der derzeit auf dem Markt befindlichen gängigen CV-Bibliotheken in Anwendungsszenarien. Mit anderen Worten: Die Inkonsistenz in Abhängigkeit von der zugrunde liegenden Hardware führt zu Komplexität und Leistungsengpässen. Wie John Ousterhout die Ursachen der Komplexität zusammenfasste: Komplexität entsteht durch Abhängigkeiten.
# 🎜 🎜#Die gängige Bildverarbeitungsbibliothek OpenCV verfügt über ein breites Spektrum an Anwendungsszenarien, weist jedoch bei der tatsächlichen Verwendung auch einige Probleme auf.
Wenn Sie beispielsweise die CPU-Version von OpenCV verwenden, um zuerst das Training und dann die Inferenz durchzuführen, benötigen Sie während der Inferenzphase möglicherweise eine Version mit höherer Leistung.
Denn im Trainingsszenario können die Vor- und Nachverarbeitung sowie die Modellinferenz zeitlich abgedeckt werden, wodurch die Vorverarbeitungszeit abgedeckt wird. In der Inferenzpipeline enthält das Modell jedoch nur Vorwärtsinferenz, und der Zeitverbrauch wird nach der Tensor-RT-Beschleunigung drastisch reduziert. Zu diesem Zeitpunkt ist der Zeitverbrauch der Vorverarbeitung sehr hoch und kann nur schwer abgedeckt werden Modellinferenz.
Um den Zeitaufwand zu reduzieren und die Leistung von Inferenzszenarien zu verbessern, wird im Allgemeinen die GPU-Version von OpenCV zur Beschleunigung verwendet.
Es kann jedoch zu inkonsistenten Ergebnissen zwischen der CPU-Version und der GPU-Version von OpenCV kommen. Ein typisches Beispiel ist der Resize-Operator, der den Unterschied zwischen der CPU-Version und der GPU-Version unterschiedlich berechnet.
OpenCV verwendet während des Trainings im Allgemeinen unterschiedliche Versionen von Operatoren, da die CPU-Operatorabdeckung im Allgemeinen während des Inferenzvorgangs relativ hoch ist. Daher kann es auch zu Problemen bei der Ergebnisausrichtung kommen. Mit anderen Worten: Wenn die CPU für das Modelltraining und die GPU für die Modellinferenz verwendet wird, werden die endgültigen Ausgabeergebnisse nicht abgeglichen.
Zweitens wird die Leistung einiger GPU-Operatoren beeinträchtigt. In OpenCV sind einige GPU-Operatoren selbst relativ zeitaufwändig, was dazu führt, dass die Leistung des gesamten Operators zurückgeht, sogar schlechter als bei der CPU-Version.
Drittens ist die GPU-Operatorabdeckung von OpenCV begrenzt und einige Operatoren verfügen nur über CPU-Versionen. Es gibt auch einige GPU-Operatoren, deren Abdeckung an Parametern, Datentypen usw. nicht so hoch ist wie die der CPU-Version, was zu Einschränkungen bei der Verwendung führt.
Wenn schließlich der CPU-Operator und der GPU-Operator während der Verwendung interaktiv verwendet werden, führt dies zu einer großen Anzahl von Datenkopien und Synchronisierungsvorgängen zwischen der CPU und der GPU, was zu einer unzureichenden Gesamtbeschleunigung führt Leistung.
Eine weitere häufig verwendete Bildverarbeitungsbibliothek ist TorchVision.
Wenn TorchVision Modellinferenzen durchführt, fehlen einigen Operatoren C++-Schnittstellen, was zu einem Mangel an Flexibilität beim Aufruf führt. Wenn Sie eine C++-Version generieren möchten, müssen Sie diese über TorchScript generieren. Dies führt zu großen Unannehmlichkeiten bei der Verwendung, da das Einfügen von Operatoren aus anderen Bibliotheken mitten im Prozess zur interaktiven Verwendung zusätzlichen Overhead und Arbeitsaufwand mit sich bringt. Ein weiterer Nachteil von TorchVision besteht darin, dass die Bedienerabdeckung nicht hoch ist.
Das Obige sind die Einschränkungen der aktuellen Mainstream-Lebenslaufbibliotheken.
Da der Leistungsengpass der Vor- und Nachbearbeitung hauptsächlich in der Verwendung von CPU-Berechnungen liegt, ist die Technologie der Verwendung von GPUs in der Modellberechnungsphase immer beliebter geworden reifer.
Dann besteht eine natürliche Lösung darin, die GPU zu verwenden, um die Vor- und Nachbearbeitung zu beschleunigen, was die Leistung der gesamten Algorithmus-Pipeline erheblich verbessern wird.
Zu diesem Zweck haben NVIDIA und ByteDance gemeinsam die Bildvorverarbeitungsoperatorbibliothek CV-CUDA als Open-Source-Lösung bereitgestellt. CV-CUDA kann effizient auf der GPU ausgeführt werden und die Bedienergeschwindigkeit kann etwa das Hundertfache der von OpenCV erreichen.
Am 15. Januar 2023 von 9:30 bis 11:30 Uhr lud die von NVIDIA veranstaltete „CV-CUDA First Open Class“ drei technische Experten von NVIDIA, ByteDance und Sina Weibo ein (Zhang Yi, Sheng Yiyao, Pang Feng). ) ging ausführlich auf verwandte Themen ein. Dieser Artikel fasst den Kern der Reden der drei Experten zusammen.
Die Verwendung einer GPU anstelle einer CPU bietet viele Vorteile. Nachdem die Vor- und Nachverarbeitungsoperatoren auf die GPU migriert wurden, kann zunächst die Recheneffizienz der Operatoren verbessert werden.
Zweitens kann das Kopieren von Daten zwischen CPU und GPU reduziert werden, da alle Prozesse auf der GPU ausgeführt werden.
Abschließend kann nach der Verlagerung der CPU-Last auf die GPU die CPU-Last reduziert und die CPU für die Verarbeitung anderer Aufgaben genutzt werden, die komplexe Logik erfordern.
Nach der Migration des gesamten Prozesses auf die GPU kann die gesamte Pipeline um fast das 30-fache verbessert werden, wodurch Rechenaufwand gespart und die Betriebskosten gesenkt werden.
Aus dem Datenvergleich in der Abbildung können Sie ersehen, dass OpenCV bei gleicher Server- und Parameterkonfiguration für einen 1080p-Videostream mit 30 Bildern pro Sekunde bis zu 2-3 parallele Streams und PyTorch (CPU) öffnen kann bis zu 1,5 parallele Streams, und CV-CUDA kann bis zu 60 parallele Streams öffnen. Es ist ersichtlich, dass die Gesamtleistung erheblich verbessert wurde. Zu den beteiligten Vorverarbeitungsoperatoren gehören Größenänderung, Auffüllen, Normalisieren usw. und zu den Nachverarbeitungsoperatoren gehören Zuschneiden, Größenänderung, Verfassen usw.
Warum kann sich die GPU an die Beschleunigungsanforderungen der Vor- und Nachbearbeitung anpassen? Profitieren Sie von der Asynchronität zwischen Modellberechnung und Vor- und Nachverarbeitung und passen Sie sich an die parallelen Rechenfunktionen der GPU an.
Wir erklären die Vorverarbeitungs-Asynchronisierung des Modelltrainings bzw. der Modellinferenz.
Das Modelltraining kann in zwei Teile unterteilt werden: Der erste ist die Datenvorbereitung und der zweite die Modellberechnung.
Aktuelle Mainstream-Frameworks für maschinelles Lernen wie PyTorch und TensorFlow arbeiten asynchron zwischen Datenvorbereitung und Modellberechnung. Am Beispiel von PyTorch werden mehrere Unterprozesse zur Datenvorbereitung gestartet.
Wie in der Abbildung gezeigt, gibt es zwei Zustände, nämlich Modellberechnung und Datenvorbereitung. Wenn beispielsweise D0 abgeschlossen ist, kann B0 ausgeführt werden .
Aus Leistungssicht erwarten wir, dass die Geschwindigkeit der Datenaufbereitung mit der Geschwindigkeit der Modellberechnung mithalten kann. In tatsächlichen Situationen dauern jedoch einige Datenlese- und Datenvorverarbeitungsprozesse lange, was dazu führt, dass eine gewisse Zeitspanne vergeht, bevor entsprechende Modellberechnungen durchgeführt werden können, was zu einer Verringerung der GPU-Auslastung führt.
Die Datenvorbereitung kann in Datenlesen und Datenvorverarbeitung unterteilt werden. Diese beiden Phasen können seriell oder parallel ausgeführt werden. Unter dem PyTorch-Framework werden sie beispielsweise seriell ausgeführt.
Es gibt viele Faktoren, die die Leistung des Datenlesens beeinflussen, wie z. B. Datenspeichermedium, Speicherformat, Parallelität, Anzahl der Ausführungsprozesse usw.
Im Gegensatz dazu ist der Faktor, der die Leistung der Datenvorverarbeitung beeinflusst, relativ einfach, nämlich der Grad der Parallelität . Je höher der Grad der Parallelität, desto besser ist die Leistung der Datenvorverarbeitung. Mit anderen Worten: Durch die asynchrone Datenvorverarbeitung und Modellberechnung sowie die Erhöhung der Parallelität der Datenvorverarbeitung kann die Leistung der Datenvorverarbeitung verbessert werden.
In der Modellinferenzphase gibt es zwei Indikatoren: Der erste ist der Durchsatz und der zweite die Verzögerung. In gewisser Weise schließen sich diese beiden Indikatoren gegenseitig aus.
Bei einer einzelnen Abfrage verarbeitet der Server die Daten nach dem Empfang der Daten vor und führt dann eine Modellinferenz durch. Bei einer einzelnen Abfrage handelt es sich also gewissermaßen um einen seriellen Prozess.
Aber das ist sehr ineffizient und wird eine Menge Rechenressourcen verschwenden. Um den Durchsatz zu verbessern, verwenden viele Inferenz-Engines dieselbe Strategie wie in der Trainingsphase, um Daten und Modellberechnungen asynchron vorzubereiten. In der Datenvorbereitungsphase wird eine bestimmte Anzahl von Abfragen gesammelt und zu einem Stapel zusammengefasst. Anschließend werden nachfolgende Berechnungen durchgeführt, um den Gesamtdurchsatz zu verbessern.
In Bezug auf den Durchsatz sind Modellinferenz und Modelltraining relativ ähnlich. Durch die Verlagerung der Datenvorverarbeitungsstufe von der CPU auf die GPU können Durchsatzsteigerungen erzielt werden.
Gleichzeitig wird aus Sicht der Verzögerung für jede Abfrageanweisung die Verzögerung für jede Abfrage entsprechend verkürzt, wenn die für den Vorverarbeitungsprozess aufgewendete Zeit reduziert werden kann.
Ein weiteres Merkmal der Modellinferenz ist, dass der Umfang der Modellberechnung relativ gering ist, da es sich nur um Vorwärtsberechnungen und nicht um Rückwärtsberechnungen handelt. Dies bedeutet, dass die Modellinferenz eine höhere Datenvorverarbeitung erfordert.
Vorausgesetzt, dass genügend CPU-Ressourcen für die Berechnung vorhanden sind, wird die Vorverarbeitung theoretisch nicht zu einem Leistungsengpass. Denn sobald Sie feststellen, dass die Leistung nicht mithalten kann, müssen Sie nur noch Prozesse hinzufügen, um Vorverarbeitungsvorgänge durchzuführen.
Daher kann die Datenvorverarbeitung nur dann zu einem Leistungsengpass werden, wenn Konkurrenz um CPU-Ressourcen besteht.
Im tatsächlichen Geschäftsleben ist der Wettbewerb um CPU-Ressourcen weit verbreitet, was zu einer verringerten GPU-Auslastung in nachfolgenden Trainings- und Inferenzphasen und damit zu einer verringerten Trainingsgeschwindigkeit führt.
Da die GPU-Rechenleistung weiter zunimmt, ist absehbar, dass die Geschwindigkeitsanforderungen für die Datenvorbereitungsphase immer höher werden.
Aus diesem Grund ist es eine natürliche Entscheidung, den Vorverarbeitungsteil auf die GPU zu verlagern, um das Problem der CPU-Ressourcenkonkurrenz zu lindern und die GPU-Auslastung zu verbessern.
Im Allgemeinen reduziert dieses Design die Komplexität des Systems und passt den Hauptteil der Modellpipeline direkt an die GPU an, was eine große Hilfe bei der Verbesserung der Auslastung von GPU und CPU sein kann. Gleichzeitig vermeidet es auch das Problem der Ergebnisausrichtung zwischen verschiedenen Versionen, reduziert Abhängigkeiten und entspricht den von John Ousterhout vorgeschlagenen Software-Designprinzipien.
Die Verlagerung der Vorverarbeitungs- und Nachverarbeitungsprozesse auf die GPU muss mehrere Bedingungen erfüllen.
Das erste ist, dass seine Leistung mindestens besser als die der CPU sein sollte. Dies liegt vor allem an den hohen gleichzeitigen Rechenfähigkeiten von GPUs.
Das zweite ist die Beschleunigung der Vorverarbeitung, die sich nicht negativ auf andere Prozesse wie die Modellinferenz auswirken kann. Für die zweite Anforderung verfügt jeder Operator von CV-CUDA über eine Schnittstelle zwischen Stream und CUDA-Speicher, sodass die GPU-Ressourcen sinnvoller zugewiesen werden können und die Ausführung dieser Vorverarbeitungsoperatoren auf der GPU keine allzu großen Auswirkungen hat. zur Modellrechnung selbst.
Drittens haben Internetunternehmen sehr unterschiedliche Geschäftsanforderungen, die viele Arten von Modellen und entsprechende Vorverarbeitungslogik umfassen. Daher müssen Vorverarbeitungsoperatoren kundenspezifisch entwickelt werden, um eine größere Flexibilität bei der Implementierung komplexer Logik zu haben.
Im Allgemeinen beschleunigt CV-CUDA die Vor- und Nachbearbeitungsphasen in der Modellpipeline unter Aspekten von Hardware, Software, Algorithmen, Sprachen usw. und vereinheitlicht die gesamte Pipeline.
In Bezug auf die Hardware basiert CV-CUDA auf den parallelen Rechenfunktionen der GPU, die die Geschwindigkeit und den Durchsatz der Vor- und Nachbearbeitung erheblich verbessern und die Wartezeit reduzieren können Modellberechnung und Verbesserung der GPU-Auslastung.
CV-CUDA unterstützt die Modi „Batch“ und „Variable Form“. Der Stapelmodus unterstützt die Stapelverarbeitung und kann die parallelen Eigenschaften der GPU voll ausnutzen. OpenCV kann jedoch nur ein einzelnes Bild aufrufen, unabhängig davon, ob es sich um die CPU- oder GPU-Version handelt.
Der Modus „Variable Form“ bedeutet, dass in einem Stapel die Länge und Breite jedes Bildes unterschiedlich sein kann. Die Länge und Breite von Bildern im Internet sind im Allgemeinen inkonsistent. Die gängige Framework-Methode besteht darin, die Länge und Breite auf die gleiche Größe zu ändern, dann die Bilder mit der gleichen Länge und Breite in einen Stapel zu packen und den Stapel dann zu verarbeiten. CV-CUDA kann Bilder unterschiedlicher Länge und Breite direkt zur Verarbeitung in einen Stapel einfügen, was nicht nur die Effizienz verbessert, sondern auch sehr bequem zu verwenden ist.
Eine weitere Bedeutung von Variable Shape besteht darin, dass Sie bei der Verarbeitung von Bildern bestimmte Parameter für jedes Bild angeben können, z. B. Drehen. Für einen Stapel von Bildern können Sie den Drehwinkel jedes Bilds angeben.
In Bezug auf Software hat CV-CUDA eine große Anzahl von Softwareoptimierungsmethoden zur weiteren Optimierung entwickelt, einschließlich Leistungsoptimierung (z. B. Speicherzugriffsoptimierung) und Ressourcennutzungsoptimierung (z. B Vorabzuweisung des Videospeichers), damit es in Trainings- und Inferenzszenarien in der Cloud effizient ausgeführt werden kann.
Die erste ist die Einstellung für die Vorbelegung des Videospeichers. Wenn OpenCV die GPU-Version aufruft, führen einige Bediener cudaMalloc intern aus, was zu einem erheblichen Anstieg des Zeitverbrauchs führt. In CV-CUDA wird die gesamte Vorabzuweisung des Videospeichers während der Initialisierungsphase durchgeführt, während während der Trainings- und Inferenzphase keine Vorgänge zur Zuweisung des Videospeichers durchgeführt werden, wodurch die Effizienz verbessert wird.
Zweitens arbeiten alle Operatoren asynchron. CV-CUDA integriert eine große Anzahl von Kerneln, wodurch die Anzahl der Kernel reduziert, die Startzeit des Kernels sowie das Kopieren und Löschen von Daten verkürzt und die Gesamtbetriebseffizienz verbessert werden.
Drittens optimiert CV-CUDA auch den Speicherzugriff, z. B. durch Zusammenführen des Speicherzugriffs, vektorisiertes Lesen und Schreiben usw., um die Bandbreitennutzung zu verbessern, und nutzt außerdem gemeinsam genutzten Speicher, um den Speicherzugriff sowie die Lese- und Schreibeffizienz zu verbessern.
Schließlich hat CV-CUDA auch viele Optimierungen bei Berechnungen vorgenommen, wie z. B. schnelle Mathematik, Warp-Reduzierung/Block-Reduzierung usw.
In Bezug auf den Algorithmus sind die Operatoren von CV-CUDA alle unabhängig voneinander entworfen. angepasst, was eine sehr komplexe Logikimplementierung unterstützen und die Verwendung und das Debuggen erleichtern kann.
Wie versteht man unabhängiges Design? In der Bildverarbeitungsbibliothek gibt es zwei Formen des Operatoraufrufs: Eine ist die allgemeine Pipeline-Form, die nur die Ergebnisse der Pipeline abrufen kann, wie z. B. DALI, und die andere ist die modulare unabhängige Operatorform, die jeden Operator erhalten kann. Individuelle Ergebnisse, z. B. OpenCV. CV-CUDA verwendet dasselbe Aufrufformular wie OpenCV, was bequemer zu verwenden und zu debuggen ist.
In Bezug auf die Sprache unterstützt CV-CUDA umfangreiche APIs und kann dies auch tun Nahtlos Die Vor- und Nachverarbeitung verbindet Trainings- und Inferenzszenarien.
Diese APIs umfassen häufig verwendete C-, C++-, Python-Schnittstellen usw., wodurch wir sowohl Trainings- als auch Inferenzszenarien unterstützen können. Es unterstützt auch PyTorch- und TensorRT-Schnittstellen. In Zukunft wird CV-CUDA auch Triton, TensorFlow, JAX und andere Schnittstellen unterstützen.
In der Argumentationsphase können Sie direkt die Python- oder C++-Schnittstelle zum Denken verwenden, solange Sie sicherstellen, dass die Vor- und Nachbearbeitung, Modell und GPU werden während der Argumentation verwendet. Legen Sie es einfach in einen Stream. #🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#fünf,#🎜🎜 ## 🎜🎜##🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜 🎜# Indem wir die Anwendungsfälle von CV-CUDA in NVIDIA, ByteDance und Sina Weibo zeigen, können wir erkennen, wie bedeutend die Leistungsverbesserung durch CV-CUDA ist.
Zunächst zeigte NVIDIA Fall der Bildklassifizierung.
In der Pipeline der Bildklassifizierung ist der erste Teil die JPEG-Dekodierung, der grüne Teil ist die Vorverarbeitung Schritt, einschließlich Größenänderung, Konvertierung des Datentyps, Normalisierung und Neuformatierung; der blaue Teil ist der Vorwärtsbegründungsprozess mit PyTorch, und schließlich werden die Klassifizierungsergebnisse bewertet und sortiert.
Vergleichen Sie CV-CUDA mit OpenCV Beim Vergleich der Leistung der CPU-Version und der GPU-Version können wir feststellen, dass die GPU-Version von OpenCV eine größere Leistungsverbesserung erzielen kann als die CPU-Version, und durch die Anwendung von CV-CUDA kann die Leistung verdoppelt werden. Beispielsweise beträgt die Anzahl der vom OpenCV-CPU-Operator pro Millisekunde verarbeiteten Bilder 22 und die Anzahl der vom GPU-Operator pro Millisekunde verarbeiteten Bilder mehr als 200. CV-CUDA kann mehr als 500 Bilder pro Millisekunde verarbeiten, und sein Durchsatz beträgt die der OpenCV-CPU ist mehr als 20-mal so hoch wie die der GPU-Version und doppelt so hoch wie die der GPU-Version. Die Leistungsverbesserung ist offensichtlich.
Das zweite sind die drei von ByteDance demonstrierten Fälle von OCR1, OCR2 und Video-Multimodalität.
Im Modeltraining kannst du Es ist ersichtlich, dass bei den drei Aufgaben OCR1, OCR2 und Video-Multimodalität nach Verwendung von CV-CUDA eine Leistungssteigerung von 50 % bis 100 % erzielt wurde.
Warum gibt es einen so großen Leistungsgewinn? Tatsächlich haben diese drei Aufgaben gemeinsam, dass ihre Bildvorverarbeitungslogik sehr komplex ist, z. B. Dekodierung, Größenänderung, Zuschneiden usw., und dass es sich immer noch um große Kategorien handelt. Tatsächlich kann es in jeder von ihnen viele kleinere geben Operatorkategorie. Klassen- oder Unterklassenvorverarbeitung. Für diese drei Aufgaben gibt es möglicherweise mehr als ein Dutzend Arten der Datenverbesserung in der Vorverarbeitungsverbindung, sodass der Rechendruck auf die CPU sehr hoch ist. Wenn dieser Teil der Berechnung auf die GPU verlagert werden kann, wird die Ressourcenkonkurrenz der CPU größer erheblich reduziert und der Gesamtdurchsatz deutlich verbessert.
Schließlich gibt es einen Videoverarbeitungsfall, der auf Sina Weibo gezeigt wird.
Für den Videoverarbeitungsprozess besteht die herkömmliche Methode darin, zuerst die Videobilder in der CPU-Umgebung zu dekodieren, den ursprünglichen Bytestrom in Bilddaten zu dekodieren und dann einige reguläre Vorgänge auszuführen, z Ändern Sie die Größe, beschneiden Sie usw. und laden Sie die Daten dann für bestimmte Modellberechnungen auf die GPU hoch.
Die Verarbeitungsmethode von CV-CUDA besteht darin, den von der CPU dekodierten und im Speicher abgelegten Bytestrom auf die GPU hochzuladen ist unabhängig von der Modellberechnung. Nahtlose Verbindung, es ist kein Kopiervorgang zwischen Videospeicher und Speicher erforderlich.
Die Abbildung zeigt die Verarbeitungszeit von OpenCV (ungerade Zahlen) und CV-CUDA (gerade Zahlen) und Orange bezieht sich auf den Dekodierungsverbrauch . Zeit, grün bezieht sich auf die Verbrauchszeit der Vorverarbeitung.
OpenCV kann in zwei Modi unterteilt werden: CPU-Dekodierung und GPU-Dekodierung. CV-CUDA verwendet nur den GPU-Dekodierungsmodus.
Es ist ersichtlich, dass bei CPU-dekodiertem OpenCV die Dekodierung und Vorverarbeitung von OpenCV viel zeitaufwändiger ist als bei CV-CUDA.
Wenn wir OpenCV mit GPU-Dekodierung betrachten, können wir sehen, dass OpenCV und CV-CUDA hinsichtlich des Zeitverbrauchs im Modell und in den Dekodierungsteilen nahe beieinander liegen, es jedoch immer noch eine große Lücke bei der Vorverarbeitung gibt .
Im Hinblick auf den gesamten Pipeline-Vergleich hat CV-CUDA auch offensichtliche Vorteile. Einerseits spart CV-CUDA CPU-Ressourcen, dh wenn die GPU-Auslastung vollständig maximiert ist, CV -CUDA CUDA benötigt nur 10 % der CPU-Konfiguration von OpenCV; gleichzeitig spart CV-CUDA auch GPU-Ressourcen. In der gesamten Pipeline erhöht sich die Effizienz von CV-CUDA.
CV-CUDA kann das Problem des CPU-Ressourcenwettbewerbs in der Modelltrainings- und Inferenzphase effektiv lösen und dadurch die Effizienz des Modelltrainings und der Inferenz verbessern.
Aber wie versteht man die Vorteile von CV-CUDA richtig? Es ist notwendig, die Grundvoraussetzungen für seine Funktion zu verstehen, und seine Vorteile gegenüber CPU und OpenCV sind nicht absolut.
Zuallererst ist CV-CUDA eigentlich kein Allheilmittel. Beispielsweise liegt der Engpass in der Modelltrainingsphase nicht in der Vorverarbeitung, sondern im Datenlesen und in der Modellinferenz. Wenn Sie zu diesem Zeitpunkt CV-CUDA als Ersatz für die ursprüngliche Vorverarbeitungslösung verwenden, ist dies tatsächlich nutzlos.
Darüber hinaus können bei der Verwendung von CV-CUDA manchmal bessere Leistungsergebnisse erzielt werden, wenn die Arbeitslast von CPU und GPU angemessen auf die Vorverarbeitungslogik verteilt wird.
Zum Beispiel kann die CPU weiterhin Bilder dekodieren und ihre Größe ändern und sie dann nach der Größenänderung zur Verarbeitung auf die GPU übertragen.
Warum die Dekodierung und Größenänderung auf die CPU übertragen? Erstens ist die Hardware-Dekodierungseinheit der GPU für die Bilddekodierung tatsächlich begrenzt. Zweitens wird bei der Größenänderung normalerweise ein größeres Bild in ein kleineres Bild umgewandelt.
Wenn Sie die Daten vor der Größenänderung auf die GPU kopieren, kann dies viel Bandbreite für die Datenübertragung im Videospeicher beanspruchen.
Natürlich muss die Aufteilung der Arbeitslast zwischen CPU und GPU immer noch anhand der tatsächlichen Situation beurteilt werden.
Der wichtigste Grundsatz besteht darin, die Berechnungen nicht zwischen CPU und GPU abzuwechseln, da die Datenübertragung zwischen Geräten mit einem Mehraufwand verbunden ist. Wenn der Wechsel zu häufig erfolgt, können die durch die Berechnung selbst erzielten Vorteile abgeflacht werden, was zu einem Leistungsabfall anstelle einer Leistungssteigerung führt.
Im Dezember 2022 veröffentlichte CV-CUDA die Alpha-Version, die mehr als 20 Operatoren enthält, wie zum Beispiel häufig verwendete Operatoren „Spiegeln“, „Drehen“, „Perspektive“, „Größe ändern“ usw.
Derzeit verfügt OpenCV über mehr Operatoren, wobei CV-CUDA derzeit nur die am häufigsten verwendeten Operatoren beschleunigt, und in Zukunft werden weiterhin neue Operatoren hinzugefügt.
CV-CUDA wird im März dieses Jahres auch eine Betaversion veröffentlichen, die mehr als 20 Operatoren zu mehr als 50 Operatoren hinzufügt. Die Beta-Version wird einige sehr häufig verwendete Operatoren enthalten, wie z. B. ConvexHull, FindContours usw. Sieben, Epilog auf einen Blick klar sein.
Aus Komplexitätsperspektive kann man sagen, dass dies der Vorteil von CV-CUDA ist. „The Philosophy of Software Design“ erwähnt ein Prinzip zur Beurteilung der Softwarekomplexität: Wenn ein Softwaresystem schwer zu verstehen und zu ändern ist, ist es sehr komplex, wenn es leicht zu verstehen und zu ändern ist, ist es sehr einfach.Das obige ist der detaillierte Inhalt vonDer Durchsatz wurde um das 30-fache erhöht: Die CV-Pipeline bewegt sich in Richtung Full-Stack-Parallelisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!