写点什么

AWS 使用 EC2 降低 DeepRacer 的训练成本 DeepRacer-for-cloud 的实践操作

作者:指剑
  • 2022 年 7 月 22 日
  • 本文字数:6368 字

    阅读完需:约 21 分钟

AWS使用EC2降低DeepRacer的训练成本DeepRacer-for-cloud的实践操作

AWS DeepRacer-for-Cloud 的官方博客文档:直达链接https://aws.amazon.com/cn/blogs/china/use-amazon-ec2-to-further-reduce-the-cost-of-deepracer-training/

写在最前

由于博客中已经写了具体的方案,这里将里面的脚本提取出来,并对相应的问题做解决


这里采用 Deep Learning AMI (Ubuntu 18.04) Version 60.1


实例准备,我看到文章中有提到使用 G 和 P 系实例,如下:


g4dn.2xlarge:性价比较高的训练方式,基于GPU 加速,训练速度稍快于 DeepRacer console 训练p3.2xlarge:训练速度远快于DeepRacer console 训练,快速迭代模型,取得训练成果
复制代码


本次实践还是使用的 g4dn.2xlarge 那么我这里使用的是 spot 请求实例,而不是使用的 On-Demand,会减少 70% 及以上的成本,不过也会出现一些问题,那么就是 US-EAST-1 区域的 G 和 P 系列的实例严重不足,可能运行一会就会停掉,那么我们可以先将基础环境部署好,直接制作镜像,那么在后面使用的时候可以快速拉起实例,不需要再对基础环境做过多的配置


需要注意的是,你需要查看你的 EC2 limit,默认情况下是没有 G 和 P 系列的容量的,需要提交 case 提升 limit,在提交 limit 的时候不要提交太多请求,很可能会给你驳回


为了方便,我这里制作了一个 EC2 的启动模板,也是为后续的训练打个基础,以免每次都需要手动配置


文章目录结构:


  • 一、为 EC2 创建 IAM 角色

  • 1.首先进入 IAM 控制台

  • 2.选择 EC2,点击下一步

  • 3.添加权限

  • 4.命名、查看和创建

  • 5.查看创建的角色

  • 二、创建存储桶

  • 1.进入 S3 控制台

  • 2.创建存储桶

  • 3.查看创建的存储桶

  • 三、创建启动模板

  • 1.首先需要选择镜像

  • 2.设置实例类型和密钥对

  • 3.定义子网和安全组

  • 4.配置存储

  • 5.高级详细信息

  • 6.查看摘要并创建模板

  • 四、创建实例

  • 1.选择从模板启动实例

  • 2.查看 spot 请求

  • 五、连接实例并构建基础环境

  • Basic.连接你的实例

  • ①.SecureCRT 导入密钥

  • ②.SecureCRT 连接实例

  • 接下来进入基础环境的搭建

  • Step-1.拉取代码

  • Step-2.安装 DeepRacer 本地训练所需的基础组件

  • 错误场景一,解决方案

  • 错误场景二,解决方案

  • Step-3.重新连接 EC2 实例,并执行第二阶段的环境初始化代码

  • Step-4.加载训练 DeepRacer 所需脚本

  • Step-5.编辑奖励函数,训练信息,车俩信息

  • Step-6.编辑环境文件 run.env

  • ①.添加存储桶信息

  • ②.编辑赛道信息

  • Step-7.更新 python 版本

  • Step-8.更新配置

  • Step-9.上传 dr-upload-custom-files 到 S3 存储桶

  • Step-10.启动训练

  • 六、后续操作(再训练)

  • 1.若实例终止,重新拉取实例,接着上一次训练

  • ①.修改 run.env 文件

  • ②.更新,使本次配置生效

  • ③.若您修改了 custom_files 中的文件,那么请您再执行如下命令重新上传 custom_files

  • ④.开始训练

  • 七、参数、命令释义

  • 八、遇到的问题

  • 1.NO PUBKEY

  • 2.Python3.6 报错,更新 python 版本

  • 3.无法获得锁

  • 4.Sagemaker is not running


以下为具体的操作方案

一、为 EC2 创建 IAM 角色

正如 AWS 官方博客中所说的,我们使用 EC2 去训练模型会用到如下 3 个服务


AmazonKinesisVideoStreamsCloudWatchS3
复制代码


那么这里进行演示创建新的 EC2 角色并赋权

1.首先进入 IAM 控制台

IAM创建新角色控制台:https://us-east-1.console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities

2.选择 EC2,点击下一步

3.添加权限

依次搜索 S3,CloudWatch,AmazonKinesisVideoStreams,如下图都需要 选择 FullAccess 结尾的,代表完全访问





3 个权限都添加完成后,点击下一步

4.命名、查看和创建

①.设置角色名称

②.查看角色附加的权限

③.准备创建

根据自身需求是否添加标签(可选)


5.查看创建的角色

二、创建存储桶

1.进入 S3 控制台

S3存储桶控制面板:https://s3.console.aws.amazon.com/s3/


2.创建存储桶

此处只需要设置存储桶名称和区域,其他设置保持默认即可



滑到最下面点击 创建存储桶

3.查看创建的存储桶

三、创建启动模板

EC2 启动模板控制面板:https://us-east-1.console.aws.amazon.com/ec2/v2/home?region=us-east-1#LaunchTemplates

1.首先需要选择镜像

请选择 Deep Learning AMI(Ubuntu 18.04) 镜像


2.设置实例类型和密钥对

虽然官方给出的提示是不要在模板中包含这两个参数,但是本次实验是为了后面多次部署节省时间,就预先在模板中定义


3.定义子网和安全组

由于本次我需要使用到 spot 请求,就不对子网进行设置,待会 spot 会在 us-east-1 任意一个区域进行请求


4.配置存储

官方博客给出配置说明为:根卷至少要高于 150GiB 的空间,这里设置为 160GiB,我们还可以看到,AMI 有一个存储卷,有 225GB


5.高级详细信息

这里我勾选了 请求 spot 实例,为了降低成本,这里可以根据用户的自身情况是否勾选然后在 IAM 角色这里,要选择我们预先为 EC2 创建的角色


6.查看摘要并创建模板

检查一下创建的模板,若无误点击创建即可



四、创建实例

EC2 实例控制台:https://us-east-1.console.aws.amazon.com/ec2/v2/home?region=us-east-1#Instances

1.选择从模板启动实例

这里选择之前创建的模板



确认无误后,启动实例



查看创建成功的实例如果您勾选了 spot 请求实例,并且在启动实例报错,提示没有 spot 额度,并且您在确保您账号有足够的 limit,那么可能该区域的该时段没有可供您使用的 spot 实例,请使用按需实例进行创建


2.查看 spot 请求

如果您在实例模板中勾选了 spot 请求实例,并且成功启动,那么您可以在 spot 请求控制面板看到您的实例


五、连接实例并构建基础环境

这里还是采用 AWS 官方博客所给出的安装步骤


还是做一个很基础的展示,如何连接 EC2,我这里采用的是 SecureCRT 连接工具

Basic.连接你的实例

这里只支持使用以.pem 类型的密钥(与 OpenSSH 共用),若您是.ppk 类型的,请使用 putty 进行连接

①.SecureCRT 导入密钥



②.SecureCRT 连接实例

请注意,因为我们使用的是 Ubuntu 的镜像,那么这里使用的用户名为 ubuntu



连接后,若弹出提示框,请点击 接受并保存


接下来进入基础环境的搭建

AWS DeepRacer-for-Cloud 安装训练脚本如下

Step-1.拉取代码

进入创建的 EC2 实例,并执行以下命令,从 GitHub 拉取代码:


git clone https://github.com/aws-deepracer-community/deepracer-for-cloud.git
复制代码


Step-2.安装 DeepRacer 本地训练所需的基础组件

执行第一阶段的环境预配置代码,这会安装 DeepRacer 本地训练所需的基础组件,之后重启 EC2 实例:这一步官方给出的只有 2 行代码,那么在实际的执行过程中,因为版本的变化,衍生出了一些新的问题


cd deepracer-for-cloud && ./bin/prepare.shsudo reboot
复制代码



因为这里考虑到会出错的场景,在这里进行额外操作这里贴出实际报错场景一,提示 NO_PUBKEY


错误场景一,解决方案

### 添加PUBKEYwget -qO - http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub | sudo apt-key add -### 更新sudo apt-get update### 重新执行,请确保您不在 deepracer-for-cloud目录中,请回到ubuntu的home目录下cd deepracer-for-cloud && ./bin/prepare.sh### 重启sudo reboot
复制代码




若出现如下进度条,则表示错误已修复,正在安装基础环境


错误场景二,解决方案

若没有出现进度条,并出现如下错误,可能会出现多次


E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
复制代码


请运行一下代码解决,并重新执行基础环境安装命令


sudo rm /var/lib/dpkg/lock-frontendsudo rm /var/lib/dpkg/lock### 重新执行,请确保您不在 deepracer-for-cloud目录中,请回到ubuntu的home目录下cd deepracer-for-cloud && ./bin/prepare.sh### 重启sudo reboot
复制代码

Step-3.重新连接 EC2 实例,并执行第二阶段的环境初始化代码

### 请确保您此时在ubuntu的home目录下cd deepracer-for-cloud/ && bin/init.sh -c aws -a gpu
复制代码


此时环境初始化,需要拉取很多的容器镜像,请耐心等待完成



环境初始化完成,如下


Step-4.加载训练 DeepRacer 所需脚本

source bin/activate.sh
复制代码

Step-5.编辑奖励函数,训练信息,车俩信息

在 deepracer-for-cloud 目录中有一个 custom_files 目录,里面带有 3 个文件,分别为:


reward_function.py #奖励函数文件hyperparameters.json #训练信息文件model_metadata.json #车俩信息文件
复制代码


deepracer-for-cloud/custom_files/reward_function.py 文件中编辑奖励函数


   def reward_function(params):    '''    Example of penalize steering, which helps mitigate zig-zag behaviors    '''
# Read input parameters distance_from_center = params['distance_from_center'] track_width = params['track_width'] steering = abs(params['steering_angle']) # Only need the absolute steering angle
# Calculate 3 marks that are farther and father away from the center line marker_1 = 0.1 * track_width marker_2 = 0.25 * track_width marker_3 = 0.5 * track_width
# Give higher reward if the car is closer to center line and vice versa if distance_from_center <= marker_1: reward = 1 elif distance_from_center <= marker_2: reward = 0.5 elif distance_from_center <= marker_3: reward = 0.1 else: reward = 1e-3 # likely crashed/ close to off track
# Steering penality threshold, change the number based on your action space setting ABS_STEERING_THRESHOLD = 15
# Penalize reward if the car is steering too much if steering > ABS_STEERING_THRESHOLD: reward *= 0.8
return float(reward)
复制代码


deepracer-for-cloud/custom_files/hyperparameters.json 文件中编辑训练信息,例如:


   {    "batch_size": 64,    "beta_entropy": 0.01,    "discount_factor": 0.995,    "e_greedy_value": 0.05,    "epsilon_steps": 10000,    "exploration_type": "categorical",    "loss_type": "huber",    "lr": 0.0003,    "num_episodes_between_training": 20,    "num_epochs": 10,    "stack_size": 1,    "term_cond_avg_score": 350.0,    "term_cond_max_episodes": 1000,    "sac_alpha": 0.2  }
复制代码


deepracer-for-cloud/custom_files/model_metadata.json 文件中编辑车辆信息,包括 action space、传感器以及神经网络类型等,例如:


   {    "action_space": [        {            "steering_angle": -30,            "speed": 0.6        },        {            "steering_angle": -15,            "speed": 0.6        },        {            "steering_angle": 0,            "speed": 0.6        },        {            "steering_angle": 15,            "speed": 0.6        },        {            "steering_angle": 30,            "speed": 0.6        }    ],    "sensor": ["FRONT_FACING_CAMERA"],    "neural_network": "DEEP_CONVOLUTIONAL_NETWORK_SHALLOW",    "training_algorithm": "clipped_ppo",    "action_space_type": "discrete",    "version": "3"}
复制代码

Step-6.编辑环境文件 run.env

①.添加存储桶信息

编辑 deepracer-for-cloud/run.env 文件,添加如下内容:


DR_LOCAL_S3_BUCKET=<创建的bucket名字>DR_UPLOAD_S3_BUCKET=<创建的bucket名字>
复制代码


也可以使用命令,请将 <创建的bucket名字> 替换为您之前创建的 S3 存储桶的名字


sed -i '1i\DR_LOCAL_S3_BUCKET=<创建的bucket名字>' run.envsed -i '1i\DR_UPLOAD_S3_BUCKET=<创建的bucket名字>' run.env
复制代码


这里我创建的存储桶名字为:deepracer-demo-bk,作为演示


②.编辑赛道信息

我这里使用的是 re:Invent 2018 赛道,其 DR_WORLD_NAME 为 reinvent_base 请在 run.env 文件中找到 DR_WORLD_NAME 修改其值


Step-7.更新 python 版本

由于该镜像自带是 python 3.6,这里已经不支持了,所有需要更新 python 版本请执行一下命令更新 python3


### 安装python 3.8sudo apt-get -y install python3.8
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
复制代码


Step-8.更新配置

### 执行如下代码,使此处配置生效dr-update
复制代码


Step-9.上传 dr-upload-custom-files 到 S3 存储桶

dr-upload-custom-files
复制代码



此时 S3 存储桶中的 custom-files 应该包含下图文件


Step-10.启动训练

执行如下命令开始训练


dr-start-training
复制代码



正常训练如图


至此,您的模型已经开始在 EC2 上训练

五、后续操作

1.若实例终止,重新拉取实例,接着上一次训练

请进行如下操作

①.修改 run.env 文件

修改如下参数


### 这是上一次训练存放文件夹,请查看S3存储桶中的文件夹名称DR_LOCAL_S3_MODEL_PREFIX=<本次训练存放S3存储桶的目录>### 确定培训或评估是否应基于在上一个会话中创建的模型DR_LOCAL_S3_PRETRAINED=True### 设置本次训练的目录DR_LOCAL_S3_PRETRAINED_PREFIX=<上一次训练存放S3存储桶的目录>### 本次训练从上一次训练的checkpoint设置 默认为 lastDR_LOCAL_S3_PRETRAINED_CHECKPOINT=best
复制代码


这是修改前的



这是修改后的



查看一下 s3 存储桶的文件


②.更新,使本次配置生效

dr-update-env
复制代码


③.若您修改了 custom_files 中的文件,那么请您再执行如下命令重新上传 custom_files

dr-upload-custom-files
复制代码

④.开始训练

dr-start-training
复制代码



如果提示 Sagemaker is not running 请执行 dr-start-training -w


dr-start-training -w
复制代码


run.evn 配置文件参数设置,dr-命令释义

具体参数请参阅Deepracer-for-Cloud GitHub

遇到的问题

1.NO_PUBKEY

W: GPG error: http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F60F4B3D7FA2AF80E: The repository 'http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Release' is not signed.N: Updating from such a repository can't be done securely, and is therefore disabled by default.N: See apt-secure(8) manpage for repository creation and user configuration details.
复制代码


处理方案由于本次使用 ubuntu 18.04 所以使用以下方案解决


wget -qO - http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub | sudo apt-key add -
sudo apt-get update
复制代码


2.Python3.6 报错,更新 python 版本

sudo apt-get install python3.8sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
复制代码


注:


第一个参数--install表示向update-alternatives注册服务名。
第二个参数是注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
( --install link name path priority)
其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/java(需绝对目录);name为命令链接符名称,如java path为你所要使用新命令、新软件的所在目录 priority为优先级,当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接;# 整数 根据版本号设置的优先级(更改的优先级需要大于当前的)
第三个参数:服务名,以后管理时以它为关联依据。
第四个参数,被管理的命令绝对路径。
第五个参数,优先级,数字越大优先级越高。
复制代码

3.无法获得锁

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
复制代码


解决方法:


$ sudo rm /var/lib/dpkg/lock-frontend$ sudo rm /var/lib/dpkg/lock
复制代码


4.如果提示 Sagemaker is not running 请执行 dr-start-training -w

dr-start-training -w
复制代码


希望这个基础教程可以帮助到您

发布于: 2 小时前阅读数: 8
用户头像

指剑

关注

还未添加个人签名 2022.07.13 加入

还未添加个人简介

评论

发布
暂无评论
AWS使用EC2降低DeepRacer的训练成本DeepRacer-for-cloud的实践操作_AWS_指剑_InfoQ写作社区