亚马逊AWS官方博客

利用Amazon EC2进一步降低DeepRacer训练成本

Amazon DeepRacer 是一款 1:18 赛车,它提供了一种用强化学习 (RL) 解决自动驾驶技术的平台。RL 是一种先进的机器学习 (ML) 技术,它采用了与其他机器学习方法不同的方法来训练模型。它的强大之处在于,它不需要任何标记的训练数据就可以学习非常复杂的行为,并且可以在优化长期目标的同时做出短期决策。有了 Amazon DeepRacer,现在可通过自动驾驶亲身体验 RL、实验和学习。通过基于云的 3D 赛车模拟器开始使用虚拟汽车和赛道,并获得真实体验,可以将训练有素的模型部署到 Amazon DeepRacer 中与好友比赛,或参与全球 Amazon DeepRacer 联盟。

DeepRacer的训练成本约为3.5美元/小时,本文提供了一种基于开源DeepRacer在Amazon EC2主机上训练模型的方案,可以将DeepRacer的训练成本降低92%以上 (以ca-central-1 g4dn.2xlarge机型为例)。本文的方案支持多种机型,使用者可以根据自己的需求选择。

1 相关服务介绍

1.1 Amazon DeepRacer

使用 Amazon DeepRacer,您可以创建自己的机器学习模型(“训练”流程),并驾驶这些模型比赛(“评估”流程)。您需要支付训练、评估和存储机器学习模型的费用。费用基于您训练和评估新模型的时间和该模型的存储大小。此外,您还可以购买一款全自动 1/18 比例 DeepRacer 赛车,从而在真正的赛道上试验您的模型。进入 DeepRacer League 无需购买。

1.2 Amazon SageMaker

Amazon SageMaker 通过整合专门为 ML 构建的广泛功能集,帮助数据科学家和开发人员快速准备、构建、训练和部署高质量的机器学习 (ML) 模型。利用SageMaker,可以在云上以无服务器的方式训练DeepRacer模型。

1.3 Amazon RoboMaker

RoboMaker是用于运行在云上模拟和部署机器人应用程序,利用Gazebo模拟器在训练DeepRacer时模拟真实实际。Amazon RoboMaker 是最全面的云解决方案,可供机器人开发者大规模模拟、测试和安全部署机器人应用程序。RoboMaker 提供完全托管的可扩展模拟基础设施,客户可用它进行多机器人模拟并在模拟中与回归测试进行 CI/CD 集成。此外,Amazon RoboMaker 提供 IDE、应用程序部署功能、ROS 扩展工具以及与各种 Amazon 和 AWS 服务的无缝集成,使客户能够创新并提供一流的机器人解决方案。 RoboMaker 的托管 ROS 和 Gazebo 软件堆栈释放了很多工程资源,使您能够快速开始构建。

1.4 Amazon EC2

Amazon Elastic Compute Cloud(Amazon EC2 云服务器)是一种 Web 云服务,能在云中提供安全且可调整大小的计算能力。该服务旨在让开发人员能够更轻松地进行 Web 规模的云计算。Amazon EC2 云服务器的 Web 云服务接口非常简单,您可以最小的阻力轻松获取容量,随之配置容量。使用该服务,您将能完全控制您的计算资源,并能在亚马逊成熟且行之有效的计算环境中运行。

2 配置EC2训练环境

2.1 S3 Bucket创建

创建用于存放DeepRacer模型及训练记录的S3 Bucket。

2.2 创建IAM

  1. 在 AWS console 进入AWS IAM 服务;
  2. 进入 Policies界面,点击 Create Policy 按钮;
  3. 在 Service选项下,选择S3,并添加之前创建的 S3 Bucket 的全部权限;
  4. 进入Role界面,点击Create Role按钮;
  5. 在 Choose a use case 选项下, 选择EC2;
  6. 在 Attach permissions policies 选项下,为DeepRacer赋予以下权限:之前创建的Policy,AmazonKinesisVideoStreamsFullAccess 与 CloudWatchFullAccess

2.3 启动EC2服务器

  1. 从 EC2 界面启动 EC2 服务器,选择Deep Learning AMI (Ubuntu 18.04);

  1. 在 Choose Instance Type页面,根据自身需求选择对应机型,本文推荐选项:
    • g4dn.2xlarge:性价比较高的训练方式,基于GPU 加速,训练速度稍快于 DeepRacer console 训练
    • p3.2xlarge:训练速度远快于DeepRacer console 训练,快速迭代模型,取得训练成果
  2. 在 3. Configure Instance页面,在IAM Role 选项中,选择 2.1 中创建的 IAM Role;
  3. 在 4. Add Storage页面,为 Root Volume 选择高于150GiB 的存储空间;

2.4 配置DeepRacer运行环境

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

git clone https://github.com/aws-deepracer-community/deepracer-for-cloud.git

2. 执行第一阶段的环境预配置代码,这会安装DeepRacer本地训练所需的基础组件,之后重启EC2实例:

cd deepracer-for-cloud && ./bin/prepare.sh
sudo reboot
  1. 重新连接EC2实例,并执行第二阶段的环境初始化代码:

cd deepracer-for-cloud/ && bin/init.sh -c aws -a gpu

3 启动训练

  1. 执行source bin/activate.sh加载训练DeepRacer所需的脚本;
  2. 在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)
  1. 在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
  }
  1. 在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"
}
  1. 编辑env文件,需要配置的内容包括:

DR_LOCAL_S3_BUCKET=<2.1中创建的bucket名字>
DR_UPLOAD_S3_BUCKET=<2.1中创建的bucket名字>

  1. 此外,可以在env配置训练的信息,例如:
    • DR_WORLD_NAME:地图名称,例如reInvent2019_track
    • DR_RACE_TYPE:比赛类型,例如TIME_TRIAL或HEAD_TO_MODEL
    • DR_EVAL_OPP_S3_MODEL_PREFIX=:模型在S3中的文件夹名
    • DR_CAR_COLOR=Red:小车颜色

除了常见console中的配置,也可以配置console中无法定义的环境变量,例如:

    • DR_EVAL_OFF_TRACK_PENALTY:出界惩罚分数
    • DR_EVAL_COLLISION_PENALT:碰撞惩罚分数
  1. 更新后,执行 dr-update 使此次配置生效;
  2. 执行 dr-upload-custom-files, 将自定义文件上传至 s3,此时 bucket 中的 custom_files 包括:

  1. 执行dr-start-training开始训练;
  2. 训练完成后,可以执行scripts/upload/upload-model.sh,该脚本会将模型上传至S3(训练中途停止,也可以上传checkpoint模型);
  3. 如需将模型导入DeepRacer物理小车中,可以执行scripts/upload/upload-car.sh,该脚本会将选出最优模型,并打包为适合小车读取的格式,并上传至S3 bucket,文件名为tar.gz

4 常见问题

问题 解决建议
启动训练时报错信息:Sagemaker is not running” Docker 容器可能由于某些错误自动停止,执行 docker -ps a查看容器是否已停止。如果已停止,可以执行 docker logs -f <containerid>查看具体错误信息
启动训练时报错信息:Selected path s3://xxx exists. Delete it, or use -w option. Exiting. 改为执行 dr-start-training -w,强制覆盖

本篇作者

刘明

亚马逊云科技专业服务团队数据科学家。在机器学习、深度学习、数据挖掘及模型部署开发拥有扎实经验。深度参与过能源、医疗、教育、媒体等行业的机器学习应用搭建及数据平台建设。