Open jh0shin opened 3 years ago
중간 크기의 dataset인 ogbn-products
에 대해 실행시 CUDA out of memory 발생
$ python3 profile.py --platform pyg --dataset ogbn-products
Using backend: pytorch
Traceback (most recent call last):
File "profile.py", line 60, in <module>
pyg_train(model, optimizer, data, train_idx)
File "/home/junho/GNN/profile/gcn.py", line 95, in pyg_train
out = model(data.x, data.adj_t)[train_idx]
File "/home/junho/.local/lib/python3.8/site-packages/torch/nn/modules/module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/junho/GNN/profile/gcn.py", line 74, in forward
x1 = F.relu(self.layer1(x, adj_t))
File "/home/junho/.local/lib/python3.8/site-packages/torch/nn/modules/module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/junho/.local/lib/python3.8/site-packages/torch_geometric/nn/conv/gcn_conv.py", line 171, in forward
edge_index = gcn_norm( # yapf: disable
File "/home/junho/.local/lib/python3.8/site-packages/torch_geometric/nn/conv/gcn_conv.py", line 40, in gcn_norm
adj_t = fill_diag(adj_t, fill_value)
File "/home/junho/.local/lib/python3.8/site-packages/torch_sparse/diag.py", line 91, in fill_diag
return set_diag(src, value.new_full(sizes, fill_value), k)
File "/home/junho/.local/lib/python3.8/site-packages/torch_sparse/diag.py", line 37, in set_diag
src = remove_diag(src, k=k)
File "/home/junho/.local/lib/python3.8/site-packages/torch_sparse/diag.py", line 15, in remove_diag
value = value[inv_mask]
RuntimeError: CUDA out of memory. Tried to allocate 472.00 MiB (GPU 0; 8.00 GiB total capacity; 6.14 GiB already allocated; 0 bytes free; 6.16 GiB reserved in total by PyTorch)
교수님 일정으로 인하여 조교님과 미팅이 진행되었습니다.
진행사항
DGL과 PyG에서 spmv 커널이 어떻게 작동하는지를 이론적으로 분석
Semi-Supervised Classification with Graph Convolutional Networks
논문과 DGL, PyG 코드 주석을 바탕으로 각 라이브러리에서의 spmm이 어떻게 작동하는지 확인해보았습니다. DGL의 경우 SpMMCsr 내부에서 cusparse::CusparseCsrmm2가 적용 가능하다면 적용하고, 그렇지 않다면 cuda::SpMMCsr을 호출하는 것을 확인할 수 있습니다. 또한 cusparseCsrmm2 내부의 주석에 따르면, cusparse가 column-major만을 지원하고 DGL 내부에서는 row-major로 저장이 되기 때문에 두 번의 transpose 과정이 진행됩니다. PyG의 경우 GCNConv class가 MessagePassing class를 상속하게 되는데, message passing의 경우 모든 edge에 대하여 명시적으로 message를 만든 후 reducing을 진행하게 됩니다. 이러한 점은 user-defined operation에 대하여 flexibility를 부여하지만, 그만큼의 성능 저하가 발생되게 됩니다.피드백
앞으로의 과제
다양한 크기의 dataset에 대하여 profiling을 진행하며 유의미한 경향성을 찾고 그 원인을 분석