jh0shin / Graph-Neural-Network

2021-2학기 소프트웨어 종합설계 프로젝트입니다.
0 stars 0 forks source link

3회차 연구지도 (9/29) #4

Open jh0shin opened 3 years ago

jh0shin commented 3 years ago

교수님 일정으로 인하여 조교님과 미팅이 진행되었습니다.

진행사항

  1. 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을 진행하며 유의미한 경향성을 찾고 그 원인을 분석

jh0shin commented 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)
jh0shin commented 3 years ago

ogbn-products의 CUDA out of memory는 subgraph로 나누어 training을 실행하는 방법을 사용하여 해결 (출처)