Unity之ml-agents(一):环境配置及初步使用

  ml-agents是Unity官方专门用来提供强化学习的工具包,关于ml-agents的介绍不是本文的重点。相比于其他的工具包只需要在package manager中导入,ml-agents需要进行一下简单的配置。这篇文章就对于配置过程及过程中可能遇到的一些问题给予解答。
  Unity开源网址:https://github.com/Unity-Technologies/ml-agents
  ml-agents的配置有CPU版和GPU版,因为目前GPU并没有提供太多的增益。本篇文章就介绍CPU的配置了。
  本篇文章的环境为:windows10+Unity2021.3+Anaconda

一、环境配置

1.下载Anaconda,并完成环境变量设置

在这里插入图片描述
  标志:cmd执行conda list有输出

2.创建虚拟环境并进入虚拟环境

  cmd执行

conda create -n ml-agents python=3.7   
activate ml-agents

3.安装pytorch和相关python包(mlagents)

  cmd执行

pip3 install torch~=1.7.1 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
python -m pip install mlagents==0.28.0

  判断是否下载成功:

mlagents-learn --help

4.下载源码

  下载网址:https://github.com/Unity-Technologies/ml-agents/releases/tag/release_19
最新版本是Release_20,但19会稳定一点

5.激活源码环境

cd ml-agents-envs
pip install -e .
cd ..
cd ml-agents
pip install -e .

  完成以上过程以上环境配置成功

ps:因为需要python环境,所以以后每次使用都需要先activate到指定环境才能执行mlagents的一些命令

  笔者在配置过程中遇到了一些问题,在此做个记录,也希望能够提供一些帮助

记录一:报错:‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件

  原因及解决方案:这个是因为Anaconda虽然安装成功了但没有进入环境变量,在环境变量中的Path中配置一下就可以。具体步骤参考:https://blog.csdn.net/m0_68744965/article/details/125700817
同时在Anaconda下使用ml-agents需要多次使用conda命令,关于conda命令可以参考:https://zhuanlan.zhihu.com/p/94744929

记录二:查看pytorch的版本方法

  在cmd中进行如下操作:

扫描二维码关注公众号,回复: 14651131 查看本文章
python
import torch
print(torch.__version__)

记录三:报错:执行conda创建环境时产生如下报错:

C:\Users\Administrator>conda create -n ml-agents python=3.7
Collecting package metadata (current_repodata.json): failed

CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to
download and install packages.

Exception: HTTPSConnectionPool(host='repo.anaconda.com', port=443): Max retries exceeded with url: /pkgs/main/win-64/current_repodata.json (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))

解决方法:将xxxx/Anaconda3/LIbrary/bin添加到环境变量(这个很多最开始配置Anaconda的教程都没提)

记录四:报错:执行mlagents-learn时报错信息如下:

C:\Users\Administrator\Desktop\ml-agents-release_19\ml-agents-release_19>mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun

            ┐  ╖
 Version information:
  ml-agents: 0.28.0,
  ml-agents-envs: 0.28.0,
  Communicator API: 1.5.0,
  PyTorch: 1.7.1+cpu
Traceback (most recent call last):
  File "D:\Anaconda\envs\ml-agents\Scripts\mlagents-learn-script.py", line 33, in <module>
    sys.exit(load_entry_point('mlagents', 'console_scripts', 'mlagents-learn')())
  File "c:\users\administrator\desktop\ml-agents-release_19\ml-agents-release_19\ml-agents\mlagents\trainers\learn.py", line 260, in main
    run_cli(parse_command_line())
  File "c:\users\administrator\desktop\ml-agents-release_19\ml-agents-release_19\ml-agents\mlagents\trainers\learn.py", line 256, in run_cli
    run_training(run_seed, options, num_areas)
  File "c:\users\administrator\desktop\ml-agents-release_19\ml-agents-release_19\ml-agents\mlagents\trainers\learn.py", line 89, in run_training
    stats_writers = register_stats_writer_plugins(options)
  File "c:\users\administrator\desktop\ml-agents-release_19\ml-agents-release_19\ml-agents\mlagents\plugins\stats_writer.py", line 47, in register_stats_writer_plugins
    if ML_AGENTS_STATS_WRITER not in importlib_metadata.entry_points():
  File "D:\Anaconda\envs\ml-agents\lib\site-packages\setuptools\_vendor\importlib_metadata\__init__.py", line 239, in __eq__
    return self._key() == other._key()
AttributeError: 'str' object has no attribute '_key'

  原因及解决方案:这个是因为缺少一个库,cmd中执行python -m pip install importlib-metadata

记录五:报错:执行mlagents-learn时报错,报错信息如下:

C:\Users\Administrator\Desktop\Unity_workstation\Rollerball\config>mlagents-learn config/rollerball_config.yaml --run-id=RollerBall
Traceback (most recent call last):
  File "D:\Anaconda\envs\ml-agents\Scripts\mlagents-learn-script.py", line 33, in <module>
    sys.exit(load_entry_point('mlagents', 'console_scripts', 'mlagents-learn')())
  File "D:\Anaconda\envs\ml-agents\Scripts\mlagents-learn-script.py", line 22, in importlib_load_entry_point
    for entry_point in distribution(dist_name).entry_points
  File "D:\Anaconda\envs\ml-agents\lib\site-packages\importlib_metadata\__init__.py", line 937, in distribution
    return Distribution.from_name(distribution_name)
  File "D:\Anaconda\envs\ml-agents\lib\site-packages\importlib_metadata\__init__.py", line 531, in from_name
    raise PackageNotFoundError(name)
importlib_metadata.PackageNotFoundError: No package metadata was found for mlagents

  原因及解决方法:这个是因为环境被移动过了,之前激活的失败了。需要重新激活环境,在新路径下执行:

cd ml-agents-envs
pip install -e .
cd ..
cd ml-agents
pip install -e .

二、初步使用

  ml-agents官方提供了很多demo,都放在https://github.com/Unity-Technologies/ml-agents/tree/develop/Project/Assets/ML-Agents/Examples
  本文就以其中的一个3DBall的小项目为例,体会一下整体训练过程
  在进行下面的操作前,请保证本文第一部分的环境配置已经成功。

1.启动python环境

 具体一点就是cmd中activate ml-agents

2.准备Unity端

 本文中使用的是官方的demo,所以只要下载代码,在项目中选择3DBall并导入unity端就行了(官方的代码已经带了训练模型,需要取消一下才能从头训练,也就是下图圈出来的部分要选择None)

在这里插入图片描述

3.python端启动

  cmd执行如下命令:

mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun --force

  对这个命令解释一下,这里面有三个参数:第一个是一个yaml的配置文件,要注意下执行路径(相对路径)要提前在cmd中cd到config的上一层再执行,第二个参数是–run-id是唯一标识符,第三个参数是强制生产,因为id唯一,如果用同一个id连续训练两次是不行的(第一次训练是不用加的,不过我习惯性全都加上)
  命令执行后就会输出以下内容:
在这里插入图片描述

4.Unity端点击运行

  Unity运行之后发现已经开始在训练了(有移动效果),并且cmd端会有如下输出:

[INFO] Hyperparameters for behavior name 3DBall:
        trainer_type:   ppo
        hyperparameters:
          batch_size:   64
          buffer_size:  12000
          learning_rate:        0.0003
          beta: 0.001
          epsilon:      0.2
          lambd:        0.99
          num_epoch:    3
          learning_rate_schedule:       linear
          beta_schedule:        linear
          epsilon_schedule:     linear
        network_settings:
          normalize:    True
          hidden_units: 128
          num_layers:   2
          vis_encode_type:      simple
          memory:       None
          goal_conditioning_type:       hyper
          deterministic:        False
        reward_signals:
          extrinsic:
            gamma:      0.99
            strength:   1.0
            network_settings:
              normalize:        False
              hidden_units:     128
              num_layers:       2
              vis_encode_type:  simple
              memory:   None
              goal_conditioning_type:   hyper
              deterministic:    False
        init_path:      None
        keep_checkpoints:       5
        checkpoint_interval:    500000
        max_steps:      500000
        time_horizon:   1000
        summary_freq:   12000
        threaded:       False
        self_play:      None
        behavioral_cloning:     None

在这里插入图片描述
在这里插入图片描述
  这里是训练了50w次,训练结束后会在result文件夹生成一个3DBall.onnx文件(后面使用到的训练文件)
位置如下图:
在这里插入图片描述

5.把.onnx或者.nn放到Agent的参数Model处

在这里插入图片描述
  这个移动的时候需要注意,直接从文件夹拖到项目中,放到目标文件夹下没用

  再次运行Unity就发现按照模型训练的结果,在运动了。

  继续给一些过程记录说明:

记录一:Unity报的Warning:Couldn’t connect to trainer on port 5004 using API version 1.5.0. Will perform inference instead.

原因及解决办法:这个是因为cmd端会使用这个端口,开Unity的时候端口还没有打开,不用管的。cmd起来了,再次运行Unity就没了

记录二:关于onnx和nn

  .onnx是预训练模型,.nn是训练结果模型。我们使用onnx就可以了

最后留一下过程中看到的有用的资料:
https://blog.csdn.net/tianjuewudi/article/details/121116043
https://www.bilibili.com/video/BV1hE411W7Pi
https://www.bilibili.com/video/BV1qB4y1T7TG
http://www.yaotu.net/biancheng/145132.html

猜你喜欢

转载自blog.csdn.net/gls_nuaa/article/details/129042346