實踐教程丨如何在邊緣基礎設施上運行故障預測解決方案?

作者簡介
Janakiram MSV是Janakiram & Associates的首席分析師,也是國際信息技術學院的兼職教師。他也是Google Qualified Developer、亞馬遜認證解決方案架構師、亞馬遜認證開發者、亞馬遜認證SysOps管理員和微軟認證Azure專業人員。

Janakiram是雲原生計算基金會(CNCF)的大使,也是首批Kubernetes認證管理員和Kubernetes認證應用開發者之一。他曾在微軟、AWS、Gigaom Research等知名公司工作。
圖片

在之前的文章中,我討論了Rancher的輕量級Kubernetes發行版K3s、Calico和Portworx如何成爲運行在邊緣的現代AI和物聯網系統的基礎。在本文中我們將設計和部署一個解決方案以運行在這一基礎設施上。

我們將基於監控渦輪機的風扇的假設場景來構建一個預測性維護解決方案,以檢測風扇的異常情況。該架構利用了各種開源的雲原生技術,可以作爲設計和構建IoT/邊緣解決方案的參考架構。

問題陳述

我們將設計和部署一個解決方案,該解決方案可以從多個風扇攝取遙測數據,並在故障發生之前使用實時流(real-time stream)來預測故障。該解決方案運行在低端機器(如英特爾NUC)的邊緣基礎設施上。在本文中,我們將使用前文搭建的基礎設施(基於K3s、Calico以及Portwox),它們提供了Kubernetes集羣的核心組件。

解決方案架構

連接到風扇的傳感器提供了當前的轉速、振動、溫度和噪音水平等數據。這些遙測數據流和每個風扇的設備ID一起作爲預測性維護解決方案的輸入。

在這裏插入圖片描述

Mosquitto是一款使用廣泛的開源MQTT broker,它將作爲傳感器的網關以及平臺的集中式消息broker。傳感器將遙測數據攝入Mosquitto broker的fan/messages類別下方。

以下是每個風扇發佈到MQTT主題的有效載荷:

在這裏插入圖片描述

預測器微服務和風扇發佈的數據在同一個遙測頻道,它會從中讀取數據。對於每個入站數據點,它都會調用異常檢測服務,並將結果發佈到一個單獨的MQTT主題中,即fan/anomaly。

import time
import requests
import random
import datetime
import json
import os
import paho.mqtt.client as mqtt
 
broker_address = os.getenv('MQTT_HOST')
dev_topic = os.getenv('MQTT_DEV_TOPIC')
pred_topic = os.getenv('MQTT_PREDICT_TOPIC')
scoring_url=os.getenv('SCORING_URL')
d={}
 
client = mqtt.Client("pdm")
client.connect(broker_address)
 
def on_message(mosq, obj, msg):
    rotation=json.loads(msg.payload)["rotation"]
    temperature=json.loads(msg.payload)["temperature"]
    vibration=json.loads(msg.payload)["vibration"]
    sound=json.loads(msg.payload)["sound"]
    telemetry=[rotation,temperature,vibration,sound]
    data={"params":telemetry}
    
    response = requests.post(scoring_url, json=data)
    fault=json.loads(response.text)["fault"]
 
    d["deviceID"]=json.loads(msg.payload)["deviceID"]
    d["fault"]=fault
 
    payload = json.dumps(d, ensure_ascii=False)
    print(payload)
    client.publish(pred_topic,payload)
    
def on_subscribe(mosq, obj, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))
 
client.on_message = on_message
client.on_subscribe = on_subscribe
client.connect(broker_address)
client.subscribe(dev_topic, 0)
 
while True:
    client.loop()

SCORING_URL是異常檢測推理服務的一個端點。通過Flask網絡服務暴露了一個在TensorFlow中訓練的深度學習模型。

下面是預測服務發佈到MQTT主題的有效載荷:

在這裏插入圖片描述

訓練異常檢測模型

用一個超過20000個數據點的歷史數據集來訓練異常檢測模型。

在這裏插入圖片描述

從數據集中觀察到,在故障發生前的幾個小時,風扇的轉速會降低並伴隨着振動、聲音、溫度值的增加。

轉速數據的散點圖直觀地顯示了這一點。風扇的轉速從正常的平均600轉下降到400轉。

在這裏插入圖片描述

基於此,我們可以輕鬆地訓練一個簡單的TensorFlow邏輯迴歸模型來預測故障風扇。我們先去掉時間戳和設備ID列。

dataframe = pandas.read_csv("../data/fan.csv", header=None,skiprows=1)
del dataframe[0]
del dataframe[1]

分離特徵和標籤後,再將數據集分爲訓練數據和測試數據。

dataset = dataframe.values
X = dataset[:,0:4].astype(float)
y = dataset[:,4]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

然後我們創建一個4層神經網絡,做邏輯迴歸。

model = Sequential()
model.add(Dense(60, input_dim=4, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=250, batch_size=32, verbose=0)

最後,該模型被保存和評估。

model.save("../model")
loss, acc = model.evaluate(X_test, y_test, verbose=0)
print('Test Accuracy: %.3f' % acc)

保存到磁盤上的TensorFlow模型被推理服務加載,然後對預測器微服務發送的數據進行預測。

時間序列數據和可視化

InfluxDB的實例通過Telegraf與Mosquitto連接。這種配置爲我們提供了一個優雅的機制,可以在不寫代碼的情況下將時間序列數據攝入InfluxDB。

下面是連接Mosquitto和InfluxDB的Telegraf配置:

  [agent]
      interval = "10s"
      round_interval = true
      metric_batch_size = 1000
      metric_buffer_limit = 10000
      collection_jitter = "0s"
      flush_jitter = "0s"
      debug = false
      quiet = false
      hostname = ""
      omit_hostname = true
 
    [[outputs.influxdb]]
 
      urls = ["http://influxdb:8086"]
      database = "fan"
      retention_policy = "autogen"
      precision = "s"
      timeout = "5s"
 
    [[outputs.file]]
    files = ["stdout"]
    data_format = "influx"
 
    [[inputs.mqtt_consumer]]
      servers = ["tcp://mosquitto:1883"]
      qos = 0
 
      topics = [
        "fan/#"
      ]
 
      insecure_skip_verify = true
      client_id = ""
      data_format = "json"
      name_override = "fan"
      tag_keys = ["deviceID"]
      json_string_fields = ["rotation","temperature","vibration","sound","fault"]

現在可以從InfluxDB查詢時間序列數據。

在這裏插入圖片描述

最後,我們將Grafana儀表盤連接到InfluxDB,爲我們的AIoT解決方案構建一個直觀的可視化面板。

在這裏插入圖片描述

在本教程的下一部分,我將討論部署架構以及基於K3s、Calico和Portworx的存儲和網絡。保持關注喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章