ChainRulesCore projection & ReverseDiff.TrackedArray
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 38/100
Direzione di ricerca
Inizia leggendo il dispatch di ProjectTo di ChainRulesCore e le definizioni di ReverseDiff.TrackedArray, quindi riproduci il comportamento mostrato di ProjectTo(ta) e ProjectTo(rand(3))(ta). Il lavoro è completato quando la proiezione di un TrackedArray ne preserva la forma di array tracciato invece di produrre un array di TrackedReal, mentre la proiezione degli array ordinari continua a funzionare.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
When using ReverseDiff over Zygote, its tracked arrays will often be turned into arrays of TrackedReal:
julia> using ReverseDiff, Zygote
julia> _, back = pullback(x -> cumsum(x .^ 3), rand(3))
([0.0417770851525806, 0.08898338554941161, 0.13448629430576223], Zygote.var"#52#53"{typeof(∂(#11))}(∂(#11)))
julia> ta = ReverseDiff.track([1,2,3.0]);
julia> back(ta)[1]
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}:
TrackedReal<Ha5>(2.1671946936904316, 0.0, BcR, ---)
TrackedReal<J2r>(1.9592562290038964, 0.0, BcR, ---)
TrackedReal<5TB>(1.147101768209455, 0.0, BcR, ---)
The cause of this is that ChainRulesCore's projection mechanism looks at the eltype, and decides that it needs correcting:
julia> using ChainRulesCore
julia> pt = ProjectTo(ta)
ProjectTo{AbstractArray}(element = ProjectTo{Real}(), axes = (Base.OneTo(3),))
julia> pt(ta) # this works fine, TrackedArray
3-element ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}:
TrackedReal<EIm>(1.0, 0.0, BcR, 1, 96O)
TrackedReal<I8K>(2.0, 0.0, BcR, 2, 96O)
TrackedReal<9lo>(3.0, 0.0, BcR, 3, 96O)
julia> pr = ProjectTo(rand(3))
ProjectTo{AbstractArray}(element = ProjectTo{Float64}(), axes = (Base.OneTo(3),))
julia> pr(ta) # makes a Vector{TrackedReal}
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}}}:
TrackedReal<KBA>(1.0, 0.0, BcR, 1, 96O)
TrackedReal<29L>(2.0, 0.0, BcR, 2, 96O)
TrackedReal<7oX>(3.0, 0.0, BcR, 3, 96O)
julia> map(pr.element, ta) # this is what projection calls, as TrackedReal <: Float64 is false
3-element Vector{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}}}:
TrackedReal<AQQ>(1.0, 0.0, BcR, 1, 96O)
TrackedReal<5IS>(2.0, 0.0, BcR, 2, 96O)
TrackedReal<2yC>(3.0, 0.0, BcR, 3, 96O)
I think this should probably be avoided, by adding methods to (::ProjectTo)(::TrackedArray) which bypass this behaviour. Since ReverseDiff already depends on CRC, no extra deps are required.
- Lingua principale
- Julia
- Stelle
- 397
- Fork
- 62
- Merge medio
- 12h 50m
- PR unite (30g)
- 8
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 JuliaDiff/ReverseDiff.jl
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
JuliaDiff/ReverseDiff.jl#318 ·
-
`@grad`/`@grad_from_chainrules` silently reuse a tangent if a pullback returns too few tangentsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
JuliaDiff/ReverseDiff.jl#315 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
JuliaDiff/ReverseDiff.jl#314 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 56/100
JuliaDiff/ReverseDiff.jl#321 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
JuliaDiff/ReverseDiff.jl#320 ·
Tutte le issue di JuliaDiff/ReverseDiff.jl
Issue simili
-
io
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
JuliaGPU/GPUArrays.jl#837 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
bmad-sim/BeamTracking.jl#382 ·
I maintainer di solito rispondono entro 1 giorno