Skip to content

Commit 8a7e54d

Browse files
[Eager] eager tensor support pickler (#47025)
* test_paddle_multiprocessing support eager tensor pickler
1 parent eb10218 commit 8a7e54d

File tree

2 files changed

+25
-47
lines changed

2 files changed

+25
-47
lines changed

python/paddle/fluid/tests/unittests/test_paddle_multiprocessing.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,12 @@
1818
import time
1919
import paddle
2020
import paddle.incubate.multiprocessing as mp
21-
from paddle.fluid.framework import (
22-
_enable_legacy_dygraph,
23-
_test_eager_guard,
24-
in_dygraph_mode,
25-
)
2621

2722
REPEAT = 20
2823
HAS_SHM_FILES = os.path.isdir('/dev/shm')
2924

3025

3126
def fill_tensor(queue, event):
32-
# make sure run in legacy dygraph
33-
if in_dygraph_mode():
34-
_enable_legacy_dygraph()
3527
data = queue.get()
3628
with paddle.no_grad():
3729
data[0][:] = 5
@@ -182,36 +174,24 @@ def test_receive():
182174

183175
class TestMultiprocessingCpu(TestMultiprocessingBase):
184176
def func_test_pass_tensor(self):
185-
if in_dygraph_mode():
186-
return
187177
paddle.set_device("cpu")
188178
self._test_sharing(repeat=REPEAT)
189179

190180
def test_pass_tensor(self):
191-
with _test_eager_guard():
192-
self.func_test_pass_tensor()
193181
self.func_test_pass_tensor()
194182

195183
def func_test_pass_parambase(self):
196-
if in_dygraph_mode():
197-
return
198184
paddle.set_device("cpu")
199185
self._test_sharing(repeat=1, param=True)
200186

201187
def test_pass_parambase(self):
202-
with _test_eager_guard():
203-
self.func_test_pass_parambase()
204188
self.func_test_pass_parambase()
205189

206190
def func_test_pass_empty(self):
207-
if in_dygraph_mode():
208-
return
209191
paddle.set_device("cpu")
210192
self._test_empty()
211193

212194
def test_pass_empty(self):
213-
with _test_eager_guard():
214-
self.func_test_pass_empty()
215195
self.func_test_pass_empty()
216196

217197

@@ -221,14 +201,10 @@ class TestMultiprocessingGpu(TestMultiprocessingBase):
221201
"core is not compiled with CUDA",
222202
)
223203
def func_test_pass_tensor(self):
224-
if in_dygraph_mode():
225-
return
226204
paddle.set_device("gpu")
227205
self._test_sharing(mp.get_context("spawn"), "gpu")
228206

229207
def test_pass_tensor(self):
230-
with _test_eager_guard():
231-
self.func_test_pass_tensor()
232208
self.func_test_pass_tensor()
233209

234210

python/paddle/incubate/multiprocessing/reductions.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ def _supported_check():
4545
return True
4646

4747

48-
class LRUSharedCache(OrderedDict):
48+
class _LRUSharedCache(OrderedDict):
4949
def __init__(self):
5050
self.limit = 128
5151
self._after_fork()
52-
register_after_fork(self, LRUSharedCache._after_fork)
52+
register_after_fork(self, _LRUSharedCache._after_fork)
5353

5454
def _after_fork(self):
5555
self.lock = threading.Lock()
@@ -73,25 +73,25 @@ def __setitem__(self, key, value):
7373
super().__setitem__(key, value)
7474

7575

76-
shared_cache = LRUSharedCache()
76+
shared_cache = _LRUSharedCache()
7777

7878

79-
def cuda_from_cache(key):
79+
def _cuda_from_cache(key):
8080
lodtensor = shared_cache.get(key)
8181
if lodtensor is None:
8282
return None
8383
return lodtensor
8484

8585

86-
def rebuild_tensor(cls, lodtensor, metadata):
87-
if cls == paddle.fluid.framework.ParamBase:
88-
tensor = paddle.fluid.framework.ParamBase(
86+
def _rebuild_tensor(cls, lodtensor, metadata):
87+
if cls == paddle.fluid.framework.EagerParamBase:
88+
tensor = paddle.fluid.framework.EagerParamBase(
8989
lodtensor.shape(), lodtensor._dtype(), **metadata
9090
)
9191
tensor.value().get_tensor()._share_data_with(lodtensor)
9292
else:
9393
size, stop_gradient = metadata
94-
tensor = paddle.fluid.core.VarBase()
94+
tensor = paddle.fluid.core.eager.Tensor()
9595
if lodtensor._is_initialized():
9696
tensor.value().get_tensor()._share_data_with(lodtensor)
9797
else:
@@ -100,7 +100,7 @@ def rebuild_tensor(cls, lodtensor, metadata):
100100
return tensor
101101

102102

103-
def reduce_tensor(tensor):
103+
def _reduce_tensor(tensor):
104104
lodtensor = tensor.value().get_tensor()
105105

106106
if not tensor.stop_gradient and not tensor.is_leaf:
@@ -113,29 +113,29 @@ def reduce_tensor(tensor):
113113
or tensor.place.is_gpu_place()
114114
or tensor.place.is_cuda_pinned_place()
115115
):
116-
if type(tensor) == paddle.fluid.framework.ParamBase:
116+
if type(tensor) == paddle.fluid.framework.EagerParamBase:
117117
metadata = copy.deepcopy(tensor.__dict__)
118118
else:
119119
metadata = (tensor.size, tensor.stop_gradient)
120120

121-
return (rebuild_tensor, (type(tensor), lodtensor, metadata))
121+
return (_rebuild_tensor, (type(tensor), lodtensor, metadata))
122122
else:
123123
raise ValueError(
124124
"Only support tensors of CPU/CUDA/CUDAPinned Place, Not support %s for now!"
125125
% tensor.place
126126
)
127127

128128

129-
def rebuild_lodtensor_filename(cls, ipc_name, size, type_idx, dims, lod):
129+
def _rebuild_lodtensor_filename(cls, ipc_name, size, type_idx, dims, lod):
130130
lodtensor = cls._new_shared_filename((ipc_name, size, type_idx, dims, lod))
131131
lodtensor._shared_decref()
132132
return lodtensor
133133

134134

135-
def rebuild_cuda_tensor(
135+
def _rebuild_cuda_tensor(
136136
cls, handle, offset_bytes, size, type_idx, dims, lod, device_idx
137137
):
138-
cache_tensor = cuda_from_cache((handle, offset_bytes))
138+
cache_tensor = _cuda_from_cache((handle, offset_bytes))
139139
if cache_tensor is None:
140140
lodtensor = cls._new_shared_cuda(
141141
(handle, offset_bytes, size, type_idx, dims, lod, device_idx)
@@ -155,33 +155,33 @@ def rebuild_cuda_tensor(
155155
return lodtensor
156156

157157

158-
def rebuild_lodtensor_empty(cls):
158+
def _rebuild_lodtensor_empty(cls):
159159
# TODO: check if tensor initialized
160160
# TODO: handle the dtype of empty tensor
161161
return cls()
162162

163163

164-
def reduce_lodtensor(lodtensor):
164+
def _reduce_lodtensor(lodtensor):
165165
if (
166166
lodtensor._place().is_cpu_place()
167167
or lodtensor._place().is_cuda_pinned_place()
168168
):
169169
for dim in lodtensor.shape():
170170
if dim == 0:
171171
# Empty tensors have nothing be mmapped.
172-
return (rebuild_lodtensor_empty, (type(lodtensor),))
172+
return (_rebuild_lodtensor_empty, (type(lodtensor),))
173173

174174
# Default use share filename stratege
175175
metadata = (
176176
lodtensor._share_filename()
177177
) # ipc_name, size, type_idx, dims, lod
178-
rebuild = rebuild_lodtensor_filename
178+
rebuild = _rebuild_lodtensor_filename
179179
lodtensor._shared_incref()
180180
# TODO, maintain reference for lodtensor
181181
# TODO: support file_discriptor stratege
182182
elif lodtensor._place().is_gpu_place():
183183
metadata = lodtensor._share_cuda()
184-
rebuild = rebuild_cuda_tensor
184+
rebuild = _rebuild_cuda_tensor
185185
else:
186186
raise RuntimeError("We only support pass cpu/gpu lodtensor for now!")
187187

@@ -192,7 +192,9 @@ def init_reductions():
192192
if not _supported_check():
193193
return
194194

195-
ForkingPickler.register(paddle.Tensor, reduce_tensor)
196-
ForkingPickler.register(paddle.fluid.core.VarBase, reduce_tensor)
197-
ForkingPickler.register(paddle.fluid.framework.ParamBase, reduce_tensor)
198-
ForkingPickler.register(paddle.fluid.core.LoDTensor, reduce_lodtensor)
195+
ForkingPickler.register(paddle.Tensor, _reduce_tensor)
196+
ForkingPickler.register(paddle.fluid.core.eager.Tensor, _reduce_tensor)
197+
ForkingPickler.register(
198+
paddle.fluid.framework.EagerParamBase, _reduce_tensor
199+
)
200+
ForkingPickler.register(paddle.fluid.core.LoDTensor, _reduce_lodtensor)

0 commit comments

Comments
 (0)