开始使用 Intel® OpenVINO™ 工具包和 AWS Greengrass
本节介绍使用 Amazon Web Services (AWS) Greengrass 和 AWS Lambda 软件实现 FaaS 推理样本(基于 Python 2.7)。
硬件加速的函数即服务 (FaaS) 使用 AWS Greengrass
硬件加速的函数即服务 (FaaS) 使云开发人员能够将推理功能部署到具有加速器(如 Intel® 处理器图形、Intel® FPGA 和 Intel® Movidius™ 神经计算棒)的 Intel® 物联网边缘设备上。这些功能提供了出色的开发人员体验,并能安全地将视觉分析从云迁移到边缘,所有这些都在容器化环境中完成。硬件加速的 FaaS 通过访问 Intel 物联网边缘设备上带加速器的优化深度学习库,提供一流的性能。
本节介绍使用 Amazon Web Services (AWS) Greengrass* 和 AWS Lambda* 软件实现 FaaS 推理样本(基于 Python* 2.7)。AWS Lambda 函数(Lambda)可以在云端创建、修改或更新,并可以通过 AWS Greengrass 从云端部署到边缘。本文档涵盖:
- 样本描述
- 支持的平台
- Intel 物联网® 边缘设备的先决条件
- AWS Greengrass 组的配置
- Lambda 函数的创建和打包
- Lambda 的部署
- 各种推理输出的消费选项
描述
示例文件:greengrass_object_detection_sample_ssd.py
此 AWS Greengrass 示例检测视频流中的物体,并使用单次多框检测 (SSD) 网络(如 SSD SqueezeNet、SSD MobileNet 和 SSD300)对其进行分类。此示例每秒将检测输出(如类别标签、类别置信度和边界框坐标)发布到 AWS IoT* 云。
支持的平台
- 操作系统:Ubuntu* 16.04 (64 位)
- 硬件
- 带有集成 GPU 的 Aaeon* Up2 套件
- 带有集成 GPU 的 IEI* 870 坦克
- 任何 AWS Greengrass 认证的 Intel® 网关,配备 AWS Greengrass常见问题解答中提到的 Intel Atom®、Intel® Core™ 和 Intel® Xeon® 处理器。这些平台包括可用于推理的集成 GPU。
- Intel® Arria® 10 GX 1150 FPGA 开发套件
先决条件
- 下载并安装 Intel® 发行版 OpenVINO™ 工具套件。**演示程序默认安装在 /opt/intel/computer_vision_sdk/ 中。如果工具套件安装在其他位置,请使用该路径作为 <INSTALL_DIR>。
- 安装 Python 2.7* 和 Python*3.0。
注意:AWS Greengrass 需要 Python* 2.7 和 opencv-python、numpy 以及 boto3。使用指令 sudo pip2 将软件包安装在 AWS Greengrass 可访问的位置。Intel® 发行版 OpenVINO™ 工具套件模型优化器需要 Python* 3.0+。
- 创建一个 AWS 账户。
- 要运行样本,Intel® 发行版 OpenVINO™ 工具套件提供了预编译的 libcpu_extension 库,位于目录中:
/opt/intel/computer_vision_sdk/deployment_tools/inference_engine/lib/Ubuntu_16.04/intel64/
- libcpu_extension_sse4.so – 用于 Intel Atom® 处理器
- libcpu_extension_avx2.so – 用于 Intel® Core™ 和 Intel® Xeon® 处理器
- 要在其他设备上运行样本,请重新构建针对特定目标的库以获得性能提升。有关构建说明,请参阅 推理引擎开发人员指南。
预配置
之前的命令会创建带有 .xml 和 .bin 文件扩展名的 IR(中间表示)文件。如果失败,请安装模型优化器的先决条件。
cd install_prerequisites/ ./install_prerequisites.sh
- 在 GitHub 下载 Intel® 边缘优化模型。可以使用任何自定义的预训练分类或 SSD 模型。
git clone https://github.com/intel/Edge-optimized-models.git cd Edge-optimized-models/
- 对于此演示,请使用 Squeesezet 5 类检测模型。将 .caffemodel 和 .prototxt 文件复制到 Intel® 发行版 OpenVINO™ 工具套件模型优化器目录。
cd SqueezeNet\ 5-Class\ detection/ sudo cp SqueezeNetSSD-5Class.* /deployment_tools/model_optimizer/
- 切换到模型优化器目录并运行以下命令来优化模型(此演示中使用 Python* 版本 3.5)
注意:对于 CPU,模型必须使用 FP32 数据类型以获得最佳性能。对于 GPU 和 FPGA,模型必须使用 FP16 数据类型以获得最佳性能。有关如何使用模型优化器的更多信息,请遵循 Intel® 发行版 OpenVINO™ 工具套件模型优化器 上的说明。
cd /deployment_tools/model_optimizer/ sudo python3 mo.py --input_model SqueezeNetSSD-5Class.caffemodel --input_proto SqueezeNetSSD-5Class.prototxt --data_type FP16
- 在您的主目录中创建一个新文件夹,用于存储稍后 Greengrass 将访问的 IR 文件。将 .xml 和 .bin 文件复制到此目录。
mkdir ~/greengrass-input-files cp SqueezNetSSD-5Class.xml SqueezeNetSSD-5Class.bin ~/greengrass-input-files
将输入视频添加到文件夹
将输入视频添加到 ~/greengrass-input-files 文件夹。上传自定义视频或选择 示例视频 之一。在此演示中,我们使用 SqueezeNet 5 类模型,该模型检测自行车、公交车、汽车、摩托车和行人等类别。请确保选择合适的视频,以便模型能够做出有效的推理。
配置 AWS Greengrass 组
对于每个 Intel 边缘平台,创建一个新的 AWS Greengrass 组并安装 AWS Greengrass 核心软件,以建立云和边缘之间的连接。请遵循 AWS Greengrass 开发人员指南中的说明。要创建 AWS Greengrass 组,请参阅 在 AWS IoT 上配置 AWS Greengrass。要在边缘平台上安装和配置 AWS Greengrass 核心,请参阅 边缘平台上的 AWS Greengrass 核心。
在边缘设备上配置 Greengrass 后,设置组和用户权限以启动守护进程。运行以下命令:
sudo adduser --system ggc_user sudo addgroup --system ggc_group
通过键入以下内容启动守护进程:
cd /greengrass/ggc/core/ sudo ./greengrassd start
打包 Lambda 函数
本节介绍如何
- 创建项目目录
- 下载 AWS Greengrass SDK
- 打包 Lambda 文件。
- 创建一个项目文件夹来存储 Lambda 函数的文件。
mkdir ~/greengrass_project
- 要下载 Python* 2.7 的 AWS Greengrass Core SDK,请遵循 AWS Greengrass 开发人员指南,创建和打包 Lambda 函数(步骤 1-3)。
- 接下来解压 tar 包的内容:
sudo tar –xvf <Download_Location>/greengrass-core-python-sdk-1.2.0.tar.gz cd aws_greengrass_core_sdk/examples/HelloWorld sudo unzip greengrassHelloWorld.zip cd greengrassHelloWorld
此步骤创建 greengrasssdk 目录。部署 Lambda 到边缘设备需要 SDK。 - 将其复制到项目文件夹中。
cp -r greengrasssdk/ ~/greengrass_project
- 使用 Intel® 发行版 OpenVINO™ 工具套件中的
object_detection_demo
。将此文件复制到项目文件夹中。cp <INSTALL_DIR>/deployment_tools/inference_engine/samples/python_samples/greengrass_samples/greengrass_object_detection_sample_ssd.py ~/greengrass_project
- 最后,将 greengrass_common 和 greengrass_ipc_python_sdk 目录复制到项目文件夹中。
cd /greengrass/ggc/packages/1.6.0/runtime/python2.7/ cp -r greengrass_common/ ~/greengrass_project cp -r greengrass_ipc_python_sdk/ ~/greengrass_project
- 更改目录(cd)到 ~/greengrass_project 以查看以下内容:
- greengrass_common
- greengrass_ipc_python_sdk
- greengrasssdk
- greengrass_object_detection_sample_ssd.py
- 将这些文件压缩以上传到 AWS Lambda。
zip -r greengrass_sample_python_lambda.zip greengrass_common greengrass_ipc_python_sdk greengrasssdk greengrass_object_detection_sample_ssd.py
使用 AWS CLI 创建 Lambda 函数
此演示涉及使用 AWS CLI 创建 Lambda。CLI 允许更新指向 Lambda 代码的别名。此功能对于频繁更改 Lambda 代码的用户非常有用。
$ aws lambda create-function \ --region region \ --function-name greengrass_object_detection \ --zip-file fileb://~/greengrass-project/greengrass_sample_python_lambda.zip \ --role role-arn \ --handler greengrass_object_detection_sample_ssd.function_handler \ --runtime python2.7 \ --profile default
注意:在此演示中,我们将 --region 设置为 **us-east-1**,将 --role-arn 设置为我们要应用的 IAM 角色 ARN。您可能需要先创建 IAM 角色才能使用 Lambda。确保 --handler 的格式为:<mainfile_name>.function_handler
,并且您的区域与您的 Greengrass 组相同。
aws lambda create-alias \ --region region \ --function-name greengrass_object_detection \ --description "Alias for Greengrass" \ --function-version 1 \ --name GG_Alias \ --profile default
如果您在创建 Lambda 函数时遇到问题,请参阅 AWS Greengrass 开发人员指南,教程:使用 AWS Lambda 别名。
- 要设置 AWS CLI,请遵循 AWS Greengrass 开发人员指南,设置 AWS 命令行界面(步骤 1-3)。
- 在正确配置 AWS CLI 后,使用 AWS CLI 创建 Lambda。在终端中输入以下命令:
- 发布第一个版本
aws lambda publish-version \ --region region \ --function-name greengrass_object_detection \ --profile default
- 为此 Lambda 创建一个别名
- 登录 AWS 并导航到 Lambda 控制台。在函数下找到
greengrass_object_detection
。点击链接查看 Lambda 的内容和信息。
Lambda 的部署
配置 Lambda 函数
创建 AWS Greengrass 组和 Lambda 函数后,为 AWS Greengrass 配置 Lambda 函数。请遵循 AWS Greengrass 开发人员指南中的说明,为 AWS Greengrass 配置 Lambda 函数(步骤 1-8)。
在编辑 Lambda 配置时,使用您之前遵循的说明中的 Lambda 名称和别名。此外,在步骤 8 中,将内存限制更改为 2048MB,以适应大型输入视频流。
将表 1 中的环境变量作为键值对添加,然后单击更新。请参阅表 2 获取演示中使用的键值对。
表 1. 环境变量:键值对
键 | 值 |
LD_LIBRARY_PATH | <INSTALL_DIR>/opencv/share/OpenCV/3rdparty/lib |
PYTHONPATH | <INSTALL_DIR>/deployment_tools/inference_engine/python_api/Ubuntu_1604/python2 |
PARAM_MODEL_XML | <MODEL_DIR>/<IR.xml>,其中 <MODEL_DIR> 是用户指定的,包含来自 Intel 模型优化器的中间表示文件 IR.xml。 |
PARAM_INPUT_SOURCE | <DATA_DIR>/input.mp4,由用户指定。包含输入和输出数据。 |
PARAM_DEVICE | 对于 CPU,指定 `CPU`。对于 GPU,指定 `GPU`。对于 FPGA,指定 `HETERO:FPGA,CPU`。 |
PARAM_CPU_EXTENSION_PATH | <INSTALL_DIR>/deployment_tools/inference_engine/lib/Ubuntu_16.04/intel64/<CPU_EXTENSION_LIB>,其中 CPU_EXTENSION_LIB 对于 Intel Atom® 处理器是 |
PARAM_OUTPUT_DIRECTORY | <DATA_DIR>,由用户指定。包含输入和输出数据。 |
PARAM_NUM_TOP_RESULTS | 用户为分类样本指定(例如,1 表示 top-1 结果,5 表示 top-5 结果)。 |
注意:表 1 列出了 Greengrass 部署期间访问的环境变量的通用路径。环境变量路径取决于安装的 Intel® 发行版 OpenVINO™ 工具套件的版本。在没有 AWS Greengrass 的情况下运行 Intel® 发行版 OpenVINO™ 工具套件应用程序时,首先会源 <INSTALL_DIR>/bin/setupvars.sh 脚本。但是,对于 Greengrass 部署,环境变量会通过 Lambda 配置进行源设置。
此演示在 Up Squared* 平台上使用 Intel® 发行版 OpenVINO™ 工具套件 R3。表 2 列出了 Lambda 配置的环境变量。
表 2. 环境变量:演示的键值对
键 | 值 |
LD_LIBRARY_PATH | /opt/intel/computer_vision_sdk_2018.3.343/opencv/share/OpenCV/3rdparty/lib:/opt/intel/computer_vision_sdk_2018.3.343/opencv/lib:/opt/intel/opencl:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/inference_engine/external/cldnn/lib:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/inference_engine/external/gna/lib:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/inference_engine/external/mkltiny_lnx/lib:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/inference_engine/lib/ubuntu_16.04/intel64:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/model_optimizer/model_optimizer_caffe/bin:/opt/intel/computer_vision_sdk_2018.3.343/openvx/lib |
PYTHONPATH | /opt/intel/computer_vision_sdk_2018.3.343/python/python2.7:/opt/intel/computer_vision_sdk_2018.3.343/python/python2.7/ubuntu16:/opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/model_optimizer |
PARAM_MODEL_XML | /home/upsquared/greengrass-input-files/SqueezeNetSSD-5Class.xml |
PARAM_INPUT_SOURCE | /home/upsquared/greengrass-input-files/sample-videos/inputvideo.mp4 |
PARAM_DEVICE | GPU |
PARAM_CPU_EXTENSION_PATH | /opt/intel/computer_vision_sdk_2018.2.319/deployment_tools/inference_engine/lib/ubuntu_16.04/intel64/libcpu_extension_sse4.so |
PARAM_OUTPUT_DIRECTORY | /home/upsquared/greengrass-output |
PARAM_NUM_TOP_RESULTS | 3 |
表 3 列出了 Intel® Arria® 10 GX FPGA 开发套件的 LD_LIBRARY_PATH 和其他环境变量。
表 3. 环境变量:Intel® Arria® 10 GX FPGA 开发套件的其他键值对
键 | 值 |
LD_LIBRARY_PATH | /opt/altera/aocl-pro-rte/aclrte-linux64/board/a10_ref/linux64/lib /opt/altera/aocl-pro-rte/aclrte-linux64/host/linux64/lib <INSTALL_DIR>/opencv/share/OpenCV/3rdparty/lib <INSTALL_DIR>/opencv/lib:/opt/intel/opencl <INSTALL_DIR>/deployment_tools/inference_engine/external/cldnn/lib <INSTALL_DIR>/deployment_tools/inference_engine/external/mkltiny_lnx/lib <INSTALL_DIR>/deployment_tools/inference_engine/lib/ubuntu_16.04/intel64 <INSTALL_DIR>/deployment_tools/model_optimizer/model_optimizer_caffe/bin <INSTALL_DIR>/openvx/lib |
DLA_AOCX | <INSTALL_DIR>/a10_devkit_bitstreams/0-8-1_a10dk_fp16_8x48_arch06.aocx |
CL_CONTEXT_COMPILER_MODE_INTELFPGA | 3 |
添加订阅
要订阅或发布来自 AWS Greengrass Lambda 函数的消息,请遵循 AWS Greengrass 开发人员指南,为 AWS Greengrass 配置 Lambda 函数(步骤 10-14)。
可选的主题过滤器字段应在 Lambda 函数中提及。例如,openvino/ssd 是 greengrass_object_detection_sample_ssd.py 中使用的主题。
配置本地资源
要授予 Greengrass 访问硬件资源以及环境变量路径的权限,请遵循 AWS Greengrass 开发人员指南。
表 4. 资源访问
名称 | 资源类型 | 本地路径 | 访问 |
InputDir | 卷 | home/<username>/greengrass-input-files | 只读 |
网络摄像头
| Device
| /dev/video0
| 只读
|
输出目录
| 卷
| home/<username>/greengrass-output
| 读写
|
OpenVINOPath
| 卷
| <INSTALL_DIR> (OpenVINO 安装位置)
| 只读
|
注意:如果使用网络摄像头而不是预录制的视频,请修改 greengrass_object_detection_sample_ssd.py 中的代码。
更改 PARAM_INPUT_SOURCE 行:
从:PARAM_INPUT_SOURCE = os.environ.get("PARAM_INPUT_SOURCE")
到:PARAM_INPUT_SOURCE = 0
0 值表示 /dev 文件夹中视频设备的后缀。
表 5. GPU 资源访问
名称 | 资源类型 | 本地路径 | 访问 |
GPU | Device | /dev/dri/renderD128 | 读写 |
表 6. FPGA 资源访问
名称 | 资源类型 | 本地路径 | 访问 |
FPGA | Device | /dev/acla10_ref0 | 读写 |
FPGA_DIR1 | 卷 | /opt/Intel/OpenCL/Boards | 读写 |
FPGA_DIR2 | 卷 | /etc/OpenCL/vendors | 读写 |
添加角色
最后,为 Greengrass 组添加一个角色。
1. 转到 Greengrass 控制台 > 组。选择您的组名。
2. 在组角色部分选择设置和添加角色。
注意:您可能需要先创建 Greengrass IAM 角色,然后再遵循添加角色说明。添加角色是上传图像到 S3 和访问其他 AWS 资源所必需的。
部署
要将 Lambda 函数部署到 AWS Greengrass 核心设备,请在组页面上选择部署,并遵循 将云配置部署到 AWS Greengrass 核心设备 中的说明。
首次部署时,可能会发生错误。
- 要修复此错误,请授予 ggc_user:ggc_group 访问 Intel® 发行版 OpenVINO™ 工具套件安装位置的权限。在命令行中,在核心设备上输入:
chown ggc_user:ggc_group /opt/intel/computer_vision_sdk
- 如果错误再次发生,请对其他目录重复相同的 chown 过程。此外,请确保在不插入网络摄像头的情况下删除它,否则部署 Lambda 时会发生错误。
更新/更改 Lambda 代码
本节介绍如何在更改 Lambda 控制台中的代码后,将新版本的 Lambda 部署到 AWS Greengrass。例如,修改 greengrass_object_detection_sample_ssd.py 需要部署新版本。
- 在 Lambda 控制台内,选择操作 > 发布新版本。
- 在终端中使用 AWS CLI,更新别名以指向新版本。
aws lambda update-alias \ --region region \ --function-name greengrass_object_detection \ --function-version 2 \ --name GG_Alias \ --profile default
对于 --function-version,请指定您在 Lambda 控制台中发布的函数版本。
输出消耗
有四种可用的输出消耗选项:
- AWS IoT 云输出
- AWS Kinesis 流*
- 使用 AWS S3 存储桶的云存储*
- 本地存储
这些选项用于按照 AWS Greengrass 样本中 reporting_interval 变量定义的间隔报告、流式传输、上传和存储推理输出。
描述
AWS IoT 云输出
AWS Greengrass 样本默认启用 AWS IoT 云输出,使用变量 enable_iot_cloud_output。该选项验证在边缘设备上运行的 Lambda。它还使用 Lambda 中指定的订阅主题启用向 AWS IoT 云发布消息。例如,该选项使用 openvino/classification 订阅主题发布分类消息。该选项将顶部类别标签发布到 AWS IoT 云。它使用 openvino/ssd 订阅主题用于对象检测样本。对于 SSD 对象检测,它发布对象的边界框坐标、类别标签和类别置信度。
要查看 AWS IoT 云上的输出,请遵循 AWS Greengrass 开发人员指南,验证 Lambda 函数是否在设备上运行。
AWS Kinesis 流
当 enable_kinesis_output 设置为 True 时,AWS Kinesis 流选项允许将推理输出从边缘设备流式传输到云端。边缘设备充当数据生产者,并持续将处理后的数据推送到云端。用户在 AWS Greengrass 样本中设置和指定 AWS Kinesis 流名称、AWS Kinesis 分片和 AWS 区域。
使用 AWS S3 存储桶的云存储*
当 enable_s3_jpeg_output 变量设置为 True 时,使用 AWS S3 存储桶的云存储选项允许将处理后的帧(JPEG 格式)上传和存储到 AWS S3* 存储桶中。用户需要在 AWS Greengrass 样本中设置和指定 AWS S3 存储桶名称来存储 JPEG 图像。图像的命名包含时间戳,并上传到 AWS S3。
本地存储
本地存储选项允许在 enable_s3_jpeg_output 变量设置为 True 时,将处理后的帧(JPEG 格式)存储在边缘设备上。图像的命名包含时间戳,并存储在 PARAM_OUTPUT_DIRECTORY 指定的目录中。