PyTorch implement Color-GCN中的挫折
Dropout & Long
用Pytorch Implement GCN的时候,有一个error卡了我一天,google也没相关的答案:
1 | fused_dropout not implemented for 'long' |
自己找了会才发现不是dropout这个value的问题,而是input feature是 long
。。。原来torch.Tensor([integer])会默认给int64(Long)而不是int32.。。真是奇怪的feature呢。
Cuda device
1 | RuntimeError: Expected object of device type cuda but got device type cpu for argument #2 'mat2' in call to _th_mm |
data,features,model全部都cuda()了,结果还是有问题。一个小时后的思索后。本侦探再次破案:
model.cuda() 这个func应该是把所有model中的Tensor 调用一遍 cuda(),大概伪代码就是:
1 | for Var in model: |
但是问题在于!
如果Var不是Tensor 而是一个list(别问为啥会是list,菜鸡最喜欢的就是list)
那么Var.cuda()就失效了,这样就需要在initilize的时候就遍历list里面所有的tensor,并调用tensor.to(‘device’)
Floating point exception (core dumped)
1 | Floating point exception (core dumped) |
网上查了下 这个就是某一步计算分母为0的error。
但是蛋疼的是 没有指示哪一行有错。而且python(或者说dgl还是pytorch)有个蛋疼的feature是这个exception在还没来得及print的时候就会直接跳出程序。(也就是说还不能用简单的print来定位)
最后用IPython embed()很蠢的一步一步。。发现问题是 如果dgl.Graph没有边(G.number_of_edges == 0),那么dgl自己的GATConv (Graph Attention Convolution会有问题),因此加了个dirty code判断这个情况,如果属实就直接生成一个zero vector(其实按道理应该是一个input feature itself,但是在这个work里面(graph color)反正没有边的图就没有利用价值,所以直接变成0)
DGL: Trying to create tensor with negative dimension
一步一步抽丝剥茧发现:
当pytorch的unique函数为gpu版本时,最后结果居然是一个dim=-251的vec(但问题在哪并不知道)。
奇怪的是单独写一个py文件用gpu调用这个函数并没有问题,同样的input同样的设备只有放到这个project里面才会return负数dim的vec。
暂时解决方法,将调用这个函数的func(in /dgl/core.py)改到cpu上:
1 | unique_val = F.asnumpy(F.unique(sorted_val)) |