当你搜到这篇文章的时候,我就知道被折磨的不止我一个人。
注意:
如果需要编译GPU版本的Pytorch,需要配置Cuda。
本次编译环境是linux Ubuntu22.04,windows和mac编译主要流程是一样的,可以看官网的流程。https://github.com/pytorch/pytorch?tab=readme-ov-file#from-source
本次编译是在docker上实现的,使用的是Build and Develop PyTorch - Lei Mao's Log Book作者提供的Dockerfile,因为这个配置好了cuda环境和Cmake,以及build pytorch所需要的依赖包。
注意,该版本的cuda镜像是
nvcr.io/nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04
请确保你的GPU是否支持这个版本。
请确保你的环境支持Docker。
第一步:创建Dockerfile
在你的工作目录下,新建一个torch-build.Dockerfile文件,torch-build名字可以随便取,保证Dockerfile后缀名正确。然后将下面的内容写入torch-build.Dockerfile文件,然后到第二步。
-
FROM nvcr.io/nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04
-
ARG CMAKE_VERSION=3.28.3
-
ARG NUM_JOBS=8
-
ENV DEBIAN_FRONTEND noninteractive
-
# Install package dependencies
-
RUN apt-get update && \
-
apt-get install -y --no-install-recommends \
-
build-essential \
-
software-properties-common \
-
autoconf \
-
automake \
-
libtool \
-
libssl-dev \
-
pkg-config \
-
ca-certificates \
-
wget \
-
git \
-
curl \
-
libjpeg-dev \
-
libpng-dev \
-
language-pack-en \
-
locales \
-
locales-all \
-
python3 \
-
python3-py \
-
python3-dev \
-
python3-pip \
-
python3-numpy \
-
python3-pytest \
-
python3-setuptools \
-
libprotobuf-dev \
-
protobuf-compiler \
-
zlib1g-dev \
-
swig \
-
vim \
-
gdb \
-
valgrind && \
-
apt-get clean
-
RUN cd /usr/local/bin && \
-
ln -s /usr/bin/python3 python && \
-
ln -s /usr/bin/pip3 pip && \
-
pip install --upgrade pip setuptools wheel
-
# System locale
-
# Important for UTF-8
-
ENV LC_ALL en_US.UTF-8
-
ENV LANG en_US.UTF-8
-
ENV LANGUAGE en_US.UTF-8
-
# Install CMake
-
RUN cd /tmp && \
-
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}.tar.gz && \
-
tar xzf cmake-${CMAKE_VERSION}.tar.gz && \
-
cd cmake-${CMAKE_VERSION} && \
-
./bootstrap && \
-
make -j${NUM_JOBS} && \
-
make install && \
-
rm -rf /tmp/*
-
RUN cd /tmp && \
-
wget https://raw.githubusercontent.com/pytorch/pytorch/master/requirements.txt && \
-
pip install -r requirements.txt
-
RUN pip install lintrunner
第二步:根据Dockerfile创建docker镜像
使用的Cmake是3.25.1,你可以指定你想要的版本。
执行下面两条命令,开始创建docker镜像。
-
CMAKE_VERSION=3.25.1
-
docker build -f torch-build.Dockerfile --build-arg CMAKE_VERSION=${CMAKE_VERSION} --tag=torch-build:0.0.1 .
第一步和第二步比较耗时,请注意其中是否有报错,如果有报错建议删除重来,期间需要良好的网络,可以考虑给Ubuntu换源。
Ubuntu换源参考连接:https://www.cnblogs.com/dier-gaohe/p/17379705.html
第三步:下载Pytorch的源码
第三步,我们需要下载Pytorch的源码,这一步非常重要,我编译失败了好几次,发现Pytorch的源码下载是影响整个流程的。
在你的工作目录下面,创建一个空文件夹。
通过下面的命令下载Pytorch以及所需要的第三方插件,但这个过程会反复失败,问题就是github是境外的原因,即使挂了梯子,依然会反复失败,只能看运气下载成功,因为所有文件大小差不多1~2G,所以全看你的网络情况。
git clone --recursive https://github.com/pytorch/pytorch
解决方法有很多,可以参考下面,主要是保证Pytorch的主体代码下载下来就行了。关于子模块也就是pytorch/third_party的内容可以后续再下载。
【Pytorch下载】两行代码从源头上快速解决github clone速度慢问题(包括子模块--recursive)-CSDN博客
或者,一直重复上面的下载命令,多试几次,没准就成功了。
第四步:创建Docker容器
在你的工作目录下,执行这条命令。因为我们是将pytorch源代码挂载到docker容器里面,所以你应该在上一级目录执行。
docker run -it --gpus all -v $(pwd):/mnt torch-build:0.0.1
执行成功后,会直接进入到docker容器里面,并看到cuda版本信息输出。
接下来就是配置Conda,官方推荐使用Conda,而我反复折腾了几次,发现确实使用Conda好用。
所以按照下面的链接,安装Conda
Ubuntu 22.04上安装Anaconda,及 conda 的基础使用_ubuntu22安装conda-CSDN博客
第五步:安装依赖包
安装好Conda后,建议创建一个虚拟环境,并进入这个环境
-
conda create -n torch_build
-
conda activate torch_build
进入torch_build后,需要安装一些官网推荐的依赖包,我这里是linux安装,其它系统不一样,请参考官方文件。
请进入pytorch文件夹下面,执行以下命令
-
git submodule sync
-
git submodule update --init --recursive
-
conda install cmake ninja
-
pip install -r requirements.txt
-
conda install intel::mkl-static intel::mkl-include
-
conda install -c pytorch magma-cuda*
这几步命令要求安装过程中,没有报错或者中断,不然可能影响后面的编译。如果出现了报错或者中断,建议重新创建虚拟环境,重新执行。
然后执行下面的代码,这两步主要是检测之前下载pytorch源码的文件是否完备。特别是子模块。
但是这里有一个坑点:就是由于网络原因,导致只下载了一个空文件夹,但是这两条命令也能检查通过,到最后编译源码的时候,又会提示你找不到子模块的代码。比如提示你pytorch/third_party/foxi有问题。那么你就需要进入这个文件夹 删除foxi文件夹。然后重新执行下面的两条命令。 这个过程可能重复多次,取决于你前面下载pytorch时的网络质量。
-
git submodule sync
-
git submodule update --init --recursive
第六步:开始编译PyTorch
执行这条命令。注意,你应该还是在pytorch源代码这个路径下面。
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
然后执行,其中MAX_JOBS是并行编译,如果你机器性能不好,建议设置为1,不然可能编译到最后的时候,容易爆内存,然后重新来过.....我的环境是16G内存,CPU是13th Gen Intel(R) Core(TM) i9-13900H,基本上设置MAX_JOBS=4差不多能把内存占满。
MAX_JOBS=4 USE_DISTRIBUTED=0 python setup.py develop
python setup.py develop 前面还可以跟很多参数,取决你的编译需要,比如你要Debug,测试等,可能就需要执行下面,到底需要参数,你可以查看setup.py,有详细解释。默认就上面的就行了。
MAX_JOBS=4 DEBUG=1 USE_DISTRIBUTED=0 USE_CPP_CODE_COVERAGE=1 BUILD_TEST=1 CMAKE_BUILD_TYPE=Debug python setup.py develop
坑点: python setup.py develop和前面的参数应该是作为同一行输入执行。不能分开执行。
最后编译成功后,测试。
运气好的应该一遍就能编译好,但一般都是不可能的,所以下面记录了我遇到的各种坑:
-
python setup.py clean
-
# 只要编译失败了,请执行这条语句,然后解决问题后,重新执行编译命令
-
[7190/8720] Building CXX object
-
caffe2/CMakeFiles/torch_cpu.dir/__/torch/csrc/autograd/generated/VariableType_0.cpp.o FAILED:
-
caffe2/CMakeFiles/torch_cpu.dir/__/torch/csrc/autograd/generated/VariableType_0.cpp.o
-
# 原因:爆内存了,需要设置MAX_JOBS更小
-
No module named ‘yaml‘ 以及其它包
-
# 解决方法,正常安装就行了,比如conda install yaml
-
libstdc++.so.6: version ‘GLIBCXX_3.4.30‘ not found
-
# 解决方法
-
https://blog.csdn.net/qq_39206732/article/details/135560935?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-135560935-blog-129650003.235%5Ev43%5Epc_blog_bottom_relevance_base9&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-135560935-blog-129650003.235%5Ev43%5Epc_blog_bottom_relevance_base9
2024 最新PyTorch源码编译流程和踩坑记录,PyTorch build from source_编译pytorch-CSDN博客