在M1芯片的Mac上搭建Unity ML-Agents的支持环境

写在前面:

 截止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:
在M1芯片的Mac上搭建Unity ML-Agents的支持环境_第1张图片

 完成之后解压,请将该文件放到易于管理的地方。不要直接放在Download文件夹下,因为后续的依赖会直接安装到ml-agents-main内。
 这里是我的安装路径:

/Users/cotte/CondaDependencies/ml-agents-main

 

安装 HomeBrew

 参考ineo6的文章,安装 HomeBrew。在这里注意,在 Intel 芯片的 Mac 上 HomeBrew 的默认安装位置是/usr/local但 M1 芯片上 HomeBrew 的位置则变成了/opt/homebrew,如果不对环境变量进行修改会导致后续pip安装找不到对应的 Homebrew 软件包

 
 修改环境变量有两种方式:

  1. 直接在控制台使用export指令。这样的做法仅限于本次登录,即你所打开的这个控制台窗口。当你关掉该控制台时,环境变量就又复原了。因为后续 HomeBrew 会在很多地方用到,所以不推荐使用这个方法。
  2. 修改对应的profile文件。这里请仔细阅读上文提到的文章,以下仅列出我使用到的指令:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

 使用后可利用vim ~/.zprofile指令查看环境变量是否已经正确写入。
在M1芯片的Mac上搭建Unity ML-Agents的支持环境_第2张图片

 

安装 Miniconda 并创建虚拟环境

 参考烟缈睿晨的文章安装 Miniconda。成功后重启终端,你应该能看到前面有(base)字样,表示你的 Miniconda 已经可以正常使用了。
 创建虚拟环境便于我们管理不同 Python 版本下不同的依赖库,虚拟环境之间的依赖互不干扰。一般来说对于每个单独的项目都应该创建一个单独的虚拟环境,这一点就可以通过 Miniconda 来实现。
 使用以下指令创建虚拟环境:

conda create -n test python=3.8

-n--name的缩写,test就是环境名称;后面的就是虚拟环境的Python版本。使用以下指令激活你的虚拟环境:

conda activate test

 你会看到(base)字样变为了(test)字样,表示你已经进入了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字样的文件,只有x86amd64等字样。这意味着 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

 看到以下字样表示安装成功:
在M1芯片的Mac上搭建Unity ML-Agents的支持环境_第3张图片
注:或者也可以直接使用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-envsml-agents-main/ml-agents下安装所需的依赖,可以使用pip list指令检查安装位置。
ML-Agents安装完成
 如果我们是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 标识,那么恭喜你安装成功!
在M1芯片的Mac上搭建Unity ML-Agents的支持环境_第4张图片

你可能感兴趣的:(macos,unity,pytorch)