低CUDA算力显卡用上高版本pytorch(ubuntu18.04源码编译特定版本pytorch(v1.10.0))

2 篇文章 0 订阅
1 篇文章 0 订阅

本文是本人jyzzzzzzz原创,记录了我源码编译特定版本pytorch的大致过程与出现的问题,大量内容为个人情况,不一定适用与其他人。下文中,本人实际作的正确操作将加粗出现的问题使用删除线官方正常情况方法将标黄


一 电脑配置

  • 台式机,配备显卡Tesla K40c(已魔改为Quadro K6000,但不影响源码编译),ubuntu18.04系统,安装cuda10.2,cudnn7.6.5。
  • 存在的问题是我的显卡cuda算力只有3.5,太低,最高只能使用v1.2.0的pytorch,更高版本的不支持,而我有一个项目需要pytorch v1.10.0,在网上找资料后发现可以通过源码编译解决(参考:https://blog.51cto.com/u_15127493/2658622)。

二 正常情况下源码编译步骤

正常情况无报错的话,源码编译过程还是很简单的。
1、Anaconda创建虚拟环境,安装前置必要组件。
2、从github网站上获取添加了第3方库的pytorch源码。
3、配置环境变量,开始编译。
详细参考官方:https://github.com/pytorch/pytorch

三 我的编译过程及出现的问题

首先 安装前置

Anaconda创建虚拟环境,安装前置必要组件,这步没啥问题,步骤如下:
1、 Anaconda创建你自己的虚拟环境,进入。
2、 安装前置组件

conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
		# common
conda install -c pytorch magma-cuda102   # for linux, 对应自己的cuda版本进行修改

然后 获取源码

获取源码并补充第3方库,官方给出了两种方法:
1、直接从github上克隆

git clone --recursive https://github.com/pytorch/pytorch

2、下载源码的发布版本后进入目录然后更新第3方库

cd pytorch
git submodule sync
git submodule update --init --recursive --jobs 0
  • 但我操作发现方法2没用,正常情况下,third_party文件夹下所有空文件夹会填充内容,但我输入代码后没有反应。而使用方法1,克隆下来的源码是发布的最新版v1.12.0,版本不对。
  • 我的做法是使用方法1克隆最新版源码(git指令使用过程中也出现很多错误,但那属于git指令相关内容,我不在此说明了),然后单独下载v1.10.0的发布版本,接着将git clone源码中的第3方库手动复制到v1.10.0源码中,要复制的地方有两处:
    1、将git clone源码中目录下"third_party"文件夹复制到v1.10.0源码目录下,文件夹合并,重复文件跳过。
    2、将git clone源码中"android/libs"路径下的"fbjni"文件夹复制到v1.10.0源码相同位置。
  • 当然,如果你直接想编译最新版源码的话,这步是不需要的,直接使用方法一即可。
  • 我这种做法其实是不规范的,因为两个版本的源码代码有所改变,文件结构也发生了变化,所包含的第3方库在这段时间或许也有更新,通过实际试验,确实出现了问题。
  • v1.10.0与v1.12.0之间,名为fbgemm的第3方库有很大更新,不使用老版的话,编译时会出现一些变量未定义的报错。错误与该网址https://github.com/pytorch/pytorch/issues/43008上所描述的相同
  • 因此在编译前还需修改源码,我的做法是:
    1、 从github上手动下载v1.10.0使用的老版fbgemm。(从v1.10.0子界面点击第3方库的链接地址,可以进入老版本的地址)
    2、将老版fbgemm复制到"third_party"文件夹中相应位置,文件夹合并,重复文件覆盖
    3、分别查找以下4个文件:affine_quantizer_base.cpp、lengths_reducer_fused_8bit_rowwise_ops.h、lengths_reducer_fused_nbit_rowwise_ops.h、lengths_reducer_ops.h(有两个,选operator文件夹下的)。打开,在开头添加
    #define USE_FBGEMM
    

最后 配置编译

是配置环境变量并编译。
从源码目录打开命令行,进入你创建的anaconda虚拟环境,输入

export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}  # 添加CMAKE的路径

配置环境。这一条是添加你虚拟环境的路径,是官方要求必须配置的。
然后输入

python setup.py install

即可开始编译。等待1个多小时,编译完成。

  • 而我在编译过程中还出现了大量nvlink error: undefined reference to … 的报错(仅我个人遇到的情况),查找发现是与nvidia公司的nccl有关(nccl是一个用于多GPU并行计算的东西)。
  • 我的解决方法是,配置环境变量不编译nccl,然后从nvidia官网上自己下载nccl并安装(参考https://blog.csdn.net/gulingfengze/article/details/92384178):
    1、 下载nccl【https://developer.nvidia.com/nccl】,需要注册nvidia账号(如果你已下载过cudnn,那你就已经注册过了,直接登录)。选择对应操作系统与cuda版本的nccl,下载。
    2、 在下载文件的位置打开终端,输入:
sudo dpkg -i nccl-local-repo-ubuntu1804-2.11.4-cuda10.2_1.0-1_amd64.deb  # 安装
sudo apt update                                            # 更新apt
sudo apt install libnccl2=2.11.4-1+cuda10.2 libnccl-dev=2.11.4-1+cuda10.2  # 安装libnccl2
	# 版本号根据自己的nccl版本、cuda版本修改

如果没有报错及安装成功。
3、 在要编译的源码位置重新打开一个终端,进入虚拟环境,重新配置环境变量:

export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}  # 添加CMAKE的路径
export USE_SYSTEM_NCCL=1    # 使用系统本身的nccl

4、 开始编译。等待1个多小时
5、 编译完成后,再输入

python setup.py develop && python -c "import torch"

更新一下。
6、 成功。

在这里插入图片描述

四 总结类比

  • 我测试成功的仅仅是用git clone得到的v1.12.0最新版源码结合v1.10.0发布版本编译pytorch-v1.10.0。但是一方面,有些人可能想要编译其他版本的pytorch(同时和我一样遇到了git submodules update …不管用的情况);另一方面,随着时间的推移,pytorch的最新版可能也会发生改变。我文章的内容肯定不能百分百适用。
  • 不过这篇文章证明了东拼西凑编译特定版本pytorch的可行性,可以在不同情况下进行类比,作为参考。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值