Skip to content

Example code in README fails (on Zygote.gradient) #64

Closed
@theo-brown

Description

@theo-brown

Hi all,

The autodiff part of the example code in the README fails. If the Zygote line is removed, then it runs fine, but with it, you get the following stack trace:

julia> training_results = Optim.optimize(
           objective ∘ unflatten,
           θ -> only(Zygote.gradient(objective ∘ unflatten, θ)),
           flat_initial_params,
           BFGS(
               alphaguess = Optim.LineSearches.InitialStatic(scaled=true),
               linesearch = Optim.LineSearches.BackTracking(),
           ),
           Optim.Options(show_trace = true);
           inplace=false,
       )

ERROR: MethodError: no method matching AbstractGPs.FiniteGP(::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, ::Float64)

Closest candidates are:
  AbstractGPs.FiniteGP(::AbstractGPs.AbstractGP, ::AbstractVector)
   @ AbstractGPs ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:19
  AbstractGPs.FiniteGP(::AbstractGPs.AbstractGP, ::AbstractVector, ::Real)
   @ AbstractGPs ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:19
  AbstractGPs.FiniteGP(::AbstractGPs.AbstractGP, ::AbstractVector, ::AbstractVector{<:Real})
   @ AbstractGPs ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:13
  ...

Stacktrace:
  [1] macro expansion
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:101 [inlined]
  [2] _pullback(::Zygote.Context{false}, ::Type{AbstractGPs.FiniteGP}, ::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, ::Float64)
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:101
  [3] _apply(::Function, ::Vararg{Any})
    @ Core ./boot.jl:838
  [4] adjoint
    @ ~/.julia/packages/Zygote/YYT6v/src/lib/lib.jl:203 [inlined]
  [5] _pullback
    @ ~/.julia/packages/ZygoteRules/OgCVT/src/adjoint.jl:66 [inlined]
  [6] _pullback
    @ ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:32 [inlined]
  [7] _pullback(ctx::Zygote.Context{false}, f::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, args::Float64)
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
  [8] #rrule_via_ad#54
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/chainrules.jl:260 [inlined]
  [9] rrule_via_ad
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/chainrules.jl:248 [inlined]
 [10] #1659
    @ ./none:0 [inlined]
 [11] iterate
    @ ./generator.jl:47 [inlined]
 [12] collect(itr::Base.Generator{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, ChainRules.var"#1659#1664"{Zygote.ZygoteRuleConfig{Zygote.Context{false}}, GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}}})
    @ Base ./array.jl:782
 [13] rrule(config::Zygote.ZygoteRuleConfig{Zygote.Context{false}}, ::typeof(sum), f::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, xs::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; dims::Function)
    @ ChainRules ~/.julia/packages/ChainRules/snrkz/src/rulesets/Base/mapreduce.jl:102
 [14] rrule
    @ ~/.julia/packages/ChainRules/snrkz/src/rulesets/Base/mapreduce.jl:76 [inlined]
 [15] rrule(config::Zygote.ZygoteRuleConfig{Zygote.Context{false}}, ::typeof(mean), f::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, x::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; dims::Function)
    @ ChainRules ~/.julia/packages/ChainRules/snrkz/src/rulesets/Statistics/statistics.jl:28
 [16] rrule
    @ ~/.julia/packages/ChainRules/snrkz/src/rulesets/Statistics/statistics.jl:21 [inlined]
 [17] chain_rrule
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/chainrules.jl:223 [inlined]
 [18] macro expansion
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:101 [inlined]
 [19] _pullback(::Zygote.Context{false}, ::typeof(mean), ::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, ::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:101
 [20] _pullback
    @ ~/.julia/packages/AbstractGPs/XejGR/src/abstract_gp.jl:48 [inlined]
 [21] _pullback(::Zygote.Context{false}, ::typeof(mean_and_cov), ::GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, ::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [22] _pullback
    @ ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:134 [inlined]
 [23] _pullback(ctx::Zygote.Context{false}, f::typeof(mean_and_cov), args::AbstractGPs.FiniteGP{GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, LinearAlgebra.Diagonal{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}}})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [24] _pullback
    @ ~/.julia/packages/AbstractGPs/XejGR/src/finite_gp_projection.jl:307 [inlined]
 [25] _pullback(::Zygote.Context{false}, ::typeof(logpdf), ::AbstractGPs.FiniteGP{GP{AbstractGPs.ZeroMean{Float64}, KernelSum{Tuple{TransformedKernel{ScaledKernel{Matern52Kernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}, TransformedKernel{ScaledKernel{SqExponentialKernel{Distances.Euclidean}, Float64}, ScaleTransform{Float64}}}}}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, LinearAlgebra.Diagonal{Float64, FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}}}}, ::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [26] _pullback
    @ ./REPL[29]:4 [inlined]
 [27] _pullback(ctx::Zygote.Context{false}, f::typeof(objective), args::NamedTuple{(:k1, :k2, :noise_var), Tuple{NamedTuple{(:var, :precision), Tuple{Float64, Float64}}, NamedTuple{(:var, :precision), Tuple{Float64, Float64}}, Float64}})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [28] _pullback
    @ ./operators.jl:1034 [inlined]
 [29] _pullback
    @ ./operators.jl:1031 [inlined]
 [30] _pullback(::Zygote.Context{false}, ::Base.var"##_#97", ::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::ComposedFunction{typeof(objective), ComposedFunction{typeof(ParameterHandling.value), ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:k1, :k2, :noise_var), Tuple{NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}, ::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [31] _apply(::Function, ::Vararg{Any})
    @ Core ./boot.jl:838
 [32] adjoint
    @ ~/.julia/packages/Zygote/YYT6v/src/lib/lib.jl:203 [inlined]
 [33] _pullback
    @ ~/.julia/packages/ZygoteRules/OgCVT/src/adjoint.jl:66 [inlined]
 [34] _pullback
    @ ./operators.jl:1031 [inlined]
 [35] _pullback(ctx::Zygote.Context{false}, f::ComposedFunction{typeof(objective), ComposedFunction{typeof(ParameterHandling.value), ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:k1, :k2, :noise_var), Tuple{NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}, args::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface2.jl:0
 [36] pullback(f::Function, cx::Zygote.Context{false}, args::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface.jl:44
 [37] pullback
    @ ~/.julia/packages/Zygote/YYT6v/src/compiler/interface.jl:42 [inlined]
 [38] gradient(f::Function, args::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/YYT6v/src/compiler/interface.jl:96
 [39] (::var"#3#4")(θ::Vector{Float64})
    @ Main ./REPL[30]:9
 [40] (::NLSolversBase.var"#gg!#2"{var"#3#4"})(G::Vector{Float64}, x::Vector{Float64})
    @ NLSolversBase ~/.julia/packages/NLSolversBase/kavn7/src/objective_types/inplace_factory.jl:21
 [41] (::NLSolversBase.var"#fg!#8"{ComposedFunction{typeof(objective), ComposedFunction{typeof(ParameterHandling.value), ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:k1, :k2, :noise_var), Tuple{NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_to_NamedTuple#17"{Float64, NamedTuple{(:var, :precision), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#15"{Float64, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}, ParameterHandling.var"#unflatten_Positive#25"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}, NLSolversBase.var"#gg!#2"{var"#3#4"}})(gx::Vector{Float64}, x::Vector{Float64})
    @ NLSolversBase ~/.julia/packages/NLSolversBase/kavn7/src/objective_types/abstract.jl:13
 [42] value_gradient!!(obj::OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, x::Vector{Float64})
    @ NLSolversBase ~/.julia/packages/NLSolversBase/kavn7/src/interface.jl:82
 [43] initial_state(method::BFGS{LineSearches.InitialStatic{Float64}, LineSearches.BackTracking{Float64, Int64}, Nothing, Nothing, Flat}, options::Optim.Options{Float64, Nothing}, d::OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, initial_x::Vector{Float64})
    @ Optim ~/.julia/packages/Optim/V8ZEC/src/multivariate/solvers/first_order/bfgs.jl:94
 [44] optimize
    @ ~/.julia/packages/Optim/V8ZEC/src/multivariate/optimize/optimize.jl:36 [inlined]
 [45] optimize(f::Function, g::Function, initial_x::Vector{Float64}, method::BFGS{LineSearches.InitialStatic{Float64}, LineSearches.BackTracking{Float64, Int64}, Nothing, Nothing, Flat}, options::Optim.Options{Float64, Nothing}; inplace::Bool, autodiff::Symbol)
    @ Optim ~/.julia/packages/Optim/V8ZEC/src/multivariate/optimize/interface.jl:156
 [46] top-level scope
    @ REPL[30]:7

Version info:

julia> versioninfo()
Julia Version 1.9.3
Commit bed2cd540a1 (2023-08-24 14:43 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 8 × 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.6 (ORCJIT, tigerlake)
  Threads: 1 on 8 virtual cores

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions