test_gpu.py 2.6 KB
Newer Older
lishen's avatar
lishen committed
1
2
import torch
import warpctc_pytorch as warp_ctc
lishen's avatar
lishen committed
3
from warpctc_pytorch import CTCLoss
lishen's avatar
lishen committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


def test_empty_label(test_cpu=True, test_gpu=True):
    probs = torch.FloatTensor([
        [[0.1, 0.6, 0.1, 0.1, 0.1], [0.1, 0.1, 0.6, 0.1, 0.1]],
        [[0.6, 0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.5, 0.2, 0.1]]
    ]).contiguous()
    grads = torch.zeros(probs.size())
    labels = torch.IntTensor([1, 2])
    label_sizes = torch.IntTensor([2, 0])
    sizes = torch.IntTensor([2, 2])
    minibatch_size = probs.size(1)

    if test_cpu:
        costs = torch.zeros(minibatch_size)
lishen's avatar
lishen committed
19
20
21
        warp_ctc.cpu_ctc(probs, grads, labels, label_sizes, sizes, minibatch_size, costs, 0)
        print('CPU cost sum = %f' % costs.sum())
        print('CPU probs={}\ngrads={}\ncosts={}\n\n'.format(probs, grads, costs))
lishen's avatar
lishen committed
22
23
24
25
26
27

    if test_gpu:
        probs = probs.clone().cuda()
        grads = torch.zeros(probs.size()).cuda()
        costs = torch.zeros(minibatch_size)
        warp_ctc.gpu_ctc(probs, grads, labels, label_sizes, sizes, minibatch_size, costs, 0)
lishen's avatar
lishen committed
28
        print('GPU cost sum = %f' % costs.sum())
lishen's avatar
lishen committed
29
        print(grads.view(grads.size(0) * grads.size(1), grads.size(2)))
lishen's avatar
lishen committed
30
        print('GPU probs={}\ngrads={}\ncosts={}\n\n'.format(probs, grads, costs))
lishen's avatar
lishen committed
31
32


lishen's avatar
lishen committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def test_ctcloss(test_cpu=True, test_gpu=True):
    criterion = CTCLoss(blank=0, size_average=False, length_average=False)
    probs = torch.FloatTensor([[[0.1, 0.6, 0.1, 0.1, 0.1], [0.1, 0.1, 0.6, 0.1, 0.1]]]).transpose(0, 1).contiguous()
    labels = torch.IntTensor([1, 2])
    probs_sizes = torch.IntTensor([2])
    label_sizes = torch.IntTensor([2])

    print('probs shape ', probs.shape)
    print('labels shape ', labels.shape)
    print('label_sizes ', sum(label_sizes))
    if test_cpu:
        probs_cpu = probs.clone().cpu().requires_grad_(True)  # tells autograd to compute gradients for probs
        cost = criterion(probs_cpu, labels, probs_sizes, label_sizes)
        cost.backward()
        print('CPU probs={}\ngrads={}\ncosts={}\n\n'.format(probs_cpu, probs_cpu.grad, cost))

    if test_gpu:
        probs_gpu = probs.clone().cuda().requires_grad_(True)  # tells autograd to compute gradients for probs
        cost = criterion(probs_gpu, labels, probs_sizes, label_sizes)
        cost.backward()
        print('GPU probs={}\ngrads={}\ncosts={}\n\n'.format(probs_gpu, probs_gpu.grad, cost))


def main():
lishen's avatar
lishen committed
57
    print('torch.cuda.is_available() ', torch.cuda.is_available())
lishen's avatar
lishen committed
58
59
60
61
62
63
    test_gpu = False
    if torch.cuda.is_available():
        test_gpu = True

    # test_empty_label(test_cpu=True, test_gpu=test_gpu)
    test_ctcloss(test_cpu=True, test_gpu=test_gpu)
lishen's avatar
lishen committed
64

lishen's avatar
lishen committed
65
66
67

if __name__ == '__main__':
    main()