Your model works fine with 10 random samples and achieves a perfect accuracy after a few steps:
device = 'cuda'
model = CNNModel().to(device)
data = torch.randn(10, 3, 120, 120, 120).to(device)
target = torch.randint(0, 2, (10,)).to(device)

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

for epoch in range(100):
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    acc = (torch.argmax(output, 1) == target).float().mean()
    print('epoch {}, loss {}, acc {}'.format(epoch, loss.item(), acc))

> epoch 0, loss 0.707537829875946, acc 0.5
epoch 1, loss 0.25594037771224976, acc 0.9000000357627869
epoch 2, loss 0.18612369894981384, acc 1.0
epoch 3, loss 0.18332494795322418, acc 1.0
epoch 4, loss 0.18075349926948547, acc 1.0
epoch 5, loss 0.17838451266288757, acc 1.0

so I would still recommend to play around with some hyperparameters and make sure your model can overfit the tiny dataset.