diff --git a/README.md b/README.md index 9314f37..ef5b73f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![CI](https://github.com/SciML/ParallelParticleSwarms.jl/actions/workflows/CI.yml/badge.svg)](https://github.com/SciML/ParallelParticleSwarms.jl/actions/workflows/CI.yml) [![Build status](https://badge.buildkite.com/caf5d6f9d5129b5796049b085df39fd8fab055826b513d361e.svg)](https://buildkite.com/julialang/parallelparticleswarms-dot-jl) [![codecov](https://codecov.io/gh/utkarsh530/ParallelParticleSwarms.jl/graph/badge.svg?token=H5U5UAIRXX)](https://codecov.io/gh/utkarsh530/ParallelParticleSwarms.jl) -[![ColPrac: Contributor's Guide on Collaborative Practices for Community Packages](https://img.shields.io/badge/ColPrac-Contributor's%20Guide-blueviolet)](https://github.com/SciML/ColPrac) +[![ColPrac: Contributor's Guide on Collaborative Practices for Community Packages](https://img.shields.io/badge/ColPrac-Contributor%27s%20Guide-blueviolet)](https://github.com/SciML/ColPrac) [![SciML Code Style](https://img.shields.io/static/v1?label=code%20style&message=SciML&color=9558b2&labelColor=389826)](https://github.com/SciML/SciMLStyle) Accelerating convex/non-convex optimization with GPUs using Particle-Swarm based methods. diff --git a/benchmarks/CPU_vs_GPU/benchmark.jl b/benchmarks/CPU_vs_GPU/benchmark.jl index 3202a24..bbcbcaa 100644 --- a/benchmarks/CPU_vs_GPU/benchmark.jl +++ b/benchmarks/CPU_vs_GPU/benchmark.jl @@ -77,7 +77,8 @@ for n_particles in Ns ## CPU solve backend = CPU() opt = ParallelSyncPSOKernel(n_particles; backend) - init_gbest, particles = ParallelParticleSwarms.init_particles( + init_gbest, + particles = ParallelParticleSwarms.init_particles( prob, opt, typeof(prob.u0)) particles_eltype = eltype(particles) === Float64 ? Float32 : eltype(particles) diff --git a/benchmarks/CPU_vs_GPU/wp_algs.jl b/benchmarks/CPU_vs_GPU/wp_algs.jl index f822e74..d290d4a 100644 --- a/benchmarks/CPU_vs_GPU/wp_algs.jl +++ b/benchmarks/CPU_vs_GPU/wp_algs.jl @@ -105,28 +105,32 @@ end for n_particles in Ns @info n_particles - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelSyncPSOKernel(n_particles; backend = CPU()), 500) push!(cpu_loss, obj) push!(cpu_times, sol_time) - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelSyncPSOKernel(n_particles; backend = CUDABackend()), 500) push!(gpu_sync_loss, obj) push!(gpu_sync_times, sol_time) - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelPSOKernel(n_particles; backend = CUDABackend(), global_update = false), 500) push!(gpu_async_loss, obj) push!(gpu_async_times, sol_time) - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelPSOKernel(n_particles; backend = CUDABackend(), global_update = true), 500; runs = 2) @@ -134,7 +138,8 @@ for n_particles in Ns push!(gpu_queue_lock_loss, obj) push!(gpu_queue_lock_times, sol_time) - obj, solve_time = solve_run(prob, + obj, + solve_time = solve_run(prob, ParallelParticleSwarms.HybridPSO(; backend = CUDABackend(), pso = ParallelParticleSwarms.ParallelPSOKernel(n_particles; global_update = false, @@ -330,7 +335,8 @@ begin for iters in tot_maxiters @info iters - obj, sol_time = solve_run(uncons_prob, + obj, + sol_time = solve_run(uncons_prob, LBFGS(), iters; reltol = -Inf, @@ -362,14 +368,16 @@ begin # ParallelPSOKernel(n_particles; backend = CUDABackend(), global_update = true), # maxiters = iters) - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelPSOKernel(n_particles; backend = CUDABackend(), global_update = true), iters) push!(queue_lock_losses, obj) push!(queue_lock_time, sol_time) - obj, sol_time = solve_run(prob, + obj, + sol_time = solve_run(prob, ParallelSyncPSOKernel(n_particles; backend = CPU()), iters) @@ -388,7 +396,8 @@ begin # local_opt = ParallelParticleSwarms.LBFGS()), maxiters = iters, # local_maxiters = iters) - obj, solve_time = solve_run(prob, + obj, + solve_time = solve_run(prob, ParallelParticleSwarms.HybridPSO(; backend = CUDABackend(), pso = ParallelParticleSwarms.ParallelPSOKernel(n_particles; global_update = false, @@ -402,7 +411,8 @@ begin # sol = solve(arr_prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), maxiters = iters) - obj, sol_time = solve_run(arr_prob, + obj, + sol_time = solve_run(arr_prob, BBO_adaptive_de_rand_1_bin_radiuslimited(), iters * 100) diff --git a/benchmarks/adam_opt.jl b/benchmarks/adam_opt.jl index 9483061..56f7878 100644 --- a/benchmarks/adam_opt.jl +++ b/benchmarks/adam_opt.jl @@ -100,7 +100,8 @@ using Adapt backend = CUDABackend() ## Initialize Particles -gbest, particles = ParallelParticleSwarms.init_particles(soptprob, +gbest, +particles = ParallelParticleSwarms.init_particles(soptprob, ParallelSyncPSOKernel(n_particles; backend = CUDABackend()), typeof(prob.u0)) diff --git a/src/hybrid.jl b/src/hybrid.jl index 5f6d67d..0886082 100644 --- a/src/hybrid.jl +++ b/src/hybrid.jl @@ -47,8 +47,9 @@ function SciMLBase.solve!( sol_bfgs = (x -> isnan(x) ? convert(eltype(prob.u0), Inf) : x).(sol_bfgs) minobj, ind = findmin(sol_bfgs) - sol_u, sol_obj = minobj > sol_pso.objective ? (sol_pso.u, sol_pso.objective) : - (view(result, ind), minobj) + sol_u, + sol_obj = minobj > sol_pso.objective ? (sol_pso.u, sol_pso.objective) : + (view(result, ind), minobj) t1 = time() # @show sol_pso.stats.time diff --git a/src/solve.jl b/src/solve.jl index 3360210..8783044 100644 --- a/src/solve.jl +++ b/src/solve.jl @@ -11,7 +11,8 @@ function SciMLBase.solve!( cache::PSOCache, opt::ParallelPSOKernel, args...; maxiters = 100, kwargs...) prob = cache.prob t0 = time() - gbest, particles = vectorized_solve!(cache.prob, + gbest, + particles = vectorized_solve!(cache.prob, cache.gbest, cache.particles, opt, @@ -30,7 +31,8 @@ function SciMLBase.solve!( cache::PSOCache, opt::ParallelSyncPSOKernel, args...; maxiters = 100, kwargs...) prob = cache.prob t0 = time() - gbest, particles = vectorized_solve!(prob, + gbest, + particles = vectorized_solve!(prob, cache.gbest, cache.particles, opt, @@ -73,7 +75,8 @@ function pso_solve(prob::OptimizationProblem, kwargs...) init_gbest, particles = init_particles(prob, opt, typeof(prob.u0)) t0 = time() - gbest, particles = vectorized_solve!(prob, + gbest, + particles = vectorized_solve!(prob, init_gbest, particles, opt,