最近在入门 Embodied AI ,在实验室中了解到 Meta 的Habitat模拟器。这是一个用于agent仿真的模拟平台,并且刚出了Habitat 3.0版本。无奈新版本嘛,难免有各种各样的bug,刚好网上也找不到太多资料,于是我总结了habitat-lab开发库配置过程中遇到的一部分bug。一方面给自己总结记录,另一方面帮助大家避开一些坑。

Linux环境(配置Ubuntu 22.04 + GPU 3090)

笔者一开始是打算用自己的windows机器跑下实例代码,发现居然没法 conda install habitat-sim,看样子不支持windows环境。于是用linux服务器进行接下来的实验,参考habitat-lab的官方github主页进行安装。

  1. 创建conda环境

我们采用默认的conda安装方式,先执行

conda create -n habitat python=3.9 cmake=3.14.0
conda activate habitat
  1. 配置底层模拟器

habitat-sim,也就是habitat-lab的核心模拟器。habitat-sim官方给出了几种安装方式(如果没有显示器也不一定要下载headless版本,下默认版本然后通过NoMachine远程连接查看桌面亲测可行)。那么我们这里就跟着habitat-lab的官方步骤往下走:

conda install habitat-sim withbullet -c conda-forge -c aihabitat
  1. 安装开发依赖

这一步官方考虑的是让用户git clone一个稳定版本的分支,但是事实上并没有这个分支,这个问题会让后续的训练运行出错,这里暂且埋一手伏笔[1]

git clone --branch stable https://github.com/facebookresearch/habitat-lab.git
cd habitat-lab
pip install -e habitat-lab # install habitat_lab
pip install -e habitat-baselines # install habitat_baselines
  1. 安装测试数据

第一,需要先配置hugging face的ssh密钥,步骤见huggingface官方说明。事实上这里引用了habitat-sim库中的datasets_downloads文件,并且根据这个文件,我们可以看到里面定义了每个数据对应的下载网址,因此如果无法科学上网也可以自行下载后放在指定位置(按以上的默认命令会下到habitat-lab/data/version_data,而不是habitat-lab/data/)。

随后运行该指令,如果数据集不完整,也不会继续安装,需要把原路径的文件删掉从头安装。如果数据集安装完整了,就会生成symlink,如下图。注意提示Replace versioned data?的时候务必选n,否则会再下载一次。

第二,安装(点导航)测试数据集的时候,通过搭梯子也可能没法下载,需要直接在datasets_downloads找到对应网址,http://dl.fbaipublicfiles.com/habitat/habitat-test-pointnav-dataset_v1.0.zip,这个链接复制到浏览器就可以直接下载,同样放到路径habitat-lab/data/version_data

  1. 测试配置环境

有两种方式的测试方法,分为非交互式和交互式(根据用户输入进行活动交互)

  • 非交互式:运行python examples/example.py,如果没有在前一步安装数据,这一步就会自动安装,最后提示Episode finished after 1 steps.就算成功。
  • 交互式:需要先安装依赖pip install pygame==2.0.1 pybullet==3.0.4,随后运行python examples/example.py --never-end。按理说成功的话会显示一个交互式的pygame页面,可操纵fetch robot在场景中移动。但是Ubuntu 20.04及以上的机子会显示以下报错。
X Error of failed request:  BadAccess (attempt to access private resource denied)
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 5 (X_GLXMakeCurrent)
Serial number of failed request: 98
Current serial number in output stream: 98

官网中也提到了这个问题还没解决,并且根据github官网相关的Issues,我们可以推断在短期内不太可能解决这个问题,因此我换了MacOS系统来解决交互测试的问题。

MacOS环境(配置Mac M1 Pro)

  1. 创建conda环境

因为我用了苹果自带芯片M1(arm64架构),不同于intel x86_64,所以conda中有些包下不到对应版本很可能是这个问题,对于这种情况需要创建基于x86架构平台的conda环境。

CONDA_SUBDIR=osx-64 conda create -n habitat python=3.9 cmake=3.14.0
conda activate habitat
  1. 配置底层模拟器(同上述Linux环境操作)
conda install habitat-sim withbullet -c conda-forge -c aihabitat
  1. 安装开发依赖(同上述Linux环境操作)
git clone --branch stable https://github.com/facebookresearch/habitat-lab.git
cd habitat-lab
pip install -e habitat-lab
pip install -e habitat-baselines
conda update --all
  1. 安装测试数据(同上述Linux环境操作)
  • 安装3D测试场景:

    python -m habitat_sim.utils.datasets_download --uids habitat_test_scenes --data-path data/

  • 安装(点导航)测试数据集:

    python -m habitat_sim.utils.datasets_download --uids habitat_test_pointnav_dataset --data-path data/

  1. 测试配置环境
  • 非交互式:运行python examples/example.py,同样是提示Episode finished after 1 steps.就算成功。
  • 交互式:需要先安装依赖pip install pygame==2.0.1 pybullet==3.0.4,随后运行python examples/example.py --never-end。按理说成功的话会显示一个交互式的pygame页面,可操纵fetch robot在场景中移动。

如果你的代码能正常执行,那么恭喜你不用看后文了。

如果你的代码在测试配置环境中报错,很可能属于以下两种,(Github官网和互联网的相关资料很少),最后总结出完美的解决方法如下:

MacOS环境特殊报错

  1. 测试代码报错如下:
OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.

为了防止该报错,Stackoverflow有多种方法,

方法一:在终端(Terminal)中关闭警告(临时的解决方法)

export KMP_DUPLICATE_LIB_OK=True 

方法二:针对intel mac,参考这个链接,键入以下命令解决

conda uninstall intel-openmp
conda install -c intel openmp
conda install nomkl

方法三:针对m芯片 mac

对于苹果芯片,以上两种方法基本都没用。这是因为苹果自带芯片比较特殊,如果下载的包(主要是numpy, spicy, matplotlib)含有不同的C++编译方法,并行编程会报错。我们参考Stackoverflow的问答找到可能的原因,numpy, scipy, pandas, tensorflow等几个包可能使用了不同的并行编程方式,优先解决它们这几个包的问题。对我来说,我运行了以下代码修复:

conda update --all
pip uninstalll numba
conda install numba

最终归因于numba使用了pip下载,和conda下载的numpy不兼容导致这个问题,该报错完美解决。

  1. 测试代码报错
AttributeError: 'RearrangeSim' object has no attribute '_initialized’

我的代码一开始没有这个报错,后来似乎是因为habitat官方把stable版本的代码更新不全导致,因为我直接在原来的环境使用了以下命令解决:

conda install habitat-sim withbullet -c conda-forge -c aihabitat-nightly

区别在于原来最后的部分是aihabitat,多了nightly部分,代表官方每天发布的最新版本。

  1. 安装pybullet报错

交互测试前需要通过pip install pygame==2.0.1 pybullet==3.0.4下载依赖,单独下载前一个是ok的,后一个的下载却报错如下(只截取最后一句):

ERROR: Could not build wheels for pybullet, which is required to install pyproject.toml-based projects

直接换下载源(pip换成conda)解决,默认下最新版本就可以了

conda install pybullet

其他杂七杂八的bug网上应该查得到,这里不一一赘述了,habitat的讨论帖实在太少,欢迎留言评论交流~