亚马逊AWS官方博客

在AWS上构建基于SOAFEE的云原生软件定义汽车实践

随着汽车行业智能化、网联化的加速发展,以智能座舱、辅助驾驶与自动驾驶、车联网为代表的汽车软件不断推陈出新,传统以ECU为核心面向信号的分布式电子电气架构很难满足智能网联时代消费者对汽车的需求,新一代的电子电气架构朝着集中化的方向演进,域控制器已成为主流,未来将会出现车载中央计算平台。汽车硬件会朝着标品化方向发展,车辆功能与用户体验的差异性依靠车载软件与云上服务来体现,“软硬件解耦、硬件预埋、软件升级”将会带来汽车更长生命周期内的价值持续释放。软件定义汽车已经成为行业的共识,但企业需要构建新的软件开发能力来应对软件定义时代的挑战。例如,为提高开发的效率,避免在昂贵且有限的嵌入式平台上开发,而是采用算力更强大、资源供给更便捷的通用计算平台;具备敏捷开发能力,软件代码的构建、持续集成与验证工作能够自动执行,以便快速验证,满足软件迭代的要求;加强软件的可移植性,在开发环境中编译的程序需要在不同的嵌入式设备中运行,包括硬件台架、板卡、车端,避免环境的差异性带来代码重构和重复编译对研发效率的降低;海量数据的管理包括数据存储、查找、处理,加速AI/ML模型的训练过程;降低软件组件之间的相互依赖性,减少软件升级对其他功能的影响,不同安全要求与实时性要求的软件相互隔离与独立;车载软件代码量越来越多,要能够有效管理维护这些代码,并利用更广泛的生态资源与能力共同开发软件。

2021年由Arm、AWS和其他创始成员共同宣布成立嵌入式边缘的可扩展开放架构SOAFEE(Scalable Open Architecture For Embedded Edge)特别兴趣小组(SIG),联合车厂、半导体公司、软件公司、云技术的领导企业共同定义一个新的开放标准架构来实现软件定义汽车的最低级别技术栈,提供一个参考实现,使云原生技术(如微服务、容器和编排系统)首次与汽车功能安全相结合,从而保持环境对等。

基于AWS云上的服务和云原生技术,结合SOAFEE提供的环境对等技术栈,我们可以将车载软件的开发工作放在云上,利用云的弹性资源供给和随处可访问性,让开发人员能够并行的进行开发测试,能够满足海量数据处理与训练和测试验证工作所需要的计算能力;通过持续集成/持续部署(CI/CD)工具链让代码从提交到编译验证,再到部署到目标嵌入式设备,实现自动化的完成,提升迭代效率;微服务技术与容器化技术确保面向服务架构设计的应用系统运行在容器中,运行环境独立,既能够独立更新部署,也能够利用SOAFEE提供的混合任务编排器确保了容器运行所需的功能安全与实时性要求得到满足;云上AWS Graviton提供与车端对等指令集(ISA)环境,编译验证后的软件可以顺利的运行在基于Arm IP授权芯片的HPC、硬件台架和车上;SOAFEE的开放架构,以及亚马逊云科技对开源生态的支持,能够利用开源技术赋能汽车软件的开发,加快汽车软件的开发效率,显著降低研发成本,让软件定义汽车成为可能。

本文将介绍如何在AWS 云上构建基于SOAFEE的云原生软件定义汽车的实践,它基于ARM架构的AWS Graviton 实例构建云上符合SOAFEE规范的对等环境,使用AWS 原生的CI/CD 工具链,汽车软件在云上构建与验证,并通过AWS IoT Greengrass部署到端侧AVA开发者平台的对等环境中运行,实现车云一体的云原生汽车软件开发流程。

关于AWS Graviton,AWS CodePipeline,AWS CodeBuild,Amazon ECR, AWS IoT Greengrass

基于ARM IP由AWS自定义SoC的 AWS Graviton 处理器为 Amazon EC2 中运行的云工作负载提供最佳性价比,是运行高级计算密集型工作负载的理想选择。其中包括例如高性能计算(HPC)、批处理、广告投放、视频编码、游戏、科学建模、分布式分析和基于 CPU 的机器学习推理等在内的工作负载。

AWS CodePipeline 是一种完全托管的持续集成与持续交付服务,可以帮助您实现发布管道的自动化,从而实现快速而可靠的应用程序和基础设施更新。

AWS CodeBuild 是一项完全托管的持续集成服务,可编译源代码、运行测试以及生成可供部署的软件包。使用 CodeBuild,您无需预置、管理和扩展自己的构建服务器。
Amazon Elastic Container Registry (Amazon ECR)是完全托管式容器注册表,提供高性能托管,让您能在任何地方可靠地部署应用程序映像和构件。

AWS IoT Greengrass 是一种开源边缘运行时和云服务,用于构建、部署和管理设备软件。使用预构建或定制的模块化组件更快地完成构建,您可以轻松地添加或移除这些组件以控制设备软件部署。大规模地远程部署和管理设备软件和配置,无需固件更新。通过 AWS IoT Greengrass 能够轻松地为边缘设备带来智能。

解决方案架构综述

本方案阐述了在AWS 云上构建基于SOAFEE开放架构及云原生概念的软件定义汽车的方案。它基于ARM架构的AWS Graviton 实例构建云端符合SOAFEE规范的环境,使用AWS 原生的DevOps CI/CD 工具链,实现云端构建应用镜像,通过AWS IoT Greengrass部署到云端环境运行,测试,之后部署到端侧同样符合SOAFEE规范的AVA开发者平台或树莓派对等硬件环境运行,测试。实现了车云环境对等的云原生软件开发流程。方案的整体架构如下:

先决条件

  • • 一个AWS账户,Admin用户权限及相应Access Key/Secrete key
  • 一部开发主机或EC2虚拟机,Mac或Linux,安装AWS Command Line Interface
  • AVA Developer Platform
  • 一部树莓派4B

演练操作步骤

本演练操作中有四个部分:

  • 在AWS云上部署CI/CD 流水线
  • 部署SOAFEE规范的云端Graviton实例环境
  • 配置车端SOAFEE规范的AVA Developer Platform或树莓派环境
  • 触发CI/CD流水线,车云对等环境运行YOLO-V6应用

一,在AWS上部署CI/CD 流水线

本部分将在使用CDK在AWS cn-north-1区域部署CI/CD流水线。

a).在开发主机上clone CDK代码:

https://github.com/gaoykxp/aws-automotive-soafee-env-parity-blog

git clone https://github.com/gaoykxp/aws-automotive-soafee-env-parity-blog.git

b). aws configure 配置账户access key,secrete key:

aws configure
AWS Access Key ID [****************WO5D]: 
AWS Secret Access Key [****************cJ8M]: 
Default region name [cn-north-1]: 
Default output format [json]:

c).  配置CDK环境:

export ACCOUNT_ID=<ACCOUNT_ID>
export AWS_REGION=cn-north-1
cd aws-automotive-soafee-env-parity-blog/ 
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade aws-cdk.core==1.99.0 wheel pandas pillow cython pycocotools matplotlib
pip install -r requirements.txt
cdk bootstrap aws://$ACCOUNT_ID/$AWS_REGION
cdk synth
cdk ls

输出结果如图所示

d).  构建CI/CD流水线:

cdk deploy yolo-v6-application-pipeline

构建过程中输入“y”确认构建,构建过程大概持续几分钟。

你可以在CloudFormation Console 中看到yolo-v6-application-pipeline 构建成功。

在CodePipeline的Console中可以看到yolo-v6-applicaion 的pipeline。

在CodeCommit中可以看到构建了一个空的yolo-v6-application  repository。

二,部署SOAFEE规范的云端Graviton实例环境

在本节中,您将部署一个支持SOAFEE规范的YoctoEWAOL  Linux AMI 到基于AWS Graviton2的EC2实例。我们预先根据guide 制作了一个AMI共享到community。您也可以按照guide自行构建AMI,部署在其他AWS 区域,进行本博客的演练。

a).  登录AWS cn-north-1 的EC2 控制台:

点击 Launch instance,

在Step 1: Choose an Amazon Machine Image (AMI) 的搜索框中输入AMI:ami-055b51e617a37d3c9,在Community AMI中会找到这个AMI镜像。

b).  选择Select构建EC2实例:

Instance type:t4g.medium

Storage: 32GB

其它选择默认设置。

Launch,

选择使用已存在的key pair或者构建一个新的key pair, 这个Key pair用来后续登录EC2做相关工作。

Launch Instance, 可以看到符合SOAFEE规范的基于ARM 的 AWS Graviton2 t4g实例构建成功。

c).  登录EC2:

参考指南登录你的EC2,可以使用指南中推荐的方式或者其他SSH客户端,使用步骤b)保存的key,用户名:ewaol ,登录EC2。

d).  调整root partition 空间大小:

你可以逐条指令执行,或者创建一个批处理脚本,执行前后用df -h命令查看调整结果。

#!/bin/sh
# disabling swap
swapoff -a
sed -i '/.*swap.*/d' /etc/fstab
# trick to fix GPT
printf "fix\n" | parted ---pretend-input-tty /dev/nvme0n1 print
# remove partition 3 (swap)
parted -s /dev/nvme0n1 rm 3
# resize partition 2 to use 100% of available free space
parted -s /dev/nvme0n1 resizepart 2 100%
# resizing ext4 filesystem
resize2fs /dev/nvme0n1p2

e).  Pull Greengrass docker 镜像:

docker login -u gaoykxp
password: dckr_pat_V2EdQvcBONakG2HBcTan168yi14

docker pull gaoykxp/greengrass-v2-ubuntu-2204-aarch64:0.2

f).  创建Greengrass核心设备:

执行如下命令运行greengrass docker容器:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --user root gaoykx
p/greengrass-v2-ubuntu-2204-aarch64:0.2 /bin/bash

设置环境变量,使用access key 和secret key:

cd /home
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxx

执行以下命令创建并注册greengrass核心设备:

java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region cn-north-1 \
  --thing-name MySOAFEE-EC2-GreengrassCore \
  --thing-group-name MySOAFEE-EC2-GreengrassCoreGroup \
  --thing-policy-name GreengrassV2IoTThingPolicy \
  --tes-role-name GreengrassV2TokenExchangeRole \
  --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true

/greengrass/v2/alts/current/distro/bin/loader 启动greengreass。

在IoT Core的控制台中可以看到新创建的Greengrass 核心设备。

三,配置车端SOAFEE规范的AVA Developer Platform或树莓派环境

AVA Developer Platform是凌华科技(ADLINK)对汽车开发者平台,搭载了基于ARM Neoverse的Ampere处理器,作为高性能32核计算系统,能够运行自主工作负载,它允许开发人员利用加速器硬件(例如GPU)来补充高性能中央处理器(CPU)。它更切近汽车实际运行的计算平台,如果你有机会拿到AVA开发平台,可以按照以下步骤操作Yocto-EWAOL的环境到AVA环境。

a).  设置AVA 符合SOAFEE规范的Yocto-EWAOL环境:

Yocto and EWAOL 是ARM SOAFEE规范的一种实现,请按照指南内容设置AVA Developer Platform,限于篇幅,这里不做细节介绍。

b).  登录创建Greengrass核心设备:

SSH登录AVA控制终端,用户名root,密码为空。

按照“二,部署SOAFEE规范的云端Graviton实例环境”部分, 步骤e)Pull Greengrass docker 镜像, f) 创建Greengrass核心设备。

注意将thing-name修改,以区分云端EC2的Greengrass核心设备。

java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region cn-north-1 \
  --thing-name MySOAFEE-Edge-GreengrassCore \
  --thing-group-name MySOAFEE-Edge-GreengrassCoreGroup \
  --thing-policy-name GreengrassV2IoTThingPolicy \
  --tes-role-name GreengrassV2TokenExchangeRole \
  --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true

创建成功后在IoT Core控制台看到新创建的Greengrass 核心设备。

树莓派是一种低成本嵌入式单板计算机,具有基于ARM的集成CPU。就本博客而言,如果您没有AVA开发平台,它可以作为我们介绍的车云环境对等概念的快速开发验证目标。

a).  设置树莓派4B 符合SOAFEE规范的Yocto-EWAOL的环境:

请按照workshop的内容设置树莓派4B,限于篇幅,这里不做细节介绍。

b).  创建Greengrass核心设备:

SSH登录树莓派的控制终端,用户名: root ,密码: aws_workshop。

按照“二,部署SOAFEE规范的云端Graviton实例环境” 步骤e)Pull Greengrass docker 镜像, f) 创建Greengrass核心设备。

注意将thing-name修改,以区分云端EC2的greengrass核心设备。

其它操作和AVA平台一样。

java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region cn-north-1 \
  --thing-name MySOAFEE-Edge-GreengrassCore \
  --thing-group-name MySOAFEE-Edge-GreengrassCoreGroup \
  --thing-policy-name GreengrassV2IoTThingPolicy \
  --tes-role-name GreengrassV2TokenExchangeRole \
  --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true

四,触发CI/CD流水线,车云对等环境运行YOLO-V6应用

这个部分将演示提交YOLO-V6应用代码,CodeBuild的构建配置文件,提交到CodeCommit,并触发CodePipleline 流水线,构建YOLO-V6 Docker镜像,推送到ECR。Manual Approve后,通过IoT Core,Greengrass部署YOLO-V6应用到云端环境,测试,验证。最后,Manual Approve 后,部署到车边缘环境进行测试。

第一部分,云端EC2 对等环境部署,测试:

a).  将build file, YOLO-V6 应用代码,推理图片复制到yolo-v6-application 本地repository:

git clone https://git-codecommit---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/v1/repos/yolo-v6-application
cp -r ~/aws-automotive-soafee-env-parity-blog /yolo_v6_image_src /* ~/yolo-v6-application/

b).  提交代码,触发流水线:

CodeCommit 用户名,密码可以到IAM, Users,Security Credentials获取,

HTTPS Git credentials for Amazon CodeCommit 获取。

cd ~/yolo-v6-application
git add .
git commit -m "First commit yolo v6 sample application."
git push

c).  构建YOLO-V6应用镜像,推送到ECR:

d).  在CodePipeline中Manual Approval 中approve, 将YOLO-v6部署到云端EC2 SOAFEE环境。

这个过程将YOLO-v6的Docker镜像构为建Greengrass的Component,通过IoT Core将Component部署到EC2中。确保“二,部署SOAFEE规范的云端Graviton实例环境”部分中的Greengrass在正常运行。在IoT Core中查看部署的状态。

e).  部署成功之后,登录到EC2控制端,验证YOLO-v6 应用。

查看新的YOLO-v6 镜像是否已经pull到EC2。

运行命令运行YOLO-v6应用,它将执行图片推理的操作,并把推理结果保存在EC2 host主机的~/predictions   文件夹下:

docker run -v ~/predictions:/home/YOLOv6/runs 501234xxxxxx---dkr---ecr---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/yolo-v6-application:latest

将图片从EC2中scp命令或者SFTP客户端将推理后的图片下载到本地电脑查看。

第二部分,车端对等环境部署,测试:

a).  在CodePipeline的Manual Approval 中approve, 将YOLO-v6部署到边缘端 SOAFEE环境。

确保“二,部署SOAFEE规范的云端Graviton实例环境”部分的Greengrass在正常运行。在IoT Core中查看部署的状态。

b).  部署成功之后,登录到车边缘设备控制端,验证YOLO-v6 应用。

我们这里以AVA操作为例,树莓派操作步骤一致。

打开另外一个scp 客户端,登录AVA平台,查看刚刚部署的YOLO-v6 docker应用镜像。

运行命令运行YOLO-v6应用,它将执行图片推理的操作:

docker run -v ~/predictions:/home/YOLOv6/runs 501234xxxxxx---dkr---ecr---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/yolo-v6-application:latest

在~/predictions 文件夹下找到推理后的照片,如云端EC2中的操作一样,可以将其scp 下载到本地电脑查看。

清理环境

演练结束之后,请将相关服务资源关闭。

在aws-automotive-soafee-env-parity-blog文件夹下执行命令清理cdk创建的资源:

cdk destroy

在EC2的控制台中Terminate EC2实例。

总结

在本文中,我们按步骤介绍了如何在AWS 云上构建基于SOAFEE开放架构及云原生概念的软件定义汽车的方案。包括构建云端符合SOAFEE规范基于AWS Graviton 实例的环境,及构建车边缘端符合SOAFEE规范的AVA平台及树莓派对等环境。 并使用AWS 原生的DevOps CI/CD 工具链,实现云端构建应用,云端环境运行,测试,车端对等硬件环境运行,测试。实现了车云环境对等的云原生软件开发流程。

参考资料

Getting Started with Cloud-Native Automotive Software Development

本篇作者

高业坤

AWS专业服务团队IoT架构师。负责基于Amazon IoT的解决方案咨询,架构与交付,深度参与过智慧工厂,IP Camera智能视觉等行业的IoT解决方案的咨询与交付。在智能家居、智慧安防、智能硬件等IoT行业拥有十年以上软件研发管理经验。

李焱

AWS专业服务团队企业服务经理,有20年的从业经验,担任过软件工程师、咨询顾问、解决方案经理、业务拓展经理等不同角色,有丰富的汽车行业解决方案与业务拓展经验,目前亚马逊云科技负责软件定义汽车解决方案的设计与业务推广。