亚马逊AWS官方博客

在中国区使用 Amazon IoT 和 Amazon SageMaker 进行设备实时预测性维护

物联网(IoT)的一个典型应用场景是能够从传感器数据中获取上下文洞察力,例如分析设备异常或者进行预测性维护,及时给予用户通知。在本文中,我们将专注于通过设备多项指标对设备进行预测性维护,利用机器学习算法,对设备运行状态进行预测,提前发现可能出现的异常,及时进行维护,避免出现严重的生产事故。

方案概述

本文使用机器学习方法进行预测性维护,采用风力发电机模拟数据为示例数据集,利用Amazon SageMaker进行模型训练,并且部署推理端点。边缘侧设备将数据发布到Amazon IoT Core,使用IoT规则触发Lambda函数调用部署在Sagemaker上面的预测性维护端点的API,判断设备是否将出现异常,如出现异常,通过更新Amazon IoT Shadow从而自动关闭设备并发送通知。

我们使用的算法称为XGBoost (eXtreme Gradient Boosting),它是一种监督式学习算法, 尝试将一组较简单且较弱模型的一系列估计值结合在一起,从而准确地预测目标变量,可以用来处理回归、分类(二进制和多类)和排名问题。利用XGBoost预测设备是否会损坏,进行提前预测性维护。

本文中的演示使用风力发电机模拟数据,数据字段包括:

风速:wind_speed

叶片转速:RPM_blade

油温:oil_temperature

油位:oil_level

温度:temperature

湿度:humidity

振动频率vibrations_frequency

压力:pressure

风向:wind_direction

是否损坏:breakdown

您可以使用此解决方案自动检测潜在的设备故障,并提供建议采取的措施。 该解决方案易于部署,并包含示例数据集,您也可以修改该解决方案并使用其他数据集,从而构建您自己的IoT预测性维护方案。

下图显示了本方案采用的架构

  1. 用于预测性维护的模型利用了存储在S3上的设备历史数据在Amazon SageMaker上进行训练。
  2. 训练好的模型利用SageMaker部署并暴露Endpoints提供预测服务。
  3. 数据从传感器发送到 IoT Core,通过IoT Rules Engine路由到Lambda函数。 Lambda函数通过Sagemaker Endpoints调用预测性维护的机器学习模型。当检测到异常,Lambda函数将发送通知,并通过IoT Shadow对设备进行相应操作。

在本文中,我们将引导您完成以下操作:

  1. 设置连接的设备与 IoT Core进行通信
  2. 训练和部署SageMaker模型
  3. 创建云资源以监视和检测可能出现行为异常的设备
  4. 利用模拟设备进行预测性维护测试并发送通知

实验准备: IoT 设备模拟

本文采用Cloud9 作为IoT 设备的模拟,从Cloud9上面发出模拟IoT消息。

在EC2 控制台,启动一台EC2 实例,搜索 Marketplace上的Cloud9。

创建 IoT 策略

  1. 打开 IoT 控制
  2. 选择Secure (安全)-> Policies (策略)。在 You don’t have a policy yet 页面上,选择 Create a policy。如果您的账户之前已经创建过策略,请选择 Create.

  1. 创建策略页面
    • Name (名称) 中,输入策略的名称Windturbine_Policy
    • Action (操作) 字段中,输入iot:Connect,iot:Receive,iot:Publish,iot:Subscribe。 这些是设备在从设备开发工具包运行示例程序时需要执行的权限。有关 IoT 策略的更多信息,请参阅IoT Core 策略
    • Resource ARN (资源 ARN 字段中,输入 *。 这会选择任何客户端(设备)。
    • 选中Allow 复选框
    • 在输入策略的信息后,选择Create

创建IoT设备

  1. 打开 IoT 控制
  2. 选择 管理 -> 物品 (Things)
    You don’t have any things yet (您还没有任何事物) 上,选择 Register a thing (注册事物)。如果您的账户已经创建过一些事物,请选择 Create.

  1. 创建 IoT 物品上,选择创建单个物品
  2. Name (名称)字段中,输入物品的名称windturbine将此页面上的其余字段留空。选择 Next (下一步).
  3. Add a certificate for your thing (添加事物的证书) 上,选择 Create certificate
  4. Certificate created! (证书已创建! 页面上
    • 下载每个证书和密钥文件并将它们保存以供将来使用
证书文件 文件路径
私有密钥 private.pem.key
Public key (不在这些示例中使用)
设备证书 device.pem.crt
根 CA 证书 AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
    • 点击Activate激活证书
  1. 选择Attach a policy,用于将您在上一部分中创建的策略附加到此证书
  2. 在 Add a policy for your thing (添加物品的策略) 上,选择您在上一部分中创建的策略Windturbine_Policy
  3. 选择 Register Thing

详细步骤请参考:

https://docs.amazonaws.cn/iot/latest/developerguide/create-iot-resources.html

创建Amazon SageMaker 笔记本实例,训练和部署模型

  1. 创建一个笔记本实例windturbine,选择t2.medium。选择或者创建一个IAM角色(IAM Role)
  2. 其他部分选择默认选项,点击创建(Create)

  1. 在笔记本创建完成后,打开Jupyter Lab,上传笔记本ipynb到Jupyter Lab。选择内核为conda_python3

  1. 按照代码中的注释要求,替换使用您自己的 S3 bucket/prefix
  2. 运行Notebook,进行模型训练和部署
    • 训练数据已经包含在代码里面,可以直接下载。
    • 数据清洗 (删除turbine_id列,按照XGBoost的训练数据格式要求,删除表头并且将最后一列的推理结果breakdown挪到第一列)
    • 按照7:2:1比率来拆分训练集,验证集和测试集,并上传到S3
    • 训练模型
    • 部署训练好的模型并生成用于推理的 Endpoint记录好这个值,后续需要在IoT 规则引擎触发的Lambda 函数中使用。

创建Lambda函数及SNS Topic用于推理,设备状态变更以及通知

  1. 创建SNS通知Topic,并使用自己的邮箱地址订阅该Topic,用于接收预测性维护的通知。
  2. 创建一个Lambda 函数
    • 名称:windturbine_prediction
    • 运行时:Python 3.8
    • 权限:选择一个IAM Role 可以使用IoT,SNS 和 SageMaker Endpoint
    • 内存:128 MB
    • 超时:30s
  3. lambda_function.py 替换Lambda 代码,注意修改下列常量:

#修改成自己的Sagemaker Endpoint Name

ENDPOINT_NAME = 'xgboost-2021-03-08-10-43-34-693'

#修改成自己的SNS Topic

SNS_TOPIC_ARN = 'arn:aws-cn:sns:cn-northwest-1:account-id:NotifyMe'

#修改成自己的手机号 (海外区SNS发短信)

PHONE_NUMBER = '+8613812345678'

创建IoT规则,触发windturbine_prediction Lambda 函数

  1. AWS IoT 控制台的导航窗格中,选择 Act (行动).
  2. Rules 页面,选择 Create
  3. 选择Create
    • 名称:Invoke_windturbine_prediction
    • Rule Query statement: SELECT * FROM ‘windturbine/xgboost’

    • 设置一个或多个操作中,选择添加操作:发送消息到Lambda函数 (send a message to a Lambda function),选择windturbine_prediction

    • (可选),错误操作:发送消息给CloudWatch logs (Send message data to CloudWatch logs): windturbine_prediction

    • 选择Create rule (创建规则)

端到端测试

  1. 在Cloud9实例上用户的home目录中创建cert文件夹并上传上面第三步下载保存的IoT Things的证书到该文件夹中
  2. 上传device_simulator.py文件到Cloud9实例上用户的home目录中
  3. 上传模拟数据device_data.csv文件到Cloud9实例上用户的home目录中
  4. 根据您的实际配置修改py的代码

# 将host修改为自己AWS账户的IoT Endpoint

host = "a1hk0pcc0as07l---ats---iot---cn-north-1.amazonaws.com.rproxy.goskope.com.cn"

#证书路径修改为自己环境下的证书路径

rootCAPath = "cert/AmazonRootCA1.pem"

certificatePath = "cert/windturbine.cert.pem"

privateKeyPath = "cert/windturbine.private.key"

  1. 运行代码

python device_simulator.py device_data.csv

  1. 当部署的XGBoost模型端点预测到设备出现异常时,Lambda函数更新IoT设备影子(Shadows)将设备状态设置为Off(关闭状态),边缘IoT设备收到该状态设置标志,将设备停止,如下图所示:

同时Lambda还会触发提醒工作人员进行预测性维护的通知。如下图所示:

总结

您刚刚完成了如何将 IoT和Amazon SageMaker 一起使用,对一系列设备执行预测性维护的端到端动手实验,并使用Lambda和SNS进行警报监控其状态。 我们希望本文有助于您理解如何在Amazon Web Service上对IoT设备数据进行有效洞察,并为您的特定用例提供一个良好的起点。

本篇作者

郭松

AWS 解决方案架构师,负责企业级客户的架构咨询及设计优化,同时致力于 AWS IoT 和存储服务在国内和全球企业客户的应用和推广。加入 AWS 之前在EMC研发中心担任系统工程师,对企业级存储应用的高可用架构,方案及性能调优有深入研究。

梁睿

AWS解决方案架构师,主要负责企业级客户的上云工作,服务客户涵盖从汽车,传统生产制造,金融,酒店,航空,旅游等,擅长DevOps领域。11 年 IT 专业服务经验,历任程序开发,软件架构师、解决方案架构师。