亚马逊AWS官方博客

自动驾驶数据湖(一):场景检测

 1.前言

在亚马逊云科技2020的re:Invent大会上,发布了在云上构建自动驾驶数据湖的参考架构(点击 这里 下载源文件),结合国内的实际业务场景,我们做了一些针对性的细化和调整,修改为如下的参考架构(以MDF4/Rosbag格式数据为参考)。

因为Rosbag数据文件里面包含了例如图片,音视频,雷达,GPS等内容,需要通过解析并识别出来例如带时间戳的图片数据,pcd点云数据等,解析和拆开了对应数据以后就可以进行对应的数据分析,机器学习等环节处理。

因此我们把上图中的自动驾驶数据湖参考架构拆分成一个系列的四篇博客(此处暂时未包括左上角的IoT相关部分),方便用户和读者理解和使用对应的解决方案,这是本系列博客的第一部分:场景检测(基于上图的1-3-4步骤实现)。

在本篇博客中,更加细化的场景检测的具体步骤和代码,可以参考如下图所示的参考步骤:

说明:此架构图来自参考文档2里面的步骤架构,我们未做修改。

接下来的博客内容详细代码和步骤参考上图的架构:

a)先把Rosbag文件通过ECS做拆解;

b)然后通过EMR对拆解后的数据进行分析和处理;

c)相关元数据写入DynamoDB,方便后续分析和使用;

d)最后我们通过Athena对数据进行简单的查询验证。

2.环境准备

我们使用的源代码位于 https://github.com/auto-bwcx-me/ (如果对亚马逊云科技的相关服务特别熟悉,也可以直接使用 官方的GitHub Repo)。

环境说明:

a)我们的操作环境为Cloud9,所有非控制台的操作都基于它完成;

b)因为是博客,为了突出自动驾驶数据湖相关的内容,我们直接给这个Cloud9配置了Administrator的权限,未遵循安全最佳实践里面的最小权限原则,大家在生产环境的时候要注意,尽量遵循最小权限分配的原则;

c)如果没有特别说明,我们的操作区域为新加坡区域;

d)如果没有特别说明,我们执行脚本的操作目录为代码目录。

2.1准备Cloud9

因为我们要在Cloud9里面编译更新Python3.9,所以部署Cloud9实例的时候可以选一个C系列的机型(如c5.2xlarge),这样编译速度会快很多,其他全部默认即可(注意部署到对应的区域,如新加坡区域即可)

创建一个Cloud9环境,取个名字,如“auto1”

确认如下红框选中的配置,其他保持默认即可

约等待1-2分钟即可打开Cloud9控制台,如果出现确实无法访问的情况(不排除是出口网络问题),可以把刚创建的Cloud9删除,重新创建一个。

2.2 安全配置

打开IAM控制台,点击左边的角色(Roles),选择创建新角色:

在添加权限的页面上可以输入“Administrator”进行搜索,然后选中结果里面的“AdministratorAccess”即可(注意:此处配置不符合安全最佳实践,生产环境慎用):

取个名字,例如叫“EC2-for-Cloud9”,然后创建即可。

打开EC2控制台(注意别选错了区域),然后选中对应Cloud9的实例,按下图所示找到修改IAM Role的位置:

选中刚才创建的IAM Role确认即可。

进入到Cloud9的Web控制台,点击右上角的配置按钮:

找到临时Credentials设置,把它关闭(默认是绿色打开的,调整为红色关闭的即可):

至此Cloud9配置完成,因为这是本系列博客的第一篇,所以配置步骤比较详细,后续的博客将做一定的裁剪。

2.3 拉取代码

进入Cloud9环境,执行如下脚步同步代码:

cd ~/environment

echo "clone code from github"
git clone https://github.com/auto-bwcx-me/aws-autonomous-driving-data-lake-ros-bag-scene-detection-pipeline.git 01-scene-detection

cd 01-scene-detection

正常情况如下,如果有异常,请留意URL是否正确

2.4 更新Python3.9

在更新Python3.9之前先安装一些系统后续步骤需要用到的依赖包。打开Cloud9环境的命令行执行:

sudo yum -y update
sudo yum -y install jq gettext bash-completion moreutils telnet git

然后更新安装配置,删除临时Crendentials:

echo "delete temp credentials"
rm -vf ${HOME}/.aws/credentials

echo "config cloud9 env"
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
aws sts get-caller-identity

如果返回类似如下内容表示权限配置成功(中间的EC2-for-Cloud9是我们之前配置的IAM角色):

{
    "Account": "123456789012", 
    "UserId": "ARSKWX1234FFAC893KKQK:i-12345678", 
    "Arn": "arn:aws:sts::123456789012:assumed-role/EC2-for-Cloud9/i-12345678"
}

接下来使用如下方式安装和更新Python3.9:

cd ~/environment

echo "get python 3.9 packages"
wget https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz
tar xzf Python-3.9.10.tgz
cd Python-3.9.10 

echo "compile and install"
./configure --enable-optimizations
sudo make altinstall

echo "config python3.9"
sudo rm -f /usr/bin/python3
sudo ln -s /usr/local/bin/python3.9 /usr/bin/python3

大概需要5分钟左右的时间。

3.测试过程

默认情况下,部署的Cloud9的磁盘只有10G,我们需要打包好几个Docker镜像,很容易把磁盘撑爆了,所以通过执行这脚本可以把磁盘调整到例如1000G(其实如果只是做这一个实验,100G以上就可以满足),确保在代码目录下执行(如果使用的是普通SSD硬盘,记得更换对应脚本文件):

sh resize-ebs-nvme.sh 1000

# sh resize-ebs.sh 1000

默认情况下,我们选择和设置的区域是新加坡区域,如果不确定可以这样显式指定:

sh 00-define-region.sh

3.1配置CDK

通过如下方式配置Python3.9环境

pip install --upgrade pip

python3 -m venv .env

pip3 install -r requirements.txt

更新CDK的相关包

npm install -g aws-cdk --force

cdk --version

创建ECR的docker 镜像存储库

cat config.json |jq .

aws ecr create-repository --repository-name rosbag-scenes-detection

然后开始CDK的初始化(要注意的是,一个Region初始化一次即可,不需要重复操作,如下的整个命令是一行,注意复制执行的时候不要折行了):

cdk bootstrap aws://$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document/ |jq -r .accountId)/$(curl -s http://169.254.169.254/latest/meta-data/placement/region)

3.2部署环境

初始化CDK后,然后执行CDK环境合成(大概需要3-5分钟)

bash deploy.sh synth true

接下来部署文章开头架构图所示的测试环境(大概需要10-20分钟)

bash deploy.sh deploy true

3.3测试验证

因为我们使用EMR(PySpark)来处理Rosbag解析出来的数据,所以需要创建EMR集群运行相关的角色和权限(如果之前使用过EMR服务,则可以跳过这一步,执行命令时注意折行的问题):

aws emr create-default-roles
sleep 3
aws emr create-cluster \
    --release-label emr-6.2.0 \
    --use-default-roles \
    --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m5.xlarge \
    --auto-terminate

上述部署的EMR集群会自动终止,所以不用担心,直接按如下的脚本准备测试数据即可

# get s3 bucket name
s3url="https://auto-bwcx-me.s3.ap-southeast-1.amazonaws.com/aws-autonomous-driving-dataset/test-vehicle-01/072021"
echo "Download URL is: ${s3url}"
s3bkt=$(aws s3 ls |grep rosbag-scenes-input |awk '{print $3}')
echo "S3 bucket is: ${s3bkt}"

# create saving directory
cd ~/environment
mkdir -p ./data/rosbag-scenes-detection
save_dir="./data/rosbag-scenes-detection"

# download testing files
wget ${s3url}/2020-11-19-22-21-36_1.bag -O ${save_dir}/2020-11-19-22-21-36_1.bag

# upload testing file
aws s3 cp ${save_dir}/2020-11-19-22-21-36_1.bag s3://${s3bkt}/2022-03-09-01.bag

因为我们的S3存储桶设置了Lambda触发,所以只要把文件丢上去,就会自动触发流程,流程跑完了就会自动结束和清理环境(如Lambda自动结束,ECS自动结束,EMR自动终止等)。

3.4过程监控

打开Step Functions控制台,可以看到如下所示的状态机(因为我们刚才只上传了一个测试文件,所以每个状态机都只执行了一次,且都执行成功了):

点开里面的状态机(如整个场景检测pipeline的),可以看到具体的步骤和每一步的执行结果(注意:如果中间有某个/些步骤执行失败,可以查看对应的错误日志):

点开例如启动EMR集群的状态机,可以看到对应的流程和执行情况:

打开CloudWatch控制台,选择左边的日志组,然后查看对应的日志组里面的日志输出,可以更好的核对和理解对应处理过程(截图为其中一个):

打开DynamoDB的控制台,即可看到对应的元数据的表,如下图所示:

可以找到对应的元数据信息

打开S3的控制台,会看到多个由“rosbag-scenes”开头的存储桶:

名字里面带input的是我们上传的原始数据:

名字里面带synchronized的桶是我们处理后的数据(后面用Athena来查询结果)

名字里面output的是我们ECS解析出来的原始数据,如下所示:

4.结果查询

4.1配置元数据

打开Glue控制台,选择左边的“crawlers”菜单,然后创建任务,表名可以设置为例如: “tbl_synchronized”,然后选择对应的S3目录

选取结果如下

设置IAM角色的时候,设置一个标识符即可:

然后配置存放的数据库(例如此处为auto1):

其他未截图的部分均使用默认值即可,创建完任务后直接运行它。

4.2查询结果

上述任务运行结束后,打开Athena控制台,选择Query editor(查询编辑器),即可在数据库和表列表里面发现我们刚才爬取的数据库和表:

第一次使用Athena的话需要配置临时存储位置(S3存储桶),否则会收到类似如下的提醒:

点击并配置即可,如下图所示,我们配置到output目录下(选中S3存储桶以后,我们手工添加了/athena目录(因为里面还有别的数据,为了方便区分,当然也可以创建一个新的S3存储桶来单独存放)

然后在SQL查询框例如输入查询SQL,或者点击表名右边的三个点,并选择预览表(Preview Table),即可查询并获得样例数据,如下图所示:

我们的博客内容差不多就到此结束了,感兴趣细节的客户或者读者可以在Cloud9和亚马逊云科技的控制台就各个步骤的细节做深入研究或客户化定制。

5.环境清理

虽然绝大部分分配和使用资源型的服务(如ECS,EMR等)会自动终止资源使用,但是如果客户想手工清除环境的话,可以先清空上述测试过程中创建的S3存储桶里面的数据(以rosbag-scenes开头的S3存储桶,当然手工删除这些存储桶也是可以的),然后在代码目录下执行如下脚本即可(大概需要10分钟):

cdk destroy --all

参考文档

参考1: 在亚马逊云科技上构建自动驾驶数据湖:

https://aws.amazon.com/cn/blogs/architecture/field-notes-building-an-autonomous-driving-and-adas-data-lake-on-aws/

参考2: 自动驾驶数据湖之场景检测:

https://aws.amazon.com/cn/blogs/architecture/field-notes-building-an-automated-scene-detection-pipeline-for-autonomous-driving/

参考3: 自动驾驶数据湖(二):图像处理和模型训练:

https://aws.amazon.com/cn/blogs/china/autonomous-driving-data-lake-image-processing-and-model-training/

参考4: 自动驾驶数据湖(三):图像处理流程管道:

https://aws.amazon.com/cn/blogs/china/autonomous-driving-data-lake-image-extraction-pipeline-using-airflow/

参考5: 自动驾驶数据湖(四):可视化:

https://aws.amazon.com/cn/blogs/china/autonomous-driving-data-lake-visualization-using-webviz/

本篇作者

陈卫琼

亚马逊云科技资深解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于大数据和机器学习相关领域的研究。

龙斌

亚马逊云科技解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于容器和机器学习相关领域的研究。

李俊杰

亚马逊云科技解决方案架构师,负责云计算方案的咨询与架构设计,同时致力于容器方面研究和推广。在加入亚马逊云科技之前曾在金融行业IT部门负责传统金融系统的现代化改造,对传统应用的改造,容器化具有丰富经验。

Tang Junjie

唐俊杰先生是亚马逊云科技专业服务部的首席顾问。作为全球技术主管和自动驾驶数据湖的高级产品经理,他负责亚马逊云科技专业服务部的大数据社区,负责制定数据策略并积累各垂直行业数据分析方面的专业知识。

Kevin Soucy

Kevin是亚马逊云科技自动驾驶汽车开发的大数据架构师。他热情得帮助公司大规模构建智能数据驱动产品。

Clive Davies

Clive Davies是亚马逊云科技机器学习解决方案实验室的高级深度学习架构师。他领导着一个科学家和架构师团队,通过AI/ML解决方案为亚马逊云科技的客户提供商业价值。

Antonia Schulze

Antonia Schulze是亚马逊云科技机器学习解决方案实验室的一名数据科学家,她开发机器学习模型来解决客户的业务问题。她与各个垂直领域的客户合作,并运用创造性的问题解决方案,通过最先进的AI/ML解决方案为客户创造价值。