mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-10-14 07:12:49 +08:00
separate multigpu tests
Reviewed By: MichaelRamamonjisoa Differential Revision: D83477594 fbshipit-source-id: 5ea67543e288e9a06ee5141f436e879aa5cfb7f3
This commit is contained in:
parent
7711bf34a8
commit
fc6a6b8951
@ -17,7 +17,7 @@ from pytorch3d.structures.pointclouds import (
|
|||||||
Pointclouds,
|
Pointclouds,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .common_testing import needs_multigpu, TestCaseMixin
|
from .common_testing import TestCaseMixin
|
||||||
|
|
||||||
|
|
||||||
class TestPointclouds(TestCaseMixin, unittest.TestCase):
|
class TestPointclouds(TestCaseMixin, unittest.TestCase):
|
||||||
@ -703,82 +703,6 @@ class TestPointclouds(TestCaseMixin, unittest.TestCase):
|
|||||||
self.assertEqual(cuda_device, cloud.device)
|
self.assertEqual(cuda_device, cloud.device)
|
||||||
self.assertIsNot(cloud, converted_cloud)
|
self.assertIsNot(cloud, converted_cloud)
|
||||||
|
|
||||||
@needs_multigpu
|
|
||||||
def test_to_list(self):
|
|
||||||
cloud = self.init_cloud(5, 100, 10)
|
|
||||||
device = torch.device("cuda:1")
|
|
||||||
|
|
||||||
new_cloud = cloud.to(device)
|
|
||||||
self.assertTrue(new_cloud.device == device)
|
|
||||||
self.assertTrue(cloud.device == torch.device("cuda:0"))
|
|
||||||
for attrib in [
|
|
||||||
"points_padded",
|
|
||||||
"points_packed",
|
|
||||||
"normals_padded",
|
|
||||||
"normals_packed",
|
|
||||||
"features_padded",
|
|
||||||
"features_packed",
|
|
||||||
"num_points_per_cloud",
|
|
||||||
"cloud_to_packed_first_idx",
|
|
||||||
"padded_to_packed_idx",
|
|
||||||
]:
|
|
||||||
self.assertClose(
|
|
||||||
getattr(new_cloud, attrib)().cpu(), getattr(cloud, attrib)().cpu()
|
|
||||||
)
|
|
||||||
for i in range(len(cloud)):
|
|
||||||
self.assertClose(
|
|
||||||
cloud.points_list()[i].cpu(), new_cloud.points_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertClose(
|
|
||||||
cloud.normals_list()[i].cpu(), new_cloud.normals_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertClose(
|
|
||||||
cloud.features_list()[i].cpu(), new_cloud.features_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertTrue(all(cloud.valid.cpu() == new_cloud.valid.cpu()))
|
|
||||||
self.assertTrue(cloud.equisized == new_cloud.equisized)
|
|
||||||
self.assertTrue(cloud._N == new_cloud._N)
|
|
||||||
self.assertTrue(cloud._P == new_cloud._P)
|
|
||||||
self.assertTrue(cloud._C == new_cloud._C)
|
|
||||||
|
|
||||||
@needs_multigpu
|
|
||||||
def test_to_tensor(self):
|
|
||||||
cloud = self.init_cloud(5, 100, 10, lists_to_tensors=True)
|
|
||||||
device = torch.device("cuda:1")
|
|
||||||
|
|
||||||
new_cloud = cloud.to(device)
|
|
||||||
self.assertTrue(new_cloud.device == device)
|
|
||||||
self.assertTrue(cloud.device == torch.device("cuda:0"))
|
|
||||||
for attrib in [
|
|
||||||
"points_padded",
|
|
||||||
"points_packed",
|
|
||||||
"normals_padded",
|
|
||||||
"normals_packed",
|
|
||||||
"features_padded",
|
|
||||||
"features_packed",
|
|
||||||
"num_points_per_cloud",
|
|
||||||
"cloud_to_packed_first_idx",
|
|
||||||
"padded_to_packed_idx",
|
|
||||||
]:
|
|
||||||
self.assertClose(
|
|
||||||
getattr(new_cloud, attrib)().cpu(), getattr(cloud, attrib)().cpu()
|
|
||||||
)
|
|
||||||
for i in range(len(cloud)):
|
|
||||||
self.assertClose(
|
|
||||||
cloud.points_list()[i].cpu(), new_cloud.points_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertClose(
|
|
||||||
cloud.normals_list()[i].cpu(), new_cloud.normals_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertClose(
|
|
||||||
cloud.features_list()[i].cpu(), new_cloud.features_list()[i].cpu()
|
|
||||||
)
|
|
||||||
self.assertTrue(all(cloud.valid.cpu() == new_cloud.valid.cpu()))
|
|
||||||
self.assertTrue(cloud.equisized == new_cloud.equisized)
|
|
||||||
self.assertTrue(cloud._N == new_cloud._N)
|
|
||||||
self.assertTrue(cloud._P == new_cloud._P)
|
|
||||||
self.assertTrue(cloud._C == new_cloud._C)
|
|
||||||
|
|
||||||
def test_split(self):
|
def test_split(self):
|
||||||
clouds = self.init_cloud(5, 100, 10)
|
clouds = self.init_cloud(5, 100, 10)
|
||||||
split_sizes = [2, 3]
|
split_sizes = [2, 3]
|
||||||
|
166
tests/test_pointclouds_multigpu.py
Normal file
166
tests/test_pointclouds_multigpu.py
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This source code is licensed under the BSD-style license found in the
|
||||||
|
# LICENSE file in the root directory of this source tree.
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import torch
|
||||||
|
from pytorch3d.structures.pointclouds import Pointclouds
|
||||||
|
|
||||||
|
from .common_testing import needs_multigpu, TestCaseMixin
|
||||||
|
|
||||||
|
|
||||||
|
class TestPointclouds(TestCaseMixin, unittest.TestCase):
|
||||||
|
def setUp(self) -> None:
|
||||||
|
np.random.seed(42)
|
||||||
|
torch.manual_seed(42)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_cloud(
|
||||||
|
num_clouds: int = 3,
|
||||||
|
max_points: int = 100,
|
||||||
|
channels: int = 4,
|
||||||
|
lists_to_tensors: bool = False,
|
||||||
|
with_normals: bool = True,
|
||||||
|
with_features: bool = True,
|
||||||
|
min_points: int = 0,
|
||||||
|
requires_grad: bool = False,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Function to generate a Pointclouds object of N meshes with
|
||||||
|
random number of points.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
num_clouds: Number of clouds to generate.
|
||||||
|
channels: Number of features.
|
||||||
|
max_points: Max number of points per cloud.
|
||||||
|
lists_to_tensors: Determines whether the generated clouds should be
|
||||||
|
constructed from lists (=False) or
|
||||||
|
tensors (=True) of points/normals/features.
|
||||||
|
with_normals: bool whether to include normals
|
||||||
|
with_features: bool whether to include features
|
||||||
|
min_points: Min number of points per cloud
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Pointclouds object.
|
||||||
|
"""
|
||||||
|
device = torch.device("cuda:0")
|
||||||
|
p = torch.randint(low=min_points, high=max_points, size=(num_clouds,))
|
||||||
|
if lists_to_tensors:
|
||||||
|
p.fill_(p[0])
|
||||||
|
|
||||||
|
points_list = [
|
||||||
|
torch.rand(
|
||||||
|
(i, 3), device=device, dtype=torch.float32, requires_grad=requires_grad
|
||||||
|
)
|
||||||
|
for i in p
|
||||||
|
]
|
||||||
|
normals_list, features_list = None, None
|
||||||
|
if with_normals:
|
||||||
|
normals_list = [
|
||||||
|
torch.rand(
|
||||||
|
(i, 3),
|
||||||
|
device=device,
|
||||||
|
dtype=torch.float32,
|
||||||
|
requires_grad=requires_grad,
|
||||||
|
)
|
||||||
|
for i in p
|
||||||
|
]
|
||||||
|
if with_features:
|
||||||
|
features_list = [
|
||||||
|
torch.rand(
|
||||||
|
(i, channels),
|
||||||
|
device=device,
|
||||||
|
dtype=torch.float32,
|
||||||
|
requires_grad=requires_grad,
|
||||||
|
)
|
||||||
|
for i in p
|
||||||
|
]
|
||||||
|
|
||||||
|
if lists_to_tensors:
|
||||||
|
points_list = torch.stack(points_list)
|
||||||
|
if with_normals:
|
||||||
|
normals_list = torch.stack(normals_list)
|
||||||
|
if with_features:
|
||||||
|
features_list = torch.stack(features_list)
|
||||||
|
|
||||||
|
return Pointclouds(points_list, normals=normals_list, features=features_list)
|
||||||
|
|
||||||
|
@needs_multigpu
|
||||||
|
def test_to_list(self):
|
||||||
|
cloud = self.init_cloud(5, 100, 10)
|
||||||
|
device = torch.device("cuda:1")
|
||||||
|
|
||||||
|
new_cloud = cloud.to(device)
|
||||||
|
self.assertTrue(new_cloud.device == device)
|
||||||
|
self.assertTrue(cloud.device == torch.device("cuda:0"))
|
||||||
|
for attrib in [
|
||||||
|
"points_padded",
|
||||||
|
"points_packed",
|
||||||
|
"normals_padded",
|
||||||
|
"normals_packed",
|
||||||
|
"features_padded",
|
||||||
|
"features_packed",
|
||||||
|
"num_points_per_cloud",
|
||||||
|
"cloud_to_packed_first_idx",
|
||||||
|
"padded_to_packed_idx",
|
||||||
|
]:
|
||||||
|
self.assertClose(
|
||||||
|
getattr(new_cloud, attrib)().cpu(), getattr(cloud, attrib)().cpu()
|
||||||
|
)
|
||||||
|
for i in range(len(cloud)):
|
||||||
|
self.assertClose(
|
||||||
|
cloud.points_list()[i].cpu(), new_cloud.points_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertClose(
|
||||||
|
cloud.normals_list()[i].cpu(), new_cloud.normals_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertClose(
|
||||||
|
cloud.features_list()[i].cpu(), new_cloud.features_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertTrue(all(cloud.valid.cpu() == new_cloud.valid.cpu()))
|
||||||
|
self.assertTrue(cloud.equisized == new_cloud.equisized)
|
||||||
|
self.assertTrue(cloud._N == new_cloud._N)
|
||||||
|
self.assertTrue(cloud._P == new_cloud._P)
|
||||||
|
self.assertTrue(cloud._C == new_cloud._C)
|
||||||
|
|
||||||
|
@needs_multigpu
|
||||||
|
def test_to_tensor(self):
|
||||||
|
cloud = self.init_cloud(5, 100, 10, lists_to_tensors=True)
|
||||||
|
device = torch.device("cuda:1")
|
||||||
|
|
||||||
|
new_cloud = cloud.to(device)
|
||||||
|
self.assertTrue(new_cloud.device == device)
|
||||||
|
self.assertTrue(cloud.device == torch.device("cuda:0"))
|
||||||
|
for attrib in [
|
||||||
|
"points_padded",
|
||||||
|
"points_packed",
|
||||||
|
"normals_padded",
|
||||||
|
"normals_packed",
|
||||||
|
"features_padded",
|
||||||
|
"features_packed",
|
||||||
|
"num_points_per_cloud",
|
||||||
|
"cloud_to_packed_first_idx",
|
||||||
|
"padded_to_packed_idx",
|
||||||
|
]:
|
||||||
|
self.assertClose(
|
||||||
|
getattr(new_cloud, attrib)().cpu(), getattr(cloud, attrib)().cpu()
|
||||||
|
)
|
||||||
|
for i in range(len(cloud)):
|
||||||
|
self.assertClose(
|
||||||
|
cloud.points_list()[i].cpu(), new_cloud.points_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertClose(
|
||||||
|
cloud.normals_list()[i].cpu(), new_cloud.normals_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertClose(
|
||||||
|
cloud.features_list()[i].cpu(), new_cloud.features_list()[i].cpu()
|
||||||
|
)
|
||||||
|
self.assertTrue(all(cloud.valid.cpu() == new_cloud.valid.cpu()))
|
||||||
|
self.assertTrue(cloud.equisized == new_cloud.equisized)
|
||||||
|
self.assertTrue(cloud._N == new_cloud._N)
|
||||||
|
self.assertTrue(cloud._P == new_cloud._P)
|
||||||
|
self.assertTrue(cloud._C == new_cloud._C)
|
Loading…
x
Reference in New Issue
Block a user