写在前面:
截止2022年4月,Pytorch 仍没有办法调用 M1 的 GPU,所以在 M1 Mac 上使用 ML-Agents 是极其低效的。
再算上其他兼容性问题,除了迫不得已、或者只是拿 Mac 写个脚本并不计算,其他非常非常非常不推荐在M1上使用ML-Agents。
本次使用到的设备、依赖如下:
设备 | 版本 |
Macbook Air M1 2020 | 8GB内存、256G存储 |
MacOS Monterey | 12.3.1 |
ML-Agents-Main | Release 19, v0.28.0 |
HomeBrew | 3.4.9 |
Miniconda | 4.11.0 |
Python | 3.8.13 |
HDF5 | 1.12.2 |
H5PY | 3.6.0 |
Grpcio | 1.23.0 |
Cygrpc | 1.0.4.post6 |
Pytorch | 1.9.0-cp38-arm64 |
Tensorboard | 2.0.0 |
这是我目前能跑的环境,并不代表其他环境不能安装,仅供参考。为什么选择这些版本会在后续进行解释。
正式安装
下载 ML-Agents
首先直接从ML-Agents主仓下载完整的 Release:
完成之后解压,请将该文件放到易于管理的地方。不要直接放在Download
文件夹下,因为后续的依赖会直接安装到ml-agents-main
内。
这里是我的安装路径:
/Users/cotte/CondaDependencies/ml-agents-main
安装 HomeBrew
参考ineo6的文章,安装 HomeBrew。在这里注意,在 Intel 芯片的 Mac 上 HomeBrew 的默认安装位置是/usr/local
,但 M1 芯片上 HomeBrew 的位置则变成了/opt/homebrew
,如果不对环境变量进行修改会导致后续pip
安装找不到对应的 Homebrew 软件包。
修改环境变量有两种方式:
- 直接在控制台使用
export
指令。这样的做法仅限于本次登录,即你所打开的这个控制台窗口。当你关掉该控制台时,环境变量就又复原了。因为后续 HomeBrew 会在很多地方用到,所以不推荐使用这个方法。 - 修改对应的
profile
文件。这里请仔细阅读上文提到的文章,以下仅列出我使用到的指令:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
使用后可利用vim ~/.zprofile
指令查看环境变量是否已经正确写入。
安装 Miniconda 并创建虚拟环境
参考烟缈睿晨的文章安装 Miniconda。成功后重启终端,你应该能看到前面有(base)
字样,表示你的 Miniconda 已经可以正常使用了。
创建虚拟环境便于我们管理不同 Python 版本下不同的依赖库,虚拟环境之间的依赖互不干扰。一般来说对于每个单独的项目都应该创建一个单独的虚拟环境,这一点就可以通过 Miniconda 来实现。
使用以下指令创建虚拟环境:
conda create -n test python=3.8
-n
是--name
的缩写,test
就是环境名称;后面的就是虚拟环境的Python版本。使用以下指令激活你的虚拟环境:
conda activate test
你会看到(base)
字样变为了(test)
字样,表示你已经进入了test
虚拟环境。请保持该虚拟环境在安装完成前处于开启状态,如果关闭了也没关系,重新打开终端输入上述指令同样可以回到test
虚拟环境。
注:可以使用clear
指令清空终端的所有显示
安装Pytorch
请确保你当前的虚拟环境是test
下。
这里来到第一个比较棘手的问题。查阅 ML-Agents 的官方文档,你会发现他给出的 Pytorch 安装方法是以下指令:
pip3 install torch~=1.7.1 -f https://download.pytorch.org/whl/torch_stable.html
即官方希望用户以1.7.1版本左右的 Pytorch 环境运行 ML-Agents,但倘若你直接在终端这样操作会得到以下错误:
Looking in links: https://download.pytorch.org/whl/torch_stable.html
ERROR: Could not find a version that satisfies the requirement torch~=1.7.1 (from versions: 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.10.2, 1.11.0)
ERROR: No matching distribution found for torch~=1.7.1
大概意思就是pip
只能找到 1.8.1 以上的版本,根本没办法满足用户 1.7.1 版本的需求。我们打开之前指令-f
后跟的 Pytorch 下载网址,会看到一列表的 torch、torchaudio、torchvision 文件。
我们找到 1.7.1 版本对应的 torch 文件,会发现不存在含有arm64
字样的文件,只有x86
、amd64
等字样。这意味着 1.7.1 版本 torch 没有发布基于 ARM64 架构的二进制文件,想要满足 Unity 官方的需求我们只能拿源文件自己进行编译,这实在过于麻烦了。
那我们使用更高版本的 torch 又如何呢?比如 1.8.0 或者 1.8.1?其实他们均不可以,以下是错误演示。
我们找到 1.8.0 的文件为:
cpu/torch-1.8.0-cp38-none-macosx_11_1_arm64.whl
根据这篇“Pytorch文件命名规则”我们知道,这个版本的 torch 运行在 ARM64 架构 MacOS 11.1 的 Python 3.8 环境下,并通过 CPU 进行计算。下载该文件,并使用下面的指令进行安装:
pip install /Users/cotte/Downloads/torch-1.8.0-cp38-none-macosx_11_1_arm64.whl
注:直接将文件、文件夹拖入终端即可得到其绝对路径
你会得到以下错误:
ERROR: torch-1.8.0-cp38-none-macosx_11_1_arm64.whl is not a supported wheel on this platform.
pip
告诉你当前平台上并不支持安装这个文件。但如果我们安装 1.8.1 甚至 1.9.1 版本的 torch 会发现都是可以的,问题实际上就出在 1.8.0 的文件名上。我们将刚刚下载的 1.8.0 文件按以下名称重命名:
torch-1.8.0-cp38-none-macosx_11_0_arm64.whl
再次进行安装,你会发现它神奇地能装上了,可能这就是玄学的乐趣吧(笑)。
上述方法是错误的。 如果你选择 1.8.0 或者 1.8.1 的文件进行安装,那么到最后安装 ML-Agents 的时候你会得到以下提示:
ImportError: dlopen(/Users/cotte/miniconda3/envs/test/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so, 0x0002):
tried: '/Users/cotte/miniconda3/envs/test/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so'
(mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))
大概意思就是虽然 1.8.0 和 1.8.1 的文件名中含有arm64
字样,但最终安装上去时生成的mach-o file
可执行文件仍然是x86_64
架构的。出现这种无法形容的问题我也很难理解,但我发现 1.9.0 的版本不会有这个问题。以下是我这里的安装方法:
还是回到 Pytorch 下载网址,下载 1.9.0 版本的 Pytorch,文件名为:
cpu/torch-1.9.0-cp38-none-macosx_11_0_arm64.whl
打开ml-agents-main/ml-agents/setup.py
文件,我们能看到 ML-Agents 对 Pytorch 版本的要求:
"torch>=1.8.0,<1.9.0;(platform_system!='Windows' and python_version>='3.9')",
"torch>=1.6.0,<1.9.0;(platform_system!='Windows' and python_version<'3.9')",
即不管 Python 的版本是否高于 3.9,Pytorch 的版本都要求小于 1.9.0。在这里我们使用的是 Python 3.8 版本,对应下面的那行,我们对其进行修改:
"torch>=1.8.0,<1.9.0;(platform_system!='Windows' and python_version>='3.9')",
"torch>=1.6.0,<=1.9.0;(platform_system!='Windows' and python_version<'3.9')",
加了一个等于号,使我们安装 1.9.0 版本 Pytorch 时pip
不再报兼容性错误。最后,使用以下指令安装 Pytorch 即可:
pip install /Users/cotte/Downloads/torch-1.9.0-cp38-none-macosx_11_0_arm64.whl
安装 HDF5 与 H5PY
请确保你当前的虚拟环境是test
下。
HDF5 是 HDF 集团推出的一种跨平台数据储存文件,ML-Agents 使用其作为自己的数据格式。
首先使用 HomeBrew 安装 HDF5:
brew install hdf5
看到以下字样表示安装成功:
注:或者也可以直接使用brew list
指令展示所有已安装的依赖
还记得我们上述说过,M1 Mac 上 HomeBrew 的安装位置在/opt/homebrew
下吗?此时使用brew list hdf5
指令查看,HDF5 确实是被安装到了/opt/homebrew/Cellar/hdf5/1.12.2
下。
此时来到第二个比较坑的地方,如果你在安装 HomeBrew 时环境变量没有成功设置,那么此时你再安装 H5PY 就会报错。
我暂时无法复现之前碰到的问题,大致描述一下就是在使用pip install h5py
时会提示找不到libhdf5.dylib
文件,pip
会在/usr/bin
、/usr/local
等文件夹下寻找。此时需要更改环境变量使pip
能够正确找到 HDF5 的安装位置,从而完成 H5PY 的安装。我最终参考kukufufu的文章完成了安装。
最后使用以下指令安装 H5PY:
pip install h5py
安装 ML-Agents
请确保你当前的虚拟环境是test
下。
首先我们通过以下指令将终端的目标位置移动到我们下载好的 ML-Agents 文件夹内。
cd /Users/cotte/CondaDependencies/ml-agents-main
然后使用以下指令安装 ML-Agents,注意必须是先安装 envs:
pip3 install -e ./ml-agents-envs
pip3 install -e ./ml-agents
这会引导终端在ml-agents-main/ml-agents-envs
和ml-agents-main/ml-agents
下安装所需的依赖,可以使用pip list
指令检查安装位置。
如果我们是Windows,那么到这里整个安装过程就应该结束了。此时我们使用mlagents-learn
来查看是否安装成功,会出现以下提示:
ModuleNotFoundError: No module named 'mlagents_envs'
不用着急,这并不是说明 envs 没有安装成功。我们重启终端,进入test
环境,并输入mlagents-learn
,会发现出现以下提示:
from grpc._cython import cygrpc
ImportError: dlopen(/Users/cotte/miniconda3/envs/test/lib/python3.8/site-packages/grpc/_cython/cygrpc.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '_CFRelease'
似乎是一个叫 Cygrpc 的依赖出现了问题,我们直接执行pip install cygrpc
,若安装失败可能会提示:
grpcio command '/usr/bin/clang' failed with exit code 1
此时可以参考 Github 上的一个Issue,使用以下指令进行解决:
GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
若 Cygrpc 安装成功,则会出现另一个提示:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
tensorboard 2.9.0 requires grpcio>=1.24.3, but you have grpcio 1.23.0 which is incompatible.
大概意思就是 ML-Agents 自带的 2.9.0 版本的 Tensorboard 需要不低于 1.24.3 版本的 Grpcio 环境,但我们装上的却是 1.23.0 的版本,会导致 Tensorboard 无法运行。
此时就是第三个坑点:Cygrpc 的最新版本就是 1.0.4.post6,它只能在 1.23.0 版本的 Grpcio 环境下运行。事实上如果此时直接重装 Grpcio 到最新版,它会再次告诉你 Cygrpc 用不了了:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
cygrpc 1.0.4.post6 requires grpcio==1.23.0, but you have grpcio 1.46.0 which is incompatible.
所以我们的解决办法也很简单,就是对 Tensorboard 进行降级。打开ml-agents-main/ml-agents/setup.py
文件,会找到 ML-Agents 对 Tensorboard 最低版本的要求:
"tensorboard>=1.15",
即我们只需要找到 1.15 版本以上,且可以在 1.23.0 Grpcio 环境下运行的 Tensorboard 即可。经过尝试,我们发现 2.0.0 的版本可以无冲突安装,因此使用以下指令:
pip install tensorboard==2.0.0
最后,使用pip check
指令,提示
No broken requirements found.
说明所有依赖都已正确安装。执行mlagents-learn
,如果你看到熟悉的 Unity3D 标识,那么恭喜你安装成功!