Diff Coverage

Diff: origin/master...HEAD, staged and unstaged changes

Source File Diff Coverage (%) Missing Lines
hyper_parallel/core/dtensor/dtensor.py 33.3% 305-306
hyper_parallel/platform/torch/dtensor.py 56.7% 24-26,30,246-247,249-250,263,265,267,275,285
hyper_parallel/core/dtensor/dtensor.py
301
302
303
304
305
306
307
308
309

        Returns:
            DTensor: A new DTensor whose local shard is on CPU.
        """
        new_local = self._local_tensor.cpu()
        return self._from_converted_local(new_local)

    def float(self):
        """Convert the DTensor to float dtype.
hyper_parallel/platform/torch/dtensor.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

def _tensor_data_descriptor():
    """Return the raw Tensor.data descriptor from Tensor or its base classes."""
    for tensor_cls in getattr(Tensor, "__mro__", ()):  # tolerate tests patching Tensor with a mock object
        descriptor = vars(tensor_cls).get("data")
        if descriptor is not None:
            return descriptor
    descriptor = getattr(Tensor, "data", None)
    if descriptor is not None and hasattr(descriptor, "__get__"):
        return descriptor
    raise AttributeError("Tensor.data descriptor is not available")


class DTensorBase(Tensor):
    """torch dtensor base"""
242
243
244
245
246
247
248
249
250
251
252
253
254

    @property
    # pylint: disable=C2801
    def data(self):
        data_descriptor = _tensor_data_descriptor()
        local_data = data_descriptor.__get__(self._local_tensor, type(self._local_tensor))
        # pylint: disable=C0415
        from hyper_parallel.core.dtensor.dtensor import DTensor
        return DTensor.from_local(
            local_data,
            self._device_mesh,
            self._alias_placements(),
        )
259
260
261
262
263
264
265
266
267
268
269
270
271
        requires_grad = getattr(self, "requires_grad", None)
        if isinstance(value, DTensorBase):
            local_value = value.to_local()
            if hasattr(value, "device_mesh"):
                self._device_mesh = value.device_mesh
            if hasattr(value, "placements"):
                self._placements = value.placements
            if hasattr(value, "layout"):
                self._layout = value.layout
        else:
            local_value = value
        data_descriptor = _tensor_data_descriptor()
        with getattr(torch, "_C").DisableTorchFunctionSubclass():
271
272
273
274
275
276
277
278
        with getattr(torch, "_C").DisableTorchFunctionSubclass():
            data_descriptor.__set__(self, local_value)
            data_descriptor.__set__(self._local_tensor, local_value)
        if requires_grad is not None and hasattr(self, "requires_grad_"):
            self.requires_grad_(requires_grad)

    def numpy(self, *args, **kwargs):
        """Return the local shard as a NumPy array.
281
282
283
284
285
286
287
288
289
        ``dtensor.data.cpu().numpy()``. NumPy has no distributed layout
        inference path; delegate to the local tensor to keep Tensor-like local
        data semantics.
        """
        return self._local_tensor.numpy(*args, **kwargs)

    @property
    def dtype(self) -> torch.dtype:
        """