Llego un poco tarde a la fiesta, pero la respuesta corta es que sí, es posible paralelizar un método de punto interior para GPU, pero si eso es exitoso o no depende de la estructura del problema. En términos de software existente, Optizelle puede hacerlo. Tome la rama de desarrollo hasta que ocurra una nueva versión en el futuro cercano.
Las situaciones difieren ligeramente dependiendo de si el problema original contiene o no igualdades o desigualdades. Hay una variedad de formas de hacer esto, pero, en mi opinión, la mejor manera de hacerlo para problemas con restricciones de desigualdades es usando un método inexacto de la región de confianza, método de Newton combinado con un método primario de doble punto interior.
Solo para las desigualdades, el método Newton de región de confianza inexacto básico se puede encontrar en Nocedal and Wright's Numerical Optimization en la página 171 o en Conn, Gould y Toint's Trust-Region Methods en la página 205. Este algoritmo se puede combinar con éxito con un método primario. método de doble punto interior utilizando esencialmente el método modificado de CG truncado de la página 890 del documento Un método de punto interior para la programación no lineal a gran escala por Byrd, Hribar y Nocedal. Personalmente, no me gusta cómo configuran su sistema de puntos interiores, por lo que no usaría su formulación de puntos interiores, pero esa es la preferencia. NITRO es un buen algoritmo. En cuanto a los detalles del punto interior, el manual de Optizelle explica cómo hacer esto en su manual. Probablemente debería publicar un manual actualizado,
Para el caso con restricciones de desigualdad e igualdad, creo que el mejor algoritmo es combinar el método inexacto de SQP de paso compuesto de región de confianza de Heinkenschoss y Ridzal en un documento titulado Un método de SQP de región de confianza libre de matriz para la optimización restringida de igualdad. Básicamente, el proceso de agregar un método de punto interior funciona más o menos igual que el caso sin restricciones, excepto que el paso cuasinormal también debe protegerse.
En cuanto a las oportunidades de paralelización, los algoritmos a los que me refiero anteriormente funcionan bien porque estos algoritmos pueden implementarse sin matriz. Específicamente, la implementación de Optizelle para el problema
minx∈X{f(x):g(x)=0,h(x)≥0}
Requiere que el usuario proporcione una implementación para
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
No le importa de dónde provienen estas implementaciones o cómo están paralelas. Se pueden hacer en memoria compartida, memoria distribuida o GPU. No importa. Lo que funciona mejor para un problema particular depende de la estructura. Además, requiere que el usuario proporcione álgebra lineal para
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
Estas operaciones pueden realizarse en serie, paralelo, memoria distribuida, memoria compartida o en GPU. No importa. Lo mejor depende de la estructura del problema.
Finalmente, están los sistemas lineales y hay tres que se pueden proporcionar:
- ∇2f(x)
- g′(x)g′(x)∗
- g′(x)g′(x)∗
gg′(x)g′(x)∗(g′(x)g′(x)∗)−1=g′(x)−∗g′(x)−1
Finalmente, los algoritmos en Optizelle funcionan en problemas de cono simétrico, que incluyen restricciones de cono, de segundo orden y semidefinidas. Sin embargo, en general, las soluciones de cono lineal tenderán a superarlo. Básicamente, las soluciones de cono lineales pueden reducir la viabilidad y la solución de optimización realizadas en un sistema realmente compacto que puede ser factorizado por Choleski. Dado que Optizelle funciona con sistemas no lineales, realmente no puede hacer eso. Al menos, no sé cómo. Además de eso, hay restricciones en el tamaño de los bloques SDP que Optizelle puede manejar. El operadorlinv
arriba requiere el inverso de las matrices SDP y ese inverso es realmente costoso para bloques grandes. Además, hay una protección adicional que requiere una factorización Choleski. Estas factorizaciones realmente no se paralelizan bien en una GPU. Al menos, no conozco una implementación que se paralelice bien. De todos modos, la conclusión es que si se trata de un programa de cono lineal, use un solucionador de cono lineal como CSDP o SDPT3.
TLDR; Utiliza Optizelle . Es gratis, de código abierto y con licencia BSD. Lo he ampliado a algo así como medio billón de variables y funcionó bien. Lo ejecuté con GPU y funcionó bien. Si funciona bien o no con una GPU depende de si las operaciones anteriores se paralelan bien o no en una GPU.