Estou um pouco atrasado para a festa, mas a resposta curta é que sim, é possível paralelizar um método de ponto interior para GPUs, mas se isso é ou não bem-sucedido depende da estrutura do problema. Em termos de software existente, a Optizelle pode fazê-lo. Agarre o ramo de desenvolvimento até que uma nova versão ocorra no futuro próximo.
As situações diferem um pouco, dependendo se o problema original contém ou não igualdades ou desigualdades. Há várias maneiras de fazer isso, mas, na minha opinião, a melhor maneira de fazer isso para problemas com apenas restrições de desigualdades é usar um método inexato de região de confiança, método de Newton combinado com um método primal de ponto interior duplo.
Apenas para desigualdades, o método básico inexato da região de confiança de Newton pode ser encontrado na Otimização Numérica de Nocedal e Wright na página 171 ou nos Métodos de Região de Confiança de Conn, Gould e Toint na página 205. Esse algoritmo pode ser combinado com sucesso com um método primitivo- método de ponto interior duplo usando essencialmente o método de CG truncado modificado da página 890 do artigo Um método de ponto interior para programação não-linear em larga escala de Byrd, Hribar e Nocedal. Pessoalmente, não gosto de como eles configuram seu sistema de pontos internos, então não usaria sua formulação de pontos internos, mas essa é a preferência. NITRO é um bom algoritmo. Quanto aos detalhes internos do ponto, o manual da Optizelle explica como fazer isso em seu manual. Eu provavelmente deveria postar um manual atualizado,
Para o caso de restrições de desigualdade e igualdade, acredito que o melhor algoritmo é combinar o método SQP de etapa composta inexato da região de confiança de Heinkenschoss e Ridzal em um artigo intitulado Método SQP de região de confiança livre de matriz para otimização restrita da igualdade. Basicamente, o processo de aplicação de um método de ponto interior funciona da mesma forma que o caso irrestrito, exceto que a etapa quase normal também precisa ser protegida.
Quanto às oportunidades de paralelização, os algoritmos que referencio acima funcionam bem porque esses algoritmos podem ser implementados sem matriz. Especificamente, a implementação da Optizelle para o problema
minx ∈ X{ f( x ) : g( x ) = 0 , h ( x ) ≥ 0 }
Requer que o usuário forneça uma implementação 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
Não importa de onde vêm essas implementações ou como elas são paralelizadas. Eles podem ser feitos na memória compartilhada, na memória distribuída ou nas GPUs. Isso não importa. O que funciona melhor para um problema específico depende da estrutura. Além disso, exige que o usuário forneça álgebra linear 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
Essas operações podem ser realizadas em serial, paralela, memória distribuída, memória compartilhada ou em GPUs. Isso não importa. O que é melhor depende da estrutura do problema.
Finalmente, existem os sistemas lineares e existem três que podem ser fornecidos:
- Pré-condicionador para∇2f( X )
- Pré-condicionador esquerdo parag′( X ) g′( X )∗
- Pré-condicionador correto parag′( X ) g′( X )∗
Cada um desses pré-condicionadores pode ser implementado em serial ou paralelo, memória distribuída ou compartilhada ou em GPUs. Basicamente, o primeiro pré-condicionador é o pré-condicionador para o sistema de CG truncado associado aos sistemas de otimização. Os dois últimos pré-condicionadores são usados para as soluções do sistema aumentado associadas ao algoritmo SQP da etapa composta. Em geral, é aqui que você obtém seu maior aumento de desempenho. Imagine se a restrição representasse algum tipo de PDE. Então, o pré-condicionador para corresponde a uma solução PDE direta seguida por uma solução PDE adjunta. Observe que, se fossem quadrados,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. Para um grande número de formulações de PDE, como métodos de diferença finita com integradores de tempo explícitos, essas soluções podem ser muito bem paralelizadas em uma GPU.
Finalmente, os algoritmos do Optizelle trabalham com problemas de cone simétrico, que incluem restrições de cone de segunda ordem e de semidefinido. No entanto, em geral, o cone linear resolve tender a executá-lo. Basicamente, as soluções lineares de cone podem reduzir a viabilidade e a otimização feitas em um sistema realmente compacto que pode ser fatorado por Choleski. Como o Optizelle trabalha com sistemas não lineares, ele realmente não pode fazer isso. Pelo menos eu não sei como. Além disso, existem restrições quanto ao tamanho dos blocos SDP com os quais a Optizelle pode lidar. O operadorlinv
acima requer o inverso das matrizes SDP e esse inverso é realmente caro para blocos grandes. Além disso, há uma proteção extra segura que requer uma fatoração de Choleski. Essas fatorações não são realmente paralelas em uma GPU. Pelo menos, não conheço uma implementação que seja paralela. De qualquer forma, a conclusão é que, se for um programa de cone linear, use um solucionador de cone linear como CSDP ou SDPT3.
TLDR; Use Optizelle . É gratuito, de código aberto e licenciado para BSD. Dimensionei para algo como meio bilhão de variáveis e funcionou bem. Eu executei com GPUs e funcionou bem. Se funciona ou não bem com uma GPU, depende se as operações acima são paralelas ou não em uma GPU.