深度linux编译GPU版本Pytorch

编译Pytorch

  • 摘要
  • 简介(吐槽)
  • 环境
  • 获取源码
  • 编译
  • 测试

摘要

本文记录了在deepin Linux环境下为旧显卡(GTX650)编译GPU版pytorch过程,期间出现过许多令人崩溃的情况。本文主要讲述了源代码的获取和编译时的情况,旨在给大家提供一点参考。

简介(吐槽)

目前Pytorch要求的显卡计算能力越来越强,1.4版本的最低计算能力已经达到了3.5。现成的gpu版本pytorch在我目前的计算机上都无法运行了(1.4,1.3……),都建议从源码自行编译。以为按照pytorch github的操作指示输入几行代码就搞定了,还是太naive了!下面罗列下我遇到的令人崩溃的情况:

  1. 获取源码困难,崩溃!
  2. 获取了一份问题源码,cmake有27000多个编译任务,编译25多个小时(i7 950);编译中断后无法继续;编译快完成的时候,链接占满内存(10G内存),失败!崩溃!
  3. 使用预编译的gpu版本pytorch,只用0.3.0版本的支持旧显卡(gtx650),但是很多语法已经改变,许多功能也没有。崩溃!

令人崩溃的根本原因就是正确源码无法下载。
下面即为将本次编译的过程记录。

环境

安装显卡驱动和cuda网上有很多成熟的教程了,这里不赘述了。本次编译的环境为:

  1. 操作系统:deepin Linux
  2. Python版本:Python 3.7.6
  3. 显卡:GTX650
  4. CUDA版本:10.2
  5. 显卡驱动:440.33.01
  6. cmake版本:3.14.0

获取源码

Pytorch项目github主页中获取源码的指令为

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync

很遗憾,在国内下载会遇到速度非常慢大文件过早的文件结束符问题。第二个问题有修改下载缓存大小的方法,但尝试无效;第一个问题修改hosts地址,也无效。最终这两个问题通过gitee解决了。
没想到的是,Pytorch还依赖许多体积大的三方库,同步子模块的时候又出现同样的两个问题。
最终的解决办法是:

  1. 克隆完pytorch项目后,先同步尽量多的子模块,执行:

    git submodule update --init --recursive

  2. 把1中同步出错的项目记录下来,打开pytorch目录.git/config文件,把相应的项目同步到gitee中,修改为gitee的下载地址,重新执行1。[也可以手动到每个目录下git clone gitee地址。]

fbgemm库也依赖三个三方库,在pytorch/third_party/fbgemm/目录中,同样可以修改该目录下的.git/config三方库的url实现同步。

解决办法的核心思路就是github上无法同步的项目均导入gitee中进行同步。gitee需要注册,还是谢谢gitee。但为避免广告嫌疑,除了gitee,还可以借助https://githubd.com/#/下载文件到相应的目录,但是git 无法同步。

编译

使用如下命令进行编译:

python setup install 

如果需要定制化,可以添加如下的编译参数:

  • export MAX_JOBS=8 #开辟8个线程
  • export USE_FBGEMM=0 #禁用FBGEMM(Facebook GEneral Matrix Multiplication),一种用于服务器端推理的低精度,高性能矩阵 - 乘法和卷积库。
  • export USE_NUMPY=0
  • export BUILD_TEST=0
  • export BUILD_CAFFE2_OPS=0
  • export USE_NNPACK=0
  • export USE_QNNPACK=0
  • export USE_DISTRIBUTED=0 #不需要分布式训练
  • export USE_OPENMP=0
  • export USE_MKLDNN=0

以上参数cmake进度条显示大概有2900多个编译任务,编译过程耗时大概1个小时多(i7 950&10G内存),给大家参考参考。如果出现编译进度的总任务差得非常多,可能存在问题了。

测试

ipython
import torch
torch.__version__
#torch.cuda.is_available()还不能充分证明你能使用cuda
torch.randn(4,4,4).cuda().mean()

虽然还是会提醒计算力低的警告,但不影响使用,至此就算完成编译了。

你可能感兴趣的:(pytorch,深度学习)