macOS 10.13 安装带CUDA支持的PyTorch
现在已经是2023年,macOS已经来到了Sonoma (14),相比之下High Sierra(10.13)已经算是很老的版本了,一些软件的最新版也已经不支持了,不过又不是不能用:) 。本文仅记录折腾过程,并不推荐在生产或开发环境中这样做,毕竟有更好的选择。
环境
OS: MacOS 10.13.6 (17G14042)
GPU: Pascal及往下的显卡,主要是10X0(Ti)及以下和Tesla P100、Titan X、Titan XP等
准备
安装CUDA
根据PyTorch的GitHub上的信息,PyTorch1.9及以前的版本需要的CUDA版本是9.2及以上,1.10到1.13需要的CUDA版本是10.2及以上。而macOS的CUDA版本最高是到10.2,因此理论上可以安装的最高版本是1.13。但是实际测试的结果是1.10及以上版本编译到一半会报错,需要修改源码。
安装CUDA之前需要安装Nvidia驱动和CUDA驱动
Nvidia驱动:https://images.nvidia.com/mac/pkg/387/WebDriver-387.10.10.10.40.140.pkg
CUDA驱动:https://us.download.nvidia.com/Mac/cuda_418/cudadriver_418.163_macos.dmg
然后选择CUDA版本:
10.1:https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_mac.dmg
10.2:https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_mac.dmg
注:CUDA10.2在编译PyTorch时会产生一个依赖库丢失的错误,原因是有一个库(libnvToolsExt.dylib)在10.1中有而在10.2中却没有。如果不需要安装PyTorch1.9以上的版本则建议安装CUDA 10.1。
如需要安装CUDA10.2,则解决方法如下:
下载CUDA10.1和CUDA10.2,安装CUDA 10.2
打开CUDA10.1的dmg文件,CUDAMacOSXInstaller.app右键选择显示包内容,进入Contents/Resources/payload,将 cuda_mac_installer_tk.tar.gz 拷贝出来
解压 cuda_mac_installer_tk.tar.gz,进入 cuda_mac_installer_tk/Developer/NVIDIA/CUDA-10.1/lib/目录,将 libnvToolsExt.dylib 和 libnvToolsExt.1.dylib 拷贝到 /usr/local/cuda/lib,命令为
tar zxf cuda_mac_installer_tk.tar.gz
sudo cp cuda_mac_installer_tk/Developer/NVIDIA/CUDA-10.1/lib/libnvToolsExt* /usr/local/cuda/lib
最后下载CuDNN:https://developer.download.nvidia.com/compute/redist/cudnn/v7.6.5/cudnn-10.1-osx-x64-v7.6.5.32.tgz
解压
tar zxf cudnn-10.1-osx-x64-v7.6.5.32.tgz
将文件拷贝到CUDA安装目录
sudo mv cuda/lib/libcudnn* /usr/local/cuda/lib
sudo mv cuda/include/cudnn.h /usr/local/cuda/include
然后配置相关环境变量,编辑 ~/.bash_profile
vim ~/.bash_profile
写入
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export DYLD_LIBRARY_PATH=$CUDA_HOME/lib:$DYLD_LIBRARY_PATH
保存退出,并使其生效
source ~/.bash_profile
最后测试CUDA是否正确安装
cd /usr/local/cuda/samples
sudo make -C 1_Utilities/deviceQuery
./1_Utilities/deviceQuery/deviceQuery
如果看到最后 Result = PASS 则说明CUDA已经正确安装和配置
安装Python
由于MacOS自带的Python是2.7,因此需要先安装Python3。使用pyenv来安装Python,以便更好地管理Python版本和软件包。pyenv使用Homebrew来安装,因此首先安装Homebrew。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安装pyenv
brew install pyenv
接着安装Python的依赖包
brew install openssl readline sqlite3 xz zlib gdbm mpdecimal
查看可以安装的Python版本
pyenv install --list
选择需要安装的版本进行安装,这里安装3.9.18,如果需要安装多个版本依次安装即可
pyenv install 3.9.18
将安装好的Python设为默认
pyenv global 3.9.18
要让我们的设置生效,需要在bash_profile中写入配置命令,打开bash_profile
vim ~/.bash_profile
写入:
# Pyenv initialization
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
保存退出,然后
source ~/.bash_profile
执行
python -V
输出:
$ python -V
Python 3.9.18
至此Python安装完毕
安装Python依赖库
pip install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
编译
PyTorch
首先下载PyTorch源码
git clone https://github.com/pytorch/pytorch
cd pytorch
选择需要安装的版本,如1.9
git checkout release/1.9
git submodule sync
git submodule update --init --recursive
强迫症患者制定版本号
export PYTORCH_BUILD_VERSION=1.9.1
export PYTORCH_BUILD_NUMBER=1
开始编译
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py build
然后就是漫长的等待,中间没有报错的话就是编译成功
最后安装
python setup.py install
TorchVision
如果需要使用torch vision库,则还需要编译torchvision。同样地,先下载和PyTorch对应版本的Vision库,一般是PyTorch 1.x 对应 torch vision 0.x+1,如 torch 1.9 对应 torchvision 0.10,具体可查看官方仓库结束
git clone https://github.com/pytorch/vision
cd vision
git checkout release/0.10
最后就是编译和安装
export BUILD_VERSION=0.10.1
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install
TorchText
git clone https://github.com/pytorch/text
cd text
git checkout release/0.10
export BUILD_VERSION=0.10.1
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install
测试
在运行YOLO代码进行测试的时候发现运行会报错: “RuntimeError: Error in dlopen: dlopen(libcuda.so.1, 6): image not found”,提示找不到库文件 libcuda.so.1。这明显是Linux里面的动态库命名格式,而macOS的动态库文件名字都是 xxx.dylib,所以解决方法也很简单,创建一个叫 libcuda.so.1的软链接即可。
sudo ln -s /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.so.1
补充
在Linux和Windows里面我们可以用 nvidia-smi 命令来查看GPU的使用情况,而macOS并没有,但是GitHub上有一个类似的工具 cuda-smi。不过它只能查看显存占用情况,安装方法也很简单,下载源码编译就行了。
git clone https://github.com/al42and/cuda-smi
cd cuda-smi
make
最后,如果不想编译或者需要更新的PyTorch或者TensorFlow,可以到TomHeaven的GitHub https://github.com/TomHeaven