FluxML / Zygote.jl

21st century AD
https://fluxml.ai/Zygote.jl/
Other
1.48k stars 210 forks source link

Error with @showprogress #668

Open cossio opened 4 years ago

cossio commented 4 years ago
julia> function train()
       @showprogress for d in 1:10
       gs = Zygote.gradient(1.0) do x
       return sin(x)
       end
       end
       end
train (generic function with 1 method)
julia> train()
ERROR: Compiling Tuple{typeof(lock),ProgressMeter.var"#13#14"{Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}},Progress},ReentrantLock}: try/catch is not supported.

Stacktrace:

Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] instrument(::IRTools.Inner.IR) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/reverse.jl:89
 [3] #Primal#16 at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/reverse.jl:170 [inlined]
 [4] Zygote.Adjoint(::IRTools.Inner.IR; varargs::Nothing, normalise::Bool) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/reverse.jl:283
 [5] _lookup_grad(::Type{T} where T) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/emit.jl:101
 [6] #s3320#1912 at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:21 [inlined]
 [7] #s3320#1912(::Any, ::Any, ::Any) at ./none:0
 [8] (::Core.GeneratedFunctionStub)(::Any, ::Vararg{Any,N} where N) at ./boot.jl:526
 [9] #next!#12 at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:330 [inlined]
 [10] (::typeof(∂(#next!#12)))(::Nothing) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:0
 [11] next! at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:330 [inlined]
 [12] (::typeof(∂(next!)))(::Nothing) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:0
 [13] #finish!#33 at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:424 [inlined]
 [14] (::typeof(∂(#finish!#33)))(::Nothing) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:0
 [15] finish! at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:423 [inlined]
 [16] (::typeof(∂(finish!)))(::Nothing) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:0
 [17] macro expansion at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:525 [inlined]
 [18] #9 at ./REPL[8]:4 [inlined]
 [19] (::typeof(∂(λ)))(::Float64) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface2.jl:0
 [20] (::Zygote.var"#36#37"{typeof(∂(λ))})(::Float64) at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface.jl:46
 [21] gradient at /home/cossio/.julia/packages/Zygote/YeCEW/src/compiler/interface.jl:55 [inlined]
 [22] macro expansion at ./REPL[8]:3 [inlined]
 [23] macro expansion at /home/cossio/.julia/packages/ProgressMeter/lMMY9/src/ProgressMeter.jl:745 [inlined]
 [24] train() at ./REPL[8]:2
 [25] top-level scope at REPL[9]:1
cossio commented 4 years ago

I find it very strange that removing the return keyword I get no error:

function train()
       @showprogress for d in 1:10
       gs = Zygote.gradient(1.0) do x
         sin(x)
       end
   end
end

julia> train() # seems fine
darsnack commented 4 years ago

This is because the @showprogress macro will insert a call to finish! on the meter when it encounters a return/break keyword (to handle early returns from the progress loop). (src)

darsnack commented 4 years ago

Think this should be fixed in ProgressMeter.jl, because the source code has a FIXME comment about return statements within inner functions.