You need to sign in or sign up before continuing.
Commit 46cf1970 authored by Jeremy Reizenstein's avatar Jeremy Reizenstein Committed by Facebook GitHub Bot
Browse files

cpu benchmarks for points to volumes

Summary:
Add a CPU version to the benchmarks.

```
Benchmark                                                               Avg Time(μs)      Peak Time(μs) Iterations
--------------------------------------------------------------------------------
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[25, 25, 25]_1000                    10100           46422             50
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[25, 25, 25]_10000                   28442           32100             18
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[25, 25, 25]_100000                 241127          254269              3
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[101, 111, 121]_1000                 54149           79480             10
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[101, 111, 121]_10000               125459          212734              4
ADD_POINTS_TO_VOLUMES_cpu_10_trilinear_[101, 111, 121]_100000              512739          512739              1
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[25, 25, 25]_1000                       2866           13365            175
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[25, 25, 25]_10000                      7026           12604             72
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[25, 25, 25]_100000                    48822           55607             11
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[101, 111, 121]_1000                   38098           38576             14
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[101, 111, 121]_10000                  48006           54120             11
ADD_POINTS_TO_VOLUMES_cpu_10_nearest_[101, 111, 121]_100000                131563          138536              4
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[25, 25, 25]_1000                   64615           91735              8
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[25, 25, 25]_10000                 228815          246095              3
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[25, 25, 25]_100000               3086615         3086615              1
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[101, 111, 121]_1000               464298          465292              2
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[101, 111, 121]_10000             1053440         1053440              1
ADD_POINTS_TO_VOLUMES_cpu_100_trilinear_[101, 111, 121]_100000            6736236         6736236              1
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[25, 25, 25]_1000                     11940           12440             42
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[25, 25, 25]_10000                    56641           58051              9
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[25, 25, 25]_100000                  711492          711492              1
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[101, 111, 121]_1000                 326437          329846              2
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[101, 111, 121]_10000                418514          427911              2
ADD_POINTS_TO_VOLUMES_cpu_100_nearest_[101, 111, 121]_100000              1524285         1524285              1
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[25, 25, 25]_1000                  5949           13602             85
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[25, 25, 25]_10000                 5817           13001             86
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[25, 25, 25]_100000               23833           25971             21
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[101, 111, 121]_1000               9029           16178             56
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[101, 111, 121]_10000             11595           18601             44
ADD_POINTS_TO_VOLUMES_cuda:0_10_trilinear_[101, 111, 121]_100000            46986           47344             11
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[25, 25, 25]_1000                    2554            9747            196
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[25, 25, 25]_10000                   2676            9537            187
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[25, 25, 25]_100000                  6567           14179             77
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[101, 111, 121]_1000                 5840           12811             86
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[101, 111, 121]_10000                6102           13128             82
ADD_POINTS_TO_VOLUMES_cuda:0_10_nearest_[101, 111, 121]_100000              11945           11995             42
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[25, 25, 25]_1000                 7642           13671             66
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[25, 25, 25]_10000               25190           25260             20
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[25, 25, 25]_100000             212018          212134              3
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[101, 111, 121]_1000             40421           45692             13
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[101, 111, 121]_10000            92078           92132              6
ADD_POINTS_TO_VOLUMES_cuda:0_100_trilinear_[101, 111, 121]_100000          457211          457229              2
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[25, 25, 25]_1000                   3574           10377            140
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[25, 25, 25]_10000                  7222           13023             70
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[25, 25, 25]_100000                48127           48165             11
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[101, 111, 121]_1000               34732           35295             15
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[101, 111, 121]_10000              43050           51064             12
ADD_POINTS_TO_VOLUMES_cuda:0_100_nearest_[101, 111, 121]_100000            106028          106058              5
--------------------------------------------------------------------------------
```

Reviewed By: patricklabatut

Differential Revision: D29522830

fbshipit-source-id: 1e857db03613b0c6afcb68a58cdd7ba032e1a874
parent 5491b465
...@@ -12,6 +12,7 @@ from test_points_to_volumes import TestPointsToVolumes ...@@ -12,6 +12,7 @@ from test_points_to_volumes import TestPointsToVolumes
def bm_points_to_volumes() -> None: def bm_points_to_volumes() -> None:
case_grid = { case_grid = {
"device": ["cpu", "cuda:0"],
"batch_size": [10, 100], "batch_size": [10, 100],
"interp_mode": ["trilinear", "nearest"], "interp_mode": ["trilinear", "nearest"],
"volume_size": [[25, 25, 25], [101, 111, 121]], "volume_size": [[25, 25, 25], [101, 111, 121]],
......
...@@ -26,16 +26,14 @@ if DEBUG: ...@@ -26,16 +26,14 @@ if DEBUG:
from PIL import Image from PIL import Image
def init_cube_point_cloud( def init_cube_point_cloud(batch_size: int, n_points: int, device: str, rotate_y: bool):
batch_size: int = 10, n_points: int = 100000, rotate_y: bool = True
):
""" """
Generate a random point cloud of `n_points` whose points Generate a random point cloud of `n_points` whose points
are sampled from faces of a 3D cube. are sampled from faces of a 3D cube.
""" """
# create the cube mesh batch_size times # create the cube mesh batch_size times
meshes = TestPointsToVolumes.init_cube_mesh(batch_size) meshes = TestPointsToVolumes.init_cube_mesh(batch_size=batch_size, device=device)
# generate point clouds by sampling points from the meshes # generate point clouds by sampling points from the meshes
pcl = sample_points_from_meshes(meshes, num_samples=n_points, return_normals=False) pcl = sample_points_from_meshes(meshes, num_samples=n_points, return_normals=False)
...@@ -66,7 +64,7 @@ def init_cube_point_cloud( ...@@ -66,7 +64,7 @@ def init_cube_point_cloud(
if rotate_y: if rotate_y:
# uniformly spaced rotations around y axis # uniformly spaced rotations around y axis
R = init_uniform_y_rotations(batch_size=batch_size) R = init_uniform_y_rotations(batch_size=batch_size, device=device)
# rotate the point clouds around y axis # rotate the point clouds around y axis
pcl = torch.bmm(pcl - 0.5, R) + 0.5 pcl = torch.bmm(pcl - 0.5, R) + 0.5
...@@ -78,6 +76,7 @@ def init_volume_boundary_pointcloud( ...@@ -78,6 +76,7 @@ def init_volume_boundary_pointcloud(
volume_size: Tuple[int, int, int], volume_size: Tuple[int, int, int],
n_points: int, n_points: int,
interp_mode: str, interp_mode: str,
device: str,
require_grad: bool = False, require_grad: bool = False,
): ):
""" """
...@@ -86,7 +85,9 @@ def init_volume_boundary_pointcloud( ...@@ -86,7 +85,9 @@ def init_volume_boundary_pointcloud(
""" """
# generate a 3D point cloud sampled from sides of a [0,1] cube # generate a 3D point cloud sampled from sides of a [0,1] cube
xyz, rgb = init_cube_point_cloud(batch_size, n_points=n_points, rotate_y=True) xyz, rgb = init_cube_point_cloud(
batch_size, n_points=n_points, device=device, rotate_y=True
)
# make volume_size tensor # make volume_size tensor
volume_size_t = torch.tensor(volume_size, dtype=xyz.dtype, device=xyz.device) volume_size_t = torch.tensor(volume_size, dtype=xyz.dtype, device=xyz.device)
...@@ -128,12 +129,11 @@ def init_volume_boundary_pointcloud( ...@@ -128,12 +129,11 @@ def init_volume_boundary_pointcloud(
return pointclouds, initial_volumes return pointclouds, initial_volumes
def init_uniform_y_rotations(batch_size: int = 10): def init_uniform_y_rotations(batch_size: int, device: torch.device):
""" """
Generate a batch of `batch_size` 3x3 rotation matrices around y-axis Generate a batch of `batch_size` 3x3 rotation matrices around y-axis
whose angles are uniformly distributed between 0 and 2 pi. whose angles are uniformly distributed between 0 and 2 pi.
""" """
device = torch.device("cuda:0")
axis = torch.tensor([0.0, 1.0, 0.0], device=device, dtype=torch.float32) axis = torch.tensor([0.0, 1.0, 0.0], device=device, dtype=torch.float32)
angles = torch.linspace(0, 2.0 * np.pi, batch_size + 1, device=device) angles = torch.linspace(0, 2.0 * np.pi, batch_size + 1, device=device)
angles = angles[:batch_size] angles = angles[:batch_size]
...@@ -153,6 +153,7 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase): ...@@ -153,6 +153,7 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase):
volume_size: Tuple[int, int, int], volume_size: Tuple[int, int, int],
n_points: int, n_points: int,
interp_mode: str, interp_mode: str,
device: str,
): ):
(pointclouds, initial_volumes) = init_volume_boundary_pointcloud( (pointclouds, initial_volumes) = init_volume_boundary_pointcloud(
batch_size=batch_size, batch_size=batch_size,
...@@ -160,10 +161,14 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase): ...@@ -160,10 +161,14 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase):
n_points=n_points, n_points=n_points,
interp_mode=interp_mode, interp_mode=interp_mode,
require_grad=False, require_grad=False,
device=device,
) )
torch.cuda.synchronize()
def _add_points_to_volumes(): def _add_points_to_volumes():
add_pointclouds_to_volumes(pointclouds, initial_volumes, mode=interp_mode) add_pointclouds_to_volumes(pointclouds, initial_volumes, mode=interp_mode)
torch.cuda.synchronize()
return _add_points_to_volumes return _add_points_to_volumes
...@@ -179,12 +184,12 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase): ...@@ -179,12 +184,12 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase):
return arr3d return arr3d
@staticmethod @staticmethod
def init_cube_mesh(batch_size: int = 10): def init_cube_mesh(batch_size: int, device: str):
""" """
Generate a batch of `batch_size` cube meshes. Generate a batch of `batch_size` cube meshes.
""" """
device = torch.device("cuda:0") device = torch.device(device)
verts, faces = [], [] verts, faces = [], []
...@@ -255,6 +260,7 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase): ...@@ -255,6 +260,7 @@ class TestPointsToVolumes(TestCaseMixin, unittest.TestCase):
interp_mode=interp_mode, interp_mode=interp_mode,
batch_size=batch_size, batch_size=batch_size,
require_grad=True, require_grad=True,
device="cuda:0",
) )
volumes = add_pointclouds_to_volumes( volumes = add_pointclouds_to_volumes(
......
...@@ -151,7 +151,7 @@ def init_cameras( ...@@ -151,7 +151,7 @@ def init_cameras(
device = torch.device("cuda:0") device = torch.device("cuda:0")
# trivial rotations # trivial rotations
R = init_uniform_y_rotations(batch_size).to(device) R = init_uniform_y_rotations(batch_size=batch_size, device=device)
# move camera 1.5 m away from the scene center # move camera 1.5 m away from the scene center
T = torch.zeros((batch_size, 3), device=device) T = torch.zeros((batch_size, 3), device=device)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment