Performance problem with deeply nested nonlinear expressions
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Tranquilla
- Stack tecnologico
- julia
- Ambito
- performance, tooling
Direzione di ricerca
Inizia dalle riproduzioni Julia fornite, in particolare dal modello RK4 multistep con N = 2 e dal confronto a singolo passo con N = 50. Esegui il benchmark della costruzione del modello separatamente dall’ottimizzazione e analizza come crescono le espressioni annidate durante l’espansione ripetuta di RK4. Il lavoro sarà considerato completato quando sarà stato identificato se il rallentamento si trova in JuMP/MathOptInterface o nel pattern di modellazione, insieme a un benchmark minimo e a una direzione di codifica documentata.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Hello, I am interested in switching from CasADi tu JuMP for optimal control (the system is quaternion kinematics, so not a lot of variables). My MATLAB CasADi model does multistep RK4 integration for multiple shooting (4 steps/interval, 10 intervals) and builds and solves the problem in < 2s. The equivalent JuMP code builds the model for many minutes, using up to 10GB of RAM, and is basically unusable. This is the JuMP code I wrote:
using ReferenceFrameRotations, DifferentialEquations, Plots
##
function qdot(X, u)
collect(dquat(Quaternion(X), u))
end
function RK4(f, X, u, dt)
k1 = dt*f(X , u)
k2 = dt*f(X+k1/2, u)
k3 = dt*f(X+k2/2, u)
k4 = dt*f(X+k3 , u)
X + (k1+2k2+2k3+k4)/6
end
model = Model(Ipopt.Optimizer)
DCMf = [
-1 0 0
0 0 1
0 1 0
]
# two quaternions represent the same orientation
qf = -convert(Quaternion, DCM(DCMf)) |> collect
N = 2
T = 1
dt = T / (N-1)
tabq = @variable(model, [1:4, 1:N], base_name="q")
tabu = @variable(model, [1:3, 1:N-1], base_name="ω_b")
cost = 0
for i = 1:N-1
F = [tabq[:, i]; cost]
for M = 1:4
F = RK4((X, u) -> [qdot(X[1:4], u); 1/2 * u' * u], F, tabu[:, i], dt)
end
@constraint(model, tabq[:, i+1] == F[1:4])
cost = F[end]
end
#traj constraints
@constraint(model, tabq[:, 1] == q0)
@constraint(model, tabq[:, N] == qf)
# @constraint(model, c[i=1:N], tabq[:, i]' * tabq[:, i] == 1)
@objective(model, Min, cost)
#start values
set_start_value.(tabq, q0)
I set N = 2 to prove it's slow even for a single step (similar problems happen with single-step high order RK schemes, such as RK8, which leads me to believe JuMP can't handle big expressions really well). For comparison, if I build a single-step model with 50 steps (approx. 4steps/interval x 10 intervals for the working CasADi model) like this:
model = Model(Ipopt.Optimizer)
DCMf = [
-1 0 0
0 0 1
0 1 0
]
# two quaternions represent the same orientation
qf = -convert(Quaternion, DCM(DCMf)) |> collect
N = 50
T = 1
dt = T / (N-1)
tabq = @variable(model, [1:4, 1:N], base_name="q")
tabu = @variable(model, [1:3, 1:N-1], base_name="ω_b")
cost = 0
for i = 1:N-1
#can't do multistep integration
F = RK4((X, u) -> [qdot(X[1:4], u); 1/2 * u' * u], [tabq[:, i]; cost], tabu[:, i], dt)
@constraint(model, tabq[:, i+1] == F[1:4])
cost = F[end]
end
#traj constraints
@constraint(model, tabq[:, 1] == q0)
@constraint(model, tabq[:, N] == qf)
# @constraint(model, c[i=1:N], tabq[:, i]' * tabq[:, i] == 1)
@objective(model, Min, cost)
#start values
set_start_value.(tabq, q0)
model
##
optimize!(model)
It then works reasonably fast. I don't understand why JuMP can't handle the first code; in my view, this is a big limitation. Is there a particular way of coding in JuMP I'm missing, or is this truly JuMP's fault?
- Lingua principale
- Julia
- Stelle
- 506
- Fork
- 103
- Merge medio
- 1g 10m
- PR unite (30g)
- 12
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di jump-dev/MathOptInterface.jl
-
[Bridges] MultirowChange in set_map.jl drops zero coefficientsForse già presa @odow l’ha presa 5 giorni fa. Aperta
jump-dev/MathOptInterface.jl#3106 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Precision loss in Hessian computationForse già presa @blegat l’ha presa 5 giorni fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 15/100
jump-dev/MathOptInterface.jl#3104 · 11 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Layer instantiatorAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
jump-dev/MathOptInterface.jl#2986 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
jump-dev/MathOptInterface.jl#2969 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Add Batched{S} setApertaType: Set Request
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
jump-dev/MathOptInterface.jl#2904 · 15 commenti · 7 reazioni ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di jump-dev/MathOptInterface.jl
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
bug help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
JuliaGeometry/Meshes.jl#1469 ·
I maintainer di solito rispondono entro 1 giorno
-
distributed 🕸️
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
CliMA/Oceananigans.jl#6295 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
CI: two jobs fail on the new ubuntu-latest (Ubuntu 26.04) runner imageForse già presa @bjarthur l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 63/100
mojaie/MolecularGraph.jl#151 ·