Deepracer是AWS提供的一个综合性的学习系统,可供各个水平的用户用来学习和探索强化学习以及试验和构建自动驾驶应用程序。
具体介绍官网上都有,这里就不展开说了。
如果你对Deepracer有了基本的了解,可以通过本文进行更近一步的深入,包括:
- 一种优化策略-最佳路线和速度
- 如何在本地部署
- 如何分析日志
奖励策略
本节主要介绍github上的Capstone_AWS_DeepRacer(https://github.com/dgnzlz/Capstone_AWS_DeepRacer)项目。该项目基于https://github.com/cdthompson/deepracer-k1999-race-lines的算法,做了少量修改。
其主要功能是:计算了一个小车行驶的最佳路线,并在给定最小速度和最大速度的情况下,计算出合适的速度和行动空间。
下载项目到本地,通过jupyter notebook进行调试。
软件安装
以mac为例,先安装miniconda:
brew install miniconda
安装完成后即可使用conda命令:
conda create -n virtualEnv // 创建虚拟环境
conda env list // 列出所有的虚拟环境
conda activate virtualEnv // 激活环境
conda install // 安装包
conda list // 列出包
conda deactivate // 反激活环境
然后创建一个虚拟环境,激活该虚拟环境后,通过conda命令安装jupyter notebook:
conda install jupyter
然后在虚拟环境中启动jupyter notebook:
jupyter notebook
访问"http://localhost:8888/lab"地址可以看到当前目录下的项目。
然后按照顺序执行代码块。需要注意的是,赛道航路点文件需要从cdthompson项目的tracks目录下拷贝过来,其中2018赛道文件名为:reinvent_base
。
项目中没有依赖清单,可以在调试的时候缺什么就安装什么。
另外在计算速度和行动空间时有一处代码不兼容现有版本,修改如下:
sns.kdeplot(data=all_actions_norm_less["steering"], color='blue')
sns.kdeplot(data=all_actions_norm_less["velocity"], color='red')
其他按照说明执行即可,最终会生成最佳路线和速度文件以及行动空间。
但按照计算出来的action space来设置离散行动空间之后,收敛速度太慢。改成连续空间反而会效果好一点。在2018赛道上,1.4-3的速度,稳定圈速最快在9s。后面在阿里云上本地部署在相同速度和离散行动空间下,训练10小时,稳定圈速比9s多一点。
当速度继续增大时,即使训练10个小时都无法收敛。
本地部署
本地部署参考项目:https://github.com/aws-deepracer-community/deepracer-for-cloud。
该项目可以在AWS,Azure或本地部署。
本地需要在ubuntu或者windows系统(mac试过不行),或者在阿里云服务器上部署。
下面以在阿里云服务器上部署为例进行说明。
通过git clone下载项目,然后执行init脚本:
mkdir -p /home/dr # 创建用户目录
cd /home/dr
git clone https://github.com/aws-deepracer-community/deepracer-for-cloud.git
cd deepracer-for-cloud
./bin/init.sh -c local -a cpu # -c 和 -a参数不指定也可以,会使用默认值
如果缺少依赖,请按参考文献1来安装依赖。
注意,官网文档上特别说明,如果不是AWS或AZURE环境下,不需要执行prepare脚本
执行完init脚本后,会提示docker以swarm方式运行,当前节点作为主节点。
接下来需要修改bin/activate.sh
,将其中的DR_LOCAL_S3_ENDPOINT
的地址由localhost
改为阿里云服务器的公网ip。同时还需要注意,当前服务器的9000端口是可以访问的,如果没有则在安全组中配置(下同)。
本地训练时需要用到各种dr-*命令,此命令需要激活环境才可以使用:
source bin/activate.sh
首次执行时,需要将参数文件上传到本地S3:
dr-upload-custom-files
当更新了新的参数时(参数文件在custom_files文件夹下),同样需要以此方式重新上传。
如果前面s3地址配置错误或者9000端口无法访问,此处会报错连接不上S3。
至此,基本配置完成。在命令行通过docker ps
可以看到当前有一个minio的docker容器正在运行。
赛道是在run.env中配置的,赛道名称可以参考第一节中的说明。例如,reinvent_base是指2018赛道。
另外,每轮训练完成之后的会有一个自动评估,由DR_TRAIN_MIN_EVAL_TRIALS
参数控制。出圈罚秒由DR_EVAL_OFF_TRACK_PENALTY
控制。DR_EVAL_NUMBER_OF_TRIALS
参数指定正式评估时需要跑完的圈数。
其中DR_TRAIN_MIN_EVAL_TRIALS
参数在刚开始训练时可以设置得小一点,如1或2,加快训练速度。但训练到一定程度以后,可以增大一点,以便使用更好的检查点。
注意:连续行动空间写法是:{“steering_angle”: {“high”: 30.0, “low”: -30.0}, “speed”: {“high”: 2, “low”: 1}}
但是如果使用连续空间,开启训练时在DoorMan: installing SIGINT, SIGTERM 这一步好像会卡住, 通过dr-logs-robomaker查看日志可以看到robomaker没有启动成功,而离散行动空间就正常运行(sub_careme报错两种情况都有,不影响)。
下面开始训练:
dr-start-training # 开启训练
控制台将输出训练日志:
训练过程中,可以通过docker logs -f 容器id
查看日志。另起一个终端窗口,执行命令
dr-start-viewer
可以开启viewer服务。
启动后,控制台会给出几个访问地址,这个是在服务器本地访问的,也就是说如果服务器有浏览器,可以从这个地址进去。如果服务器只有命令行,则需要从远程,比如你自己的机器上去访问: http://你的服务器ip:8100
(8100端口同样需要在安全组中配置)即可看到训练过程。
注意,如果训练重启后,需要执行dr-update-viewer
更新viewer。如果在dr-start-training
后加上-v
则可自动启动/更新 viewer。
执行dr-stop-training
命令停止训练。执行dr-start-evaluation
可开启评测。
通过http://你的服务器ip:8180
可查看评测过程:
dr-increment-training
可以迭代模型。迭代完模型后,下次训练可以在上次训练得到的模型的基础上继续训练,与aws控制台中的clone模型效果是一样的。
日志分析
训练完成后,相应的数据都在本地S3中保存。通过dr-start-loganalysis
即可分析日志。
该命令会启动一个容器,并启动jupyter notebook,通过http://你的ip:8888/lab/?token=xxx
端口即可访问(token可以从控制台输出找到):
这里可以从本地S3即minio中看到训练的相关数据。
在Get the logs代码块中,S3终端地址填入之前的配置地址,PREFIX这里要填rl-deepracer-sagemaker
。
最终打印赛道信息如下:
从中可以看出小车的基本信息,超参数和行动空间,以及表格中展示的小车训练的日志信息。
后面的代码块就不一一介绍了。
本地日志分析
上面的日志分析是从服务器上的minio上下载的。如果有直接从AWS console下载的日志,可以在自己的电脑上分析。这里有一个github项目可在本地分析日志:https://github.com/jeremypedersen/deepracer-deepstats
。
基本过程与Deepracer-for-cloud(DRFC)的日志分析差不多。
部分参数说明
在强化学习中,一个episode指从初始状态开始,经过一序列动作和决策,直到到达终止状态为止的完整序列。在这里指车辆出界或者跑完一圈。
迭代表示训练过程中的一次循环,模型会在一次迭代完成之后根据当前的策略进行优化和调整。
Step指一个episode中执行的单个动作或决策。在这里指车辆在赛道上的一次决策,例如选择转向角度和速度,并执行相应行动。
奖励变化的说明
在训练初期,奖励曲线会逐步增加,随后可能会出现一些有趣的情况:
奖励可能在某个水平上趋于平稳 - 这可能意味着车辆无法再取得更好的表现。如果你认为仍有改进空间,可以回顾车辆的进展情况,并考虑更新奖励函数、动作空间、超参数,或者从头开始(从零或某个先前的检查点)。
奖励可能变得不稳定 - 这时你会看到一系列点呈现出来的蜿蜒曲线。这可能是学习率超参数设置过高,导致车辆开始执行围绕某个局部极值点来回摆动的动作。你可以降低学习率,希望能够更接近极值点,或者远离它(如果你不喜欢该极值点)。
参考资料
[1]. https://rambo.blog.csdn.net/article/details/128571598
[2].https://aws-deepracer-community.github.io/deepracer-for-cloud/
[3].https://github.com/scottpletcher/deepracer/
文章评论