虽然pytorch官方有一个mac下的编译指南,但是还是不是很详细,一路过来我也遇到了许多问题。
网上虽然有一些mac 下pytorch-gpu版,但是别人编译的有的时候和自己机器不是很兼容。所以需要自己来编译一下。
因为我正好需要用gpu版的pytorch 0.3版,python 2.7,但是在网上找了半天都没找到,所以只能自己动手了。
如果不需要gpu版的小伙伴安装pytorch那是非常简单的,可以看一下我写的这个教程mac下安装pytorch,几条命令就ok。
1. Conda安装python环境
假设已经安装好了anconda,这里我需要的是python2.7,所以直接conda一个环境就可以了。
conda create -n pytorch_gpu_0.3 python=2.7
环境创建好之后,激活一下环境,在这个环境下进行操作。
source activate pytorch_gpu_0.3
2. 下载pytorch源码
是需要下载自己需要版本的pytorch源码,这里我需要的是0.3版的,所以把0.3版的clone下来。
git clone --branch v0.3.1 https://github.com/pytorch/pytorch.git
然后进入到文件夹里,
cd <你自己的目录>/pytorch
最开始clone的时候,submodule的内容并不会自动下载下来,如果不下载下来子模块的文件的话,会缺少相应的文件。
此时,只需执行如下命令:
git submodule update --init
然后稍微等一会就下完了。
3. 检查Clang版本
我的Clang版本是9.0,但是当前的CUDA与Clang版本中的CommandLineTools不兼容。我们需要使用XCODE 8.2的CommandLineTools。通过这条命令查看clang版本
clang --version
要是和上面这个图显示的不一样的话,那么就需要下载了。
步骤如下:
- 登录 https://developer.apple.com/downloads/
- 下载Xcode CLT (Command Line Tools) 8.2 (不方便下载的同学,我下好了传到了百度云上,需要自取 https://pan.baidu.com/s/1troDTmqM8X_ibV0a7h7nNA 密码: ucmd)
- 安装 CLT
- 执行
sudo xcode-select --switch /Library/Developer/CommandLineTools
- 再次输入命令行查看clang版本,按理说现在应该就是对的了
4. 编译Pytorch
然后开始编译GPU版的pytorch,这里我假设你的CUDA之类的已经都安装好了。
还有一个需要注意的是,需要安装一下依赖包:
conda install numpy pyyaml mkl mkl-include setuptools cmake cffi typing
然后直接运行下面这些命令,
export CMAKE_PREFIX_PATH=<换成你的anconda根目录 >,下面的命令是我的,那个CUDNN的目录可能你也需要根据你自己的进行调整。
export CMAKE_PREFIX_PATH=/Users/ray/anaconda2
CUDNN_LIB_DIR="/Developer/cudnn/lib/"
CUDNN_INCLUDE_DIR="/Developer/cudnn/include/"
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install
然后等啊等啊等,编译的时候cpu应该占用率差不多要100%了,在我的电脑上面大概是花了1个小时的样子。
安装完成之后,然后就赶紧来测试一下吧。这里有一个坑
熟练地python,import torch
,然后就会报错,差不多都这种的
ModuleNotFoundError: No module named 'torch._C'
查了下pytorch repo的issues,果然很多人遇到
作者淡定说,不要在pytorch项目根目录下导入torch,非常的神奇!!!所以cd ..一下在import torch,一般就可以了
需要注意的是,使用源码安装 pytorch
的时候,是没有安装 torchvision
的。所以也需要使用
pip install torchvision
,或者从源码安装。
5. 打包生成whl
cd 到pytorch项目中,然后和安装的时候差不多的,
MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py bdist_wheel
不过目前我生成的不好用,不知道为什么