Ich bin etwas spät dran, aber die kurze Antwort lautet: Ja, es ist möglich, eine interne Punktmethode für GPUs zu parallelisieren. Ob dies jedoch erfolgreich ist oder nicht, hängt von der Struktur des Problems ab. In Bezug auf vorhandene Software kann Optizelle dies tun. Besorgen Sie sich den Entwicklungszweig, bis in naher Zukunft eine neue Version erscheint.
Die Situationen unterscheiden sich geringfügig, je nachdem, ob das ursprüngliche Problem Gleichheiten oder Ungleichungen enthält oder nicht. Es gibt verschiedene Möglichkeiten, dies zu tun, aber meiner Meinung nach ist der beste Weg, dies bei Problemen mit nur Ungleichheitsbeschränkungen zu tun, die Verwendung einer Newton-Methode mit ungenauer Vertrauensregion in Kombination mit einer Methode mit zwei ursprünglichen inneren Punkten.
Nur für Ungleichungen finden Sie die grundlegende ungenaue Newton-Methode für Vertrauensbereiche in der numerischen Optimierung von Nocedal und Wright auf Seite 171 oder auf den Vertrauensbereichsmethoden von Conn, Gould und Toint auf Seite 205. Dieser Algorithmus kann erfolgreich mit einer Primärmethode kombiniert werden. Dual-Interior-Point-Methode unter Verwendung der modifizierten Truncated-CG-Methode ab Seite 890 des Papiers Eine Interior-Point-Methode für die nichtlineare Programmierung in großem Maßstab von Byrd, Hribar und Nocedal. Persönlich gefällt mir nicht, wie sie ihr inneres Punktesystem einrichten, daher würde ich ihre innere Punktformulierung nicht verwenden, aber das ist die Präferenz. NITRO ist ein guter Algorithmus. In Bezug auf die Details des Innenpunkts wird im Handbuch von Optizelle in seinem Handbuch erläutert, wie dies zu tun ist. Ich sollte wahrscheinlich ein aktualisiertes Handbuch veröffentlichen,
Für den Fall sowohl mit Ungleichheits- als auch mit Gleichheitsbeschränkungen glaube ich, dass der beste Algorithmus darin besteht, die ungenaue SQP-Methode mit zusammengesetzten Schritten für Vertrauensbereiche von Heinkenschoss und Ridzal in einem Artikel mit dem Titel Eine matrixfreie SQP-Methode für Vertrauensbereiche für die Optimierung mit eingeschränkten Gleichheitsbereichen zu kombinieren. Grundsätzlich funktioniert der Prozess des Anheftens einer inneren Punktmethode ziemlich genau wie der uneingeschränkte Fall, außer dass der quasinormale Schritt ebenfalls sichergestellt werden muss.
Was die Parallelisierungsmöglichkeiten angeht, funktionieren die oben genannten Algorithmen gut, da diese Algorithmen matrixfrei implementiert werden können. Insbesondere die Implementierung von Optizelle für das Problem
Mindestx ∈ X.{ f( x ) : g( x ) = 0 , h ( x ) ≥ 0 }
Erfordert, dass der Benutzer eine Implementierung für bereitstellt
f( x ) , ∇ f( x ) , ∇2f( x ) ∂x
G( x ) , g'( x ) ∂x , g'( x )∗∂y, ( g' '( x ) ∂x )∗∂y
h ( x ) , h'( x ) ∂x , h'( x )∗∂y, ( h' '( x ) ∂x )∗∂y
Es ist egal, woher diese Implementierungen kommen oder wie sie parallelisiert sind. Sie können im gemeinsam genutzten Speicher, im verteilten Speicher oder in GPUs ausgeführt werden. Es spielt keine Rolle. Was für ein bestimmtes Problem am besten funktioniert, hängt von der Struktur ab. Darüber hinaus muss der Benutzer eine lineare Algebra für bereitstellen
init: Memory allocation and size setting
copy: y <- x (Shallow. No memory allocation.)
scal: x <- alpha * x
axpy: y <- alpha * x + y
innr: innr <- <x,y>
zero: x <- 0
rand: x <- random
prod: Jordan product, z <- x o y
id: Identity element, x <- e such that x o e = x
linv: Jordan product inverse, z <- inv(L(x)) y where L(x) y = x o y
barr: Barrier function, barr <- barr(x) where x o grad barr(x) = e
srch: Line search, srch <- argmax {alpha \in Real >= 0 : alpha x + y >= 0} where y > 0
symm: Symmetrization, x <- symm(x) such that L(symm(x)) is a symmetric operator
Diese Vorgänge können im seriellen, parallelen, verteilten Speicher, im gemeinsam genutzten Speicher oder auf GPUs ausgeführt werden. Es spielt keine Rolle. Was am besten ist, hängt von der Problemstruktur ab.
Schließlich gibt es die linearen Systeme und es gibt drei, die bereitgestellt werden können:
- Vorkonditionierer für∇2f( x )
- Linker Vorkonditionierer fürG'( x ) g'( x )∗
- Richtiger Vorkonditionierer fürg′(x)g′(x)∗
Jeder dieser Vorkonditionierer kann entweder im seriellen oder parallelen, verteilten Speicher oder gemeinsam genutzt oder auf GPUs implementiert werden. Grundsätzlich ist der erste Vorkonditionierer der Vorkonditionierer für das verkürzte CG-System, das den Optimalitätssystemen zugeordnet ist. Die letzten beiden Vorkonditionierer werden für die erweiterten Systemlösungen verwendet, die dem zusammengesetzten Schritt-SQP-Algorithmus zugeordnet sind. Im Allgemeinen erhalten Sie hier Ihren größten Leistungsschub. Stellen Sie sich vor, die Einschränkung repräsentiert eine Art PDE. Dann entspricht der Vorkonditionierer für einer Vorwärts-PDE-Lösung, gefolgt von einer adjungierten PDE-Lösung. Beachten Sie, wenn sie quadratisch wären,g ' ( x ) g ' ( x ) ∗ ( g ' ( x ) g ' ( x ) ∗ ) - 1 = g ' ( x ) - ∗ g ' ( x ) - 1gg′(x)g′(x)∗(g′(x)g′(x)∗)−1=g′(x)−∗g′(x)−1. Für eine große Anzahl von PDE-Formulierungen, wie z. B. Finite-Differenzen-Methoden mit expliziten Zeitintegratoren, können diese Lösungen auf einer GPU sehr gut parallelisiert werden.
Schließlich arbeiten die Algorithmen in Optizelle an symmetrischen Kegelproblemen, zu denen gebundene, Kegel zweiter Ordnung und semidefinite Einschränkungen gehören. Trotzdem neigen die linearen Kegellösungen im Allgemeinen dazu, diese zu übertreffen. Grundsätzlich können lineare Kegellösungen die Machbarkeit und Optimalitätslösungen eines wirklich kompakten Systems reduzieren, das nach Choleski berücksichtigt werden kann. Da Optizelle mit nichtlinearen Systemen arbeitet, kann es das nicht wirklich. Zumindest weiß ich nicht wie. Darüber hinaus gibt es Einschränkungen hinsichtlich der Größe der SDP-Blöcke, die Optizelle verarbeiten kann. Der Betreiberlinv
oben erfordert die Umkehrung der SDP-Matrizen und diese Umkehrung ist für große Blöcke wirklich teuer. Darüber hinaus gibt es einen zusätzlichen Schutz, der eine Choleski-Faktorisierung erfordert. Diese Faktorisierungen lassen sich auf einer GPU nicht wirklich gut parallelisieren. Zumindest kenne ich keine Implementierung, die gut parallelisiert werden kann. Unter dem Strich sollten Sie als lineares Kegelprogramm einen linearen Kegellöser wie CSDP oder SDPT3 verwenden.
TLDR; Verwenden Sie Optizelle . Es ist kostenlos, Open Source und BSD-lizenziert. Ich habe es auf ungefähr eine halbe Milliarde Variablen skaliert und es hat gut funktioniert. Ich habe es mit GPUs betrieben und es hat gut funktioniert. Ob es mit einer GPU gut funktioniert oder nicht, hängt davon ab, ob die oben genannten Vorgänge auf einer GPU gut parallel sind oder nicht.