Open bluenote10 opened 7 years ago
Thanks for the nice example.
I put a sleep(0.5)
in the for loop and now get the following:
[MemUsage] 135.9 MB [ +135.9 MB] @ Start
[MemUsage] 136.2 MB [ +0.3 MB] @ Initializing dask.Series
[MemUsage] 518.0 MB [ +381.8 MB] @ Initializing matrices
[MemUsage] 571.7 MB [ +53.7 MB] @ After iteration: 1
[MemUsage] 577.5 MB [ +5.8 MB] @ After iteration: 2
[MemUsage] 577.5 MB [ +0.0 MB] @ After iteration: 3
[MemUsage] 600.2 MB [ +22.7 MB] @ After iteration: 4
[MemUsage] 600.2 MB [ -0.1 MB] @ After iteration: 5
[MemUsage] 600.1 MB [ -0.1 MB] @ After iteration: 6
[MemUsage] 600.3 MB [ +0.2 MB] @ After iteration: 7
[MemUsage] 609.6 MB [ +9.3 MB] @ After iteration: 8
[MemUsage] 609.6 MB [ -0.0 MB] @ After iteration: 9
[MemUsage] 609.5 MB [ -0.1 MB] @ After iteration: 10
[MemUsage] 609.7 MB [ +0.2 MB] @ After iteration: 11
[MemUsage] 610.7 MB [ +1.0 MB] @ After iteration: 12
[MemUsage] 610.6 MB [ -0.0 MB] @ After iteration: 13
[MemUsage] 610.6 MB [ -0.1 MB] @ After iteration: 14
[MemUsage] 610.8 MB [ +0.2 MB] @ After iteration: 15
[MemUsage] 610.7 MB [ -0.1 MB] @ After iteration: 16
[MemUsage] 610.7 MB [ -0.0 MB] @ After iteration: 17
[MemUsage] 610.6 MB [ -0.1 MB] @ After iteration: 18
[MemUsage] 610.8 MB [ +0.2 MB] @ After iteration: 19
[MemUsage] 610.7 MB [ -0.1 MB] @ After iteration: 20
[MemUsage] 610.7 MB [ -0.0 MB] @ After iteration: 21
[MemUsage] 610.7 MB [ -0.0 MB] @ After iteration: 22
[MemUsage] 610.6 MB [ -0.1 MB] @ After iteration: 23
[MemUsage] 610.8 MB [ +0.2 MB] @ After iteration: 24
[MemUsage] 610.7 MB [ -0.1 MB] @ After iteration: 25
[MemUsage] 610.6 MB [ -0.1 MB] @ After iteration: 26
[MemUsage] 610.8 MB [ +0.2 MB] @ After iteration: 27
[MemUsage] 618.7 MB [ +7.9 MB] @ After iteration: 28
[MemUsage] 618.6 MB [ -0.1 MB] @ After iteration: 29
[MemUsage] 623.8 MB [ +5.1 MB] @ After iteration: 30
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 31
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 32
[MemUsage] 623.8 MB [ +0.2 MB] @ After iteration: 33
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 34
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 35
[MemUsage] 623.8 MB [ +0.2 MB] @ After iteration: 36
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 37
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 38
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 39
[MemUsage] 623.8 MB [ +0.2 MB] @ After iteration: 40
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 41
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 42
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 43
[MemUsage] 623.8 MB [ +0.2 MB] @ After iteration: 44
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 45
[MemUsage] 623.6 MB [ -0.1 MB] @ After iteration: 46
[MemUsage] 623.8 MB [ +0.2 MB] @ After iteration: 47
[MemUsage] 623.7 MB [ -0.1 MB] @ After iteration: 48
So my guess is that we are writing faster than the network can keep up.
This process is very expensive on the scheduler though, which keeps a copy of all of the intermediate values because of the persist loop that you mention.
It would be useful to enforce some kind of back pressure on the user. Unfortunately all of the current submission functions are entirely non-blocking.
Thanks for the quick feedback!
Indeed using wait(vector)
in the loop seems to be a reasonable work-around. But I think it is not only a back pressure issue: If I place a single wait(vector)
after the loop, the memory can't be clean-up any more even after the computation has finished (and there is still a reference to vector
). Is this a memory leak in the buffering?
The reason I'm using this iterative approach with intermediate results instead of a single persist
is that the single persist goes out-of-memory immediately. Apparently it behaves the same as the iterative version without the waits/sleeps.
I'm fighting some out-of-memory issues on client side in an operation, which acquires (and probably leaks) much more client memory than expected. The problem occurs in a combination of
map_partitions
andpersist
. Complete reproducing example:Output:
A guess would be that this combination of
map_partitions
+persist
makes copies of thematrix
parameters and there are unreleased references to these copies. Each iteration even seems to hold on to several copies, because each individual matrix is just ~7.6 MB in size, but the amount of leaked memory is ~5 times larger. In general I would not expect the client to keep references to these parameter matrices at all (but I assume that they are stored in the scheduler). Using a singlepersist
after the loop without persisting in the loop seems to leak memory in a similar way.Versions:
dask==0.15.2
distributed==1.18.3
tornado==4.5.2