使用 Amazon 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 个服务
AmazonKinesisVideoStreams
CloudWatch
S3
那么这里进行演示创建新的 EC2 角色并赋权
1.首先进入 IAM 控制台
IAM 创建新角色控制台:https://us-east-1.console.aws.amazon.com/iamv2/home#/roles/create?step=selectEntities
2.选择 EC2,点击下一步
控制面板-1
3.添加权限
依次搜索 S3,CloudWatch,AmazonKinesisVideoStreams,如下图 都需要 选择 FullAccess 结尾的,代表完全访问
3 个权限都添加完成后,点击下一步
4.命名、查看和创建
①.设置角色名称
SetRoleName
②.查看角色附加的权限
CheckRole_policy
③.准备创建
根据自身需求是否添加标签(可选)
5.查看创建的角色
Check_Create_role
二、创建存储桶
1.进入 S3 控制台
S3 存储桶控制面板:https://s3.console.aws.amazon.com/s3/
2.创建存储桶
此处只需要设置存储桶名称和区域,其他设置保持默认即可
滑到最下面点击 创建存储桶
3.查看创建的存储桶
Check_bk
三、创建启动模板
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
连接后,若弹出提示框,请点击 接受并保存
SecureCRT 连接实例成功
接下来进入基础环境的搭建
AWS DeepRacer-for-Cloud 安装训练脚本如下
Step-1.拉取代码
进入创建的 EC2 实例,并执行以下命令,从 GitHub 拉取代码:
git clone https://github.com/aws-deepracer-community/deepracer-for-cloud.git
git code
Step-2.安装 DeepRacer 本地训练所需的基础组件
执行第一阶段的环境预配置代码,这会安装 DeepRacer 本地训练所需的基础组件,之后重启 EC2 实例: 这一步官方给出的只有 2 行代码,那么在实际的执行过程中,因为版本的变化,衍生出了一些新的问题
cd deepracer-for-cloud && ./bin/prepare.shsudo reboot
本地基础环境-1
因为这里考虑到会出错的场景,在这里进行额外操作 这里贴出实际报错场景一,提示 NO_PUBKEY
错误场景一,解决方案
### 添加PUBKEY
wget -qO - http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub | sudo apt-key add -### 更新
sudo apt-get update
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
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 文件中编辑奖励函数
在 deepracer-for-cloud/custom_files/hyperparameters.json 文件中编辑训练信息,例如:
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.8
sudo apt-get -y install python3.8
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
安装 python3.8
Step-8.更新配置
### 执行如下代码,使此处配置生效
dr-update
dr-update
Step-9.上传 dr-upload-custom-files 到 S3 存储桶
dr-upload-custom-files
此时 S3 存储桶中的 custom-files 应该包含下图文件
Step-10.启动训练
执行如下命令开始训练
dr-start-training
training-1
正常训练如图
至此,您的模型已经开始在 EC2 上训练
五、后续操作
1.若实例终止,重新拉取实例,接着上一次训练
请进行如下操作 #### ①.修改 run.env 文件 修改如下参数### 这是上一次训练存放文件夹,请查看S3存储桶中的文件夹名称
DR_LOCAL_S3_MODEL_PREFIX=<本次训练存放 S3 存储桶的目录>### 确定培训或评估是否应基于在上一个会话中创建的模型
DR_LOCAL_S3_PRETRAINED=True### 设置本次训练的目录
DR_LOCAL_S3_PRETRAINED_PREFIX=<上一次训练存放 S3 存储桶的目录>### 本次训练从上一次训练的checkpoint设置 默认为 last
DR_LOCAL_S3_PRETRAINED_CHECKPOINT=best
这是修改前的
这是修改后的
查看一下 s3 存储桶的文件
②.更新,使本次配置生效
dr-update-env
dr-increment-training
③.若您修改了 custom_files 中的文件,那么请您再执行如下命令重新上传 custom_files
dr-upload-custom-files
④.开始训练
dr-start-training
training-again
如果提示 Sagemaker is not running 请执行 dr-start-training -wdr-start-training -w
training-again-error-deal-1
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
image.png
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
问题 3
4.如果提示 Sagemaker is not running 请执行 dr-start-training -w
dr-start-training -w
training-again-error-deal-1
希望这个基础教程可以帮助到您!
评论