Skip to content

Commit 2a8606d

Browse files
Merge pull request #988 from ParamThakkar123/refactor-sophia
Added new subpackage for Sophia.jl
2 parents d56d086 + f3dc3c2 commit 2a8606d

File tree

8 files changed

+122
-19
lines changed

8 files changed

+122
-19
lines changed

.github/workflows/CI.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ jobs:
3939
- OptimizationPyCMA
4040
- OptimizationQuadDIRECT
4141
- OptimizationSciPy
42+
- OptimizationSophia
4243
- OptimizationSpeedMapping
4344
- OptimizationPolyalgorithms
4445
- OptimizationNLPModels

Project.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36"
1414
OptimizationBase = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
1515
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1616
ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
17-
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1817
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
1918
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
2019
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name = "OptimizationSophia"
2+
uuid = "892fee11-dca1-40d6-b698-84ba0d87399a"
3+
authors = ["paramthakkar123 <[email protected]>"]
4+
version = "0.1.0"
5+
6+
[deps]
7+
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
8+
OptimizationBase = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
9+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
10+
11+
[extras]
12+
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
13+
Lux = "b2108857-7c20-44ae-9111-449ecde12c47"
14+
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
15+
OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a"
16+
SciMLSensitivity = "1ed8b502-d754-442c-8d5d-10ac956f44a1"
17+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
18+
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
19+
20+
[compat]
21+
ComponentArrays = "0.15.29"
22+
Lux = "1.16.0"
23+
MLUtils = "0.4.8"
24+
Optimization = "4.5.0"
25+
OptimizationBase = "2.10.0"
26+
OrdinaryDiffEqTsit5 = "1.2.0"
27+
Random = "1.10.0"
28+
SciMLSensitivity = "7.88.0"
29+
Test = "1.10.0"
30+
Zygote = "0.7.10"
31+
32+
[targets]
33+
test = ["Test", "ComponentArrays", "Lux", "MLUtils", "OrdinaryDiffEqTsit5", "SciMLSensitivity", "Zygote"]

src/sophia.jl renamed to lib/OptimizationSophia/src/OptimizationSophia.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
module OptimizationSophia
2+
3+
using OptimizationBase.SciMLBase
4+
using OptimizationBase: OptimizationCache
5+
using Optimization
6+
using Random
7+
18
"""
29
Sophia(; η = 1e-3, βs = (0.9, 0.999), ϵ = 1e-8, λ = 1e-1, k = 10, ρ = 0.04)
310
@@ -171,3 +178,5 @@ function SciMLBase.__solve(cache::OptimizationCache{
171178
θ,
172179
x, retcode = ReturnCode.Success)
173180
end
181+
182+
end
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using OptimizationBase, Optimization
2+
using OptimizationBase.SciMLBase: solve, OptimizationFunction, OptimizationProblem
3+
using OptimizationSophia
4+
using Lux, MLUtils, Random, ComponentArrays
5+
using SciMLSensitivity
6+
using Test
7+
using Zygote
8+
using OrdinaryDiffEqTsit5
9+
10+
function dudt_(u, p, t)
11+
ann(u, p, st)[1] .* u
12+
end
13+
14+
function newtons_cooling(du, u, p, t)
15+
temp = u[1]
16+
k, temp_m = p
17+
du[1] = dT = -k * (temp - temp_m)
18+
end
19+
20+
function true_sol(du, u, p, t)
21+
true_p = [log(2) / 8.0, 100.0]
22+
newtons_cooling(du, u, true_p, t)
23+
end
24+
25+
function callback(state, l) #callback function to observe training
26+
display(l)
27+
return l < 1e-2
28+
end
29+
30+
function predict_adjoint(fullp, time_batch)
31+
Array(solve(prob, Tsit5(), p = fullp, saveat = time_batch))
32+
end
33+
34+
function loss_adjoint(fullp, p)
35+
(batch, time_batch) = p
36+
pred = predict_adjoint(fullp, time_batch)
37+
sum(abs2, batch .- pred)
38+
end
39+
40+
u0 = Float32[200.0]
41+
datasize = 30
42+
tspan = (0.0f0, 1.5f0)
43+
rng = Random.default_rng()
44+
45+
ann = Lux.Chain(Lux.Dense(1, 8, tanh), Lux.Dense(8, 1, tanh))
46+
pp, st = Lux.setup(rng, ann)
47+
pp = ComponentArray(pp)
48+
49+
prob = ODEProblem{false}(dudt_, u0, tspan, pp)
50+
51+
t = range(tspan[1], tspan[2], length = datasize)
52+
true_prob = ODEProblem(true_sol, u0, tspan)
53+
ode_data = Array(solve(true_prob, Tsit5(), saveat = t))
54+
55+
k = 10
56+
train_loader = MLUtils.DataLoader((ode_data, t), batchsize = k)
57+
58+
l1 = loss_adjoint(pp, (train_loader.data[1], train_loader.data[2]))[1]
59+
60+
optfun = OptimizationFunction(loss_adjoint,
61+
OptimizationBase.AutoZygote())
62+
optprob = OptimizationProblem(optfun, pp, train_loader)
63+
64+
res1 = solve(optprob,
65+
OptimizationSophia.Sophia(), callback = callback,
66+
maxiters = 2000)
67+
@test 10res1.objective < l1
68+
69+
# Test Sophia with ComponentArrays + Enzyme (shadow generation fix)
70+
using ComponentArrays
71+
x0_comp = ComponentVector(a = 0.0, b = 0.0)
72+
rosenbrock_comp(x, p = nothing) = (1 - x.a)^2 + 100 * (x.b - x.a^2)^2
73+
74+
optf_sophia = OptimizationFunction(rosenbrock_comp, AutoEnzyme())
75+
prob_sophia = OptimizationProblem(optf_sophia, x0_comp)
76+
res_sophia = solve(prob_sophia, OptimizationSophia.Sophia=0.01, k=5), maxiters = 50)
77+
@test res_sophia.objective < rosenbrock_comp(x0_comp) # Test optimization progress
78+
@test res_sophia.retcode == Optimization.SciMLBase.ReturnCode.Success

src/Optimization.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if !isdefined(Base, :get_extension)
1212
end
1313

1414
using Logging, ProgressLogging, ConsoleProgressMonitor, TerminalLoggers, LoggingExtras
15-
using ArrayInterface, Base.Iterators, SparseArrays, LinearAlgebra, Random
15+
using ArrayInterface, Base.Iterators, SparseArrays, LinearAlgebra
1616

1717
import OptimizationBase: instantiate_function, OptimizationCache, ReInitCache
1818
import SciMLBase: OptimizationProblem,
@@ -22,7 +22,6 @@ export ObjSense, MaxSense, MinSense
2222

2323
include("utils.jl")
2424
include("state.jl")
25-
include("sophia.jl")
2625

2726
export solve
2827

test/minibatch.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ optfun = OptimizationFunction(loss_adjoint,
5858
Optimization.AutoZygote())
5959
optprob = OptimizationProblem(optfun, pp, train_loader)
6060

61-
res1 = Optimization.solve(optprob,
62-
Optimization.Sophia(), callback = callback,
63-
maxiters = 2000)
64-
@test 10res1.objective < l1
65-
6661
optfun = OptimizationFunction(loss_adjoint,
6762
Optimization.AutoForwardDiff())
6863
optprob = OptimizationProblem(optfun, pp, train_loader)

test/native.jl

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,3 @@ optf1 = OptimizationFunction(loss, AutoSparseForwardDiff())
2626
prob1 = OptimizationProblem(optf1, rand(5), data)
2727
sol1 = solve(prob1, OptimizationOptimisers.Adam(), maxiters = 1000, callback = callback)
2828
@test sol1.objective < l0
29-
30-
# Test Sophia with ComponentArrays + Enzyme (shadow generation fix)
31-
using ComponentArrays
32-
x0_comp = ComponentVector(a = 0.0, b = 0.0)
33-
rosenbrock_comp(x, p = nothing) = (1 - x.a)^2 + 100 * (x.b - x.a^2)^2
34-
35-
optf_sophia = OptimizationFunction(rosenbrock_comp, AutoEnzyme())
36-
prob_sophia = OptimizationProblem(optf_sophia, x0_comp)
37-
res_sophia = solve(prob_sophia, Optimization.Sophia=0.01, k=5), maxiters = 50)
38-
@test res_sophia.objective < rosenbrock_comp(x0_comp) # Test optimization progress
39-
@test res_sophia.retcode == Optimization.SciMLBase.ReturnCode.Success

0 commit comments

Comments
 (0)