Files
2026-07-13 12:40:42 +08:00

149 lines
5.4 KiB
Python

# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import numpy as np
import paddle
import paddle.distributed as dist
from paddle.distributed import Replicate
class TestDistTensor(unittest.TestCase):
def test_dist_tensor_creation(self):
shape = [10, 5]
mesh = dist.ProcessMesh([[0, 1], [2, 3]], dim_names=["x", "y"])
placements = [Replicate(), Replicate()]
# create dist tensor using numpy
dist_tensor_with_numpy = dist.shard_tensor(
np.ones(shape, dtype=np.float32), mesh, placements
)
# create dist tensor using tensor
dist_tensor_with_tensor = dist.shard_tensor(
paddle.ones(shape), mesh, placements
)
# create normal tensor
tensor = paddle.ones(shape)
# test dist tensor properties
self.assertEqual(dist_tensor_with_numpy.shape, shape)
self.assertEqual(dist_tensor_with_tensor.shape, shape)
self.assertEqual(dist_tensor_with_numpy.is_dist(), True)
self.assertEqual(dist_tensor_with_tensor.is_dist(), True)
self.assertEqual(tensor.is_dist(), False)
self.assertEqual(
str(dist_tensor_with_numpy), str(dist_tensor_with_tensor)
)
self.assertEqual(dist_tensor_with_numpy.placements, placements)
self.assertEqual(dist_tensor_with_tensor.placements, placements)
def test_dist_parameter(self):
mesh = dist.ProcessMesh([[0, 1], [2, 3]], dim_names=["x", "y"])
placements = [Replicate(), Replicate()]
dense_param = paddle.create_parameter(
[10, 5], name="linear_1.weight", dtype='float32'
)
dist_param = dist.shard_tensor(dense_param, mesh, placements)
self.assertEqual(dense_param.name + ".dist", dist_param.name)
class TestDistTensorFromFn(unittest.TestCase):
def run_dtensor_from_fn(self):
# Create a dist_attr
mesh = dist.ProcessMesh([0, 1], dim_names=["x"])
placements = [Replicate()]
# for static graph here.
dist_attr = dist.DistAttr(mesh=mesh, sharding_specs=[None])
# Call the function dtensor_from_fn with dist_attr parameter
result = dist.dtensor_from_fn(paddle.ones, mesh, placements, shape=[16])
# Verify the result
if paddle.in_dynamic_mode():
self.assertIsInstance(result, paddle.Tensor)
self.assertEqual(result.shape, [16])
self.assertEqual(result.placements, placements)
else:
dist_attr.dynamic_dims = [0]
dist_attr.chunk_id = 0
self.assertIsInstance(result, paddle.base.libpaddle.pir.Value)
self.assertEqual(result.shape, [16])
self.assertEqual(
result.dist_attr().dims_mapping, dist_attr.dims_mapping
)
self.assertEqual(
result.dist_attr().process_mesh, dist_attr.process_mesh
)
result_zeros = dist.dtensor_from_fn(
paddle.zeros, mesh, placements, shape=[16]
)
if paddle.in_dynamic_mode():
dist_attr.dynamic_dims = []
self.assertIsInstance(result_zeros, paddle.Tensor)
self.assertEqual(result_zeros.shape, [16])
self.assertEqual(result_zeros.placements, placements)
else:
dist_attr.dynamic_dims = [0]
dist_attr.chunk_id = 0
self.assertIsInstance(result_zeros, paddle.base.libpaddle.pir.Value)
self.assertEqual(result_zeros.shape, [16])
self.assertEqual(
result_zeros.dist_attr().dims_mapping, dist_attr.dims_mapping
)
self.assertEqual(
result_zeros.dist_attr().process_mesh, dist_attr.process_mesh
)
result_random = dist.dtensor_from_fn(
paddle.rand, mesh, placements, shape=[16]
)
if paddle.in_dynamic_mode():
dist_attr.dynamic_dims = []
self.assertIsInstance(result_random, paddle.Tensor)
self.assertEqual(result_random.shape, [16])
self.assertEqual(result_random.placements, placements)
else:
dist_attr.dynamic_dims = [0]
dist_attr.chunk_id = 0
self.assertIsInstance(
result_random, paddle.base.libpaddle.pir.Value
)
self.assertEqual(result_random.shape, [16])
self.assertEqual(
result_random.dist_attr().dims_mapping, dist_attr.dims_mapping
)
self.assertEqual(
result_random.dist_attr().process_mesh, dist_attr.process_mesh
)
def test_dynamic_mode(self):
self.run_dtensor_from_fn()
# Test exceptions when running in static mode
def test_static_mode(self):
paddle.enable_static()
self.run_dtensor_from_fn()
paddle.disable_static()
if __name__ == "__main__":
unittest.main()