Accumulation
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 28/100
- Tipo de issue
- Refatoração
- Clareza
- Precisa de esclarecimento
- Status de atividade
- Estagnada
- Stack de tecnologia
- julia
- Domínio
- performance
Direção de pesquisa
Comece reproduzindo os benchmarks de Julia na issue e inspecione como Diffractor lida com os thunks retornados durante a acumulação. Compare o comportamento com ChainRulesCore.add!! e com os pull requests referenciados do Zygote e do ChainRulesCore. O trabalho estará concluído quando a abordagem de acumulação estiver decidida e os resultados dos benchmarks mostrarem se as alocações excessivas foram resolvidas.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
At present Diffractor may return thunks, but doesn't seem use them (or anything else) to accumulate effciently:
julia> @btime gradient(x -> sum(x), $(rand(100, 100))) |> first |> typeof
min 1.829 μs, mean 1.869 μs (8 allocations, 368 bytes)
ChainRulesCore.InplaceableThunk{ChainRulesCore.Thunk...
julia> @btime gradient(x -> sum(x) + sum(x), $(rand(100, 100))) |> first |> typeof
min 8.917 μs, mean 28.032 μs (22 allocations, 235.03 KiB)
Matrix{Float64} (alias for Array{Float64, 2})
julia> @btime copy($(rand(100, 100)));
min 1.262 μs, mean 4.120 μs (2 allocations, 78.17 KiB)
julia> 235.03 / 78.17
3.00665216835103
Should this change, perhaps to use ChainRulesCore.add!!? In which case it might it be easiest to change now, while there is nothing downstream to break.
Note aside that add!! is slower than expected here, 3 copies not 1:
julia> g1 = gradient(x -> sum(x), (rand(100, 100)))[1]; g2 = deepcopy(g1);
julia> @btime ChainRulesCore.add!!($(g1), $(g2));
min 4.719 μs, mean 21.300 μs (8 allocations, 234.55 KiB)
julia> 234.55 / 78.17
3.0005117052577717
julia> @btime ChainRulesCore.add!!($(randn(100, 100)), $(g2));
min 3.318 μs, mean 3.438 μs (0 allocations)
Or do we count on ImmutableArray and compiler improvements?
Xref https://github.com/FluxML/Zygote.jl/pull/981 which retrofits Zygote to accumulate in-place.
Xref also https://github.com/JuliaDiff/ChainRulesCore.jl/pull/539 which alters + on two thunks to be more efficient.
- Linguagem predominante
- Julia
- Estrelas
- 453
- Forks
- 33
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de JuliaDiff/Diffractor.jl
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 25/100
JuliaDiff/Diffractor.jl#302 · 2 comentários ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 52/100
JuliaDiff/Diffractor.jl#294 ·
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
JuliaDiff/Diffractor.jl#293 ·
-
bug
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
JuliaDiff/Diffractor.jl#290 · 8 comentários ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 35/100
JuliaDiff/Diffractor.jl#280 · 1 comentário ·
Todas as issues de JuliaDiff/Diffractor.jl
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
JuliaGPU/KernelAbstractions.jl#897 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
oscar-system/GAP.jl#1455 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
JuliaAI/MLJTransforms.jl#85 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
SciML/OrdinaryDiffEq.jl#4875 ·
Mantenedores costumam responder em até 4 dias