import os import hydra import hydra.experimental import numpy as np import pytest import torch pytest_plugins = ["helpers_namespace"] hydra.experimental.initialize( os.path.join(os.path.dirname(__file__), "../pointnet2/config") ) @pytest.helpers.register def build_cfg(overrides=[]): return hydra.experimental.compose("config.yaml", overrides) @pytest.helpers.register def get_model(overrides=[]): cfg = build_cfg(overrides) return hydra.utils.instantiate(cfg.task_model, cfg) def _test_loop(model, inputs, labels): optimizer = torch.optim.Adam(model.parameters(), lr=1e-5) prev_loss = 1e10 for _ in range(5): optimizer.zero_grad() res = model.training_step((inputs, labels), None) loss = res["loss"] loss.backward() optimizer.step() assert loss.item() < prev_loss + 1.0, "Loss spiked upwards" prev_loss = loss.item() @pytest.helpers.register def cls_test(model): B, N = 4, 2048 inputs = torch.randn(B, N, 6).cuda() labels = torch.from_numpy(np.random.randint(0, 3, size=B)).cuda() model.cuda() _test_loop(model, inputs, labels) @pytest.helpers.register def semseg_test(model): B, N = 4, 2048 inputs = torch.randn(B, N, 9).cuda() labels = torch.from_numpy(np.random.randint(0, 3, size=B * N)).view(B, N).cuda() model.cuda() _test_loop(model, inputs, labels)