linux找cuda安装位置_安装pykeops中遇到的坑

3ae357a30e714130e7822c21aa32d5a0.png

安装pykeops遇到了很多很多坑,对于官网的要求,我的建议是,即使是(optional)也必须遵守,因为他们之所以写上,是因为很多时候他们只在那些环境里测试过(不要问我是怎么发现的TAT)。。。。

我的配置:

ubuntu:16.04

gcc:7.4.0

CUDA:10.1

cmake:3.14.5

pytorch:1.3.1

这个配置可以避开大部分的坑。

  • 首先安装gcc,推荐这两个教程:

https://www.jianshu.com/p/5da82ffc60ca

https://blog.csdn.net/davidhopper/article/details/79681695

在gcc的编译安装过程中,有一步是./contrib/download_prerequisites,但是脚本中提供的下载地址是无效的,可以到https://gcc.gnu.org/mirrors.html找一个镜像下载,我选的是俄罗斯的镜像,所以将文件中的

base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/'

替换为

base_url='http://mirror.linux-ia64.org/gnu/gcc/infrastructure/'

然后就可以执行./contrib/download_prerequisites了

接下来的安装按教程即可

  • 然后安装cuda,安装cuda时需要注意的就是要和驱动版本相相匹配,可以参考这张表:

84a779148043c07669bae4d9c32924cd.png
cuda版本的驱动要求
  • cmake安装:这个按照网上的教程安装,需要的就只是耐心了~,需要注意的是,cmake必须在3.10以上才行
  • 最后就是安装pytorch了。

照理来说,用conda安装就好了,而由于官方下载太慢,我们常常是通过镜像下载。但是二者还是有一点小小的区别的,官方版pytorch编译时-D_GLIBCXX_USE_CXX11_ABI=False,而镜像版编译时则有-D_GLIBCXX_USE_CXX11_ABI=True,之后安装的库需要和pytorch保持一致,而pykeops官方默认我们都是从官方下载的,所以在CMakeList中就将-D_GLIBCXX_USE_CXX11_ABI强制设置为False了。这个问题会导致,我们在使用pykeops的时候,会遇到以下的问题(测试方法见文末):

ImportError: /root/.cache/pykeops-1.3-cpython-36/libKeOpstorch12f19fdb2e.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c105ErrorC1ENS_14SourceLocationERKSs

所以如果pytorch不是从官方下载的,我们就需要先把pykeops的包下载下来,然后修改CMakeList,最后再安装。我的具体操作是这样的:

首先下载包:

wget https://files.pythonhosted.org/packages/48/72/d1576e0841b1fa6dd65de4ef203362e5eb7748215005ace2975e12ac2679/pykeops-1.3.tar.gz

这个链接是哪来的呢,当我们输入pip install pykeops之后,就可以得到

Downloading https://files.pythonhosted.org/packages/48/72/d1576e0841b1fa6dd65de4ef203362e5eb7748215005ace2975e12ac2679/pykeops-1.3.tar.gz (301kB)

我们要的链接就在Download的后面啦。

然后解压 tar xzvf pykeosp-1.3.tar.gz
进入pykeops-1.3/pykeops,找到CMakeList.txt,大约在42行的位置,可以找到罪魁祸首:add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

删掉就好了,之后回到pykeops-1.3,并为了避免安装过程中的失误,将这个解压文件再次打包,用pip安装:

python setup.py bdist_wheel
pip install (生成的.whl文件的名称)

然后我们再来测试一下:

import pykeops
pykeops.clean_pykeops() # just in case old build files are still present
pykeops.test_numpy_bindings() # perform the compilation
pykeops.test_torch_bindings()    # perform the compilation
import torch
x = torch.randn(1000000, 3, requires_grad=True).cuda()
y = torch.randn(2000000, 3).cuda()
from pykeops.torch import LazyTensor
x_i = LazyTensor( x[:,None,:] ) # x_i.shape = (1e6, 1, 3)
y_j = LazyTensor( y[None,:,:] ) # y_j.shape = ( 1, 2e6,3)
D_ij = ((x_i - y_j)**2).sum(dim=2) # Symbolic (1e6,2e6,1) matrix of squared distances
K_ij = (- D_ij).exp() # Symbolic (1e6,2e6,1) Gaussian kernel matrix
a_i = K_ij.sum(dim=1)  # Genuine torch.cuda.FloatTensor, a_i.shape = (1e6, 1),
g_x = torch.autograd.grad((a_i ** 2).sum(), [x])  # KeOps supports autograd!

如果都没有问题,就说明pykeops安装成功了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值