2017-06-20 4 views
0

ein Freund von mir implementiert eine spärliche Version von fackel.bmm, die tatsächlich funktioniert, aber wenn ich einen Test versuche, habe ich einen Laufzeitfehler (der nichts mit dieser Implementierung zu tun hat), dass ich verstehe nicht. Ich habe ein paar Themen zum Thema gesehen, konnte aber keine Lösung finden. Hier ist der Code, und der Fehler:Fackel Code CUDA Runtime Error

if __name__ == "__main__": 
    tmp = torch.zeros(1).cuda() 
    batch_csr = BatchCSR() 
    sparse_bmm = SparseBMM() 

    i=torch.LongTensor([[0,5,8], [1,5,8], [2,5,8]]) 
    v=torch.FloatTensor([4,3,8]) 
    s=torch.Size([3,500,500]) 

    indices, values, size = i,v,s 

    a_ = torch.sparse.FloatTensor(indices, values, size).cuda().transpose(2, 1) 
    batch_size, num_nodes, num_faces = a_.size() 

    a = a_.to_dense() 

    for _ in range(10): 
     b = torch.randn(batch_size, num_faces, 16).cuda() 
     torch.cuda.synchronize() 
     time1 = time.time() 
     result = torch.bmm(a, b) 
     torch.cuda.synchronize() 
     time2 = time.time() 
     print("{} CuBlas dense bmm".format(time2 - time1)) 

     torch.cuda.synchronize() 
     time1 = time.time() 
     col_ind, col_ptr = batch_csr(a_.indices(), a_.size()) 
     my_result = sparse_bmm(a_.values(), col_ind, col_ptr, a_.size(), b) 
     torch.cuda.synchronize() 
     time2 = time.time() 
     print("{} My sparse bmm".format(time2 - time1)) 

     print("{} Diff".format((result-my_result).abs().max())) 

Und der Fehler:

Traceback (most recent call last): 
    File "sparse_bmm.py", line 72, in <module> 
    b = torch.randn(3, 500, 16).cuda() 
    File "/home/bizeul/virtual_env/lib/python2.7/site-packages/torch/_utils.py", line 65, in _cuda 
    return new_type(self.size()).copy_(self, async) 
RuntimeError: cuda runtime error (59) : device-side assert triggered at /b/wheel/pytorch-src/torch/lib/THC/generic/THCTensorCopy.c:18 

Wenn mit dem Befehl CUDA_LAUNCH_BLOCKING läuft = 1, erhalte ich die Fehlermeldung:

/b/wheel/pytorch-src/torch/lib/THC/THCTensorIndex.cu:121: void indexAddSmallIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 1, SrcDim = 1, IdxDim = -2]: block: [0,0,0], thread: [0,0,0] Assertion `dstIndex < dstAddDimSize` failed. 
THCudaCheck FAIL file=/b/wheel/pytorch-src/torch/lib/THCS/generic/THCSTensorMath.cu line=292 error=59 : device-side assert triggered 
Traceback (most recent call last): 
    File "sparse_bmm.py", line 69, in <module> 
    a = a_.to_dense() 
RuntimeError: cuda runtime error (59) : device-side assert triggered at /b/wheel/pytorch-src/torch/lib/THCS/generic/THCSTensorMath.cu:292 
+0

ok, also Cuda ist technisch asynchron in der Natur, so dass ausgelöst Fehler Assert kommt nicht mit einem Stack-Trace. Versuchen Sie Ihr Skript wie folgt in Ihrem Terminal läuft: 'CUDA_LAUNCH_BLOCKING = 1 Python your_script.py' und Ihre Frage – entrophy

+0

Dank aktualisieren, herausgegeben ich meinen Beitrag – Gericault

+0

Also, was ist Ihre Frage * genau *? – talonmies

Antwort

1

Die Indizes dass Sie übergeben, um den spärlichen Tensor zu erstellen, sind falsch.

hier ist, wie es sein sollte:

i = torch.LongTensor([[0, 1, 2], [5, 5, 5], [8, 8, 8]])

Wie eine spärliche Tensor erstellen:

Lässt ein einfacheres Beispiel. Können sagen, wir die folgenden Tensor wollen:

0 0 0 2 0 
    0 0 0 0 0 
    0 0 0 0 20 
[torch.cuda.FloatTensor of size 3x5 (GPU 0)] 

Wie Sie sehen können, muss die Nummer (2) in (0, 3) Lage des spärlichen Tensor sein. Und die Nummer (20) muss am (2, 4) Ort sein.

Um dies zu schaffen, sollte sich unseren Index Tensor wie folgt aussehen

[[0 , 2], 
[3 , 4]] 

Und jetzt für den Code, um die oben spärlichen Tensor zu erstellen:

i=torch.LongTensor([[0, 2], [3, 4]]) 
v=torch.FloatTensor([2, 20]) 
s=torch.Size([3, 5]) 
a_ = torch.sparse.FloatTensor(indices, values, size).cuda() 

Weitere Kommentare in Bezug auf die assert Fehler von Cuda:

Assertion 'dstIndex < dstAddDimSize' failed. sagt uns, dass es sehr wahrscheinlich ist, haben Sie einen Index aus bo Unds. Wann immer Sie das bemerken, suchen Sie nach Stellen, an denen Sie einem der Tensoren die falschen Indizes geliefert haben könnten.

+0

EDIT: Mein schlechtes, ich habe es! – Gericault

Verwandte Themen