From 530cca5696be5cf64f8311f8ae81a6b113a6662b Mon Sep 17 00:00:00 2001 From: youth123 <2042519524@qq.com> Date: Mon, 18 Oct 2021 20:04:25 +0800 Subject: [PATCH 1/2] fix global gather and global scatter operators --- .../collective/global_scatter_op.cu.cc | 8 +++---- python/paddle/distributed/utils.py | 20 ++++++------------ .../static_mode_white_list.cpython-37.pyc | Bin 0 -> 21047 bytes 3 files changed, 11 insertions(+), 17 deletions(-) create mode 100644 tools/__pycache__/static_mode_white_list.cpython-37.pyc diff --git a/paddle/fluid/operators/collective/global_scatter_op.cu.cc b/paddle/fluid/operators/collective/global_scatter_op.cu.cc index 64765b549e5c1f..bec984c6b57e19 100644 --- a/paddle/fluid/operators/collective/global_scatter_op.cu.cc +++ b/paddle/fluid/operators/collective/global_scatter_op.cu.cc @@ -47,8 +47,8 @@ class GlobalScatterOpCUDAKernel : public framework::OpKernel { if (platform::is_cpu_place(local_count->place())) { cpu_local_count_data = local_count->data(); } else { - framework::TensorCopy(*local_count, platform::CPUPlace(), - &cpu_local_count); + framework::TensorCopySync(*local_count, platform::CPUPlace(), + &cpu_local_count); cpu_local_count_data = cpu_local_count.data(); } auto global_count_len = 0; @@ -57,8 +57,8 @@ class GlobalScatterOpCUDAKernel : public framework::OpKernel { cpu_global_count_data = global_count->data(); global_count_len = global_count->numel(); } else { - framework::TensorCopy(*global_count, platform::CPUPlace(), - &cpu_global_count); + framework::TensorCopySync(*global_count, platform::CPUPlace(), + &cpu_global_count); cpu_global_count_data = cpu_global_count.data(); global_count_len = cpu_global_count.numel(); } diff --git a/python/paddle/distributed/utils.py b/python/paddle/distributed/utils.py index 63585e167e8e32..31d5748ce392e7 100644 --- a/python/paddle/distributed/utils.py +++ b/python/paddle/distributed/utils.py @@ -65,14 +65,11 @@ def global_scatter(x, to global_count. Args: - x (Tensor): Tensor. Every element in the list must be a Tensor whose data type - should be float16, float32, float64, int32 or int64. + x (Tensor): Tensor. The tensor data type should be float16, float32, float64, int32 or int64. local_count (Tensor): Tensor which have n_expert * world_size elements that indicates - how many data needed to be sent. Every element in the list must be a Tensor whose - data type should be int64. + how many data needed to be sent. The tensor data type should be int64. global_count (Tensor): Tensor which have n_expert * world_size elements that indicates - how many data needed to be received. Every element in the list must be a Tensor whose - data type should be int64. + how many data needed to be received. The tensor data type should be int64. group (Group, optional): The group instance return by new_group or None for global default group. Default: None. use_calc_stream (bool, optional): Wether to use calculation stream (True) or communication stream. Default: True. @@ -161,19 +158,16 @@ def global_gather(x, to global_count. Args: - x (Tensor): Tensor. Every element in the list must be a Tensor whose data type - should be float16, float32, float64, int32 or int64. + x (Tensor): Tensor. Tensor whose data type should be float16, float32, float64, int32 or int64. local_count (Tensor): Tensor which have n_expert * world_size elements that indicates - how many data needed to be received. Every element in the list must be a Tensor whose - data type should be int64. + how many data needed to be received. Tensor data type should be int64. global_count (Tensor): Tensor which have n_expert * world_size elements that indicates - how many data needed to be sent. Every element in the list must be a Tensor whose - data type should be int64. + how many data needed to be sent. Tensor data type should be int64. group (Group, optional): The group instance return by new_group or None for global default group. Default: None. use_calc_stream (bool, optional): Wether to use calculation stream (True) or communication stream. Default: True. Returns: - None. + out (Tensor): The data received from all experts. Examples: .. code-block:: python diff --git a/tools/__pycache__/static_mode_white_list.cpython-37.pyc b/tools/__pycache__/static_mode_white_list.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05e9cf5d2cb480f77a4d4658218aba853bf53936 GIT binary patch literal 21047 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 literal 0 HcmV?d00001 From 76eecb42b52aca7e0d416b4e73bc1efd24766153 Mon Sep 17 00:00:00 2001 From: youth123 <2042519524@qq.com> Date: Mon, 18 Oct 2021 20:08:44 +0800 Subject: [PATCH 2/2] delete some dummy files --- .../static_mode_white_list.cpython-37.pyc | Bin 21047 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/__pycache__/static_mode_white_list.cpython-37.pyc diff --git a/tools/__pycache__/static_mode_white_list.cpython-37.pyc b/tools/__pycache__/static_mode_white_list.cpython-37.pyc deleted file mode 100644 index 05e9cf5d2cb480f77a4d4658218aba853bf53936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21047 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