實踐教程丨如何在邊緣基礎(chǔ)設(shè)施上運行故障預測解決方案?
? ? 作者簡介
在之前的文章中,我討論了Rancher的輕量級Kubernetes發(fā)行版K3s、Calico和Portworx如何成為運行在邊緣的現(xiàn)代AI和物聯(lián)網(wǎng)系統(tǒng)的基礎(chǔ)。在本文中我們將設(shè)計和部署一個解決方案以運行在這一基礎(chǔ)設(shè)施上。
我們將基于監(jiān)控渦輪機的風扇的假設(shè)場景來構(gòu)建一個預測性維護解決方案,以檢測風扇的異常情況。該架構(gòu)利用了各種開源的云原生技術(shù),可以作為設(shè)計和構(gòu)建IoT/邊緣解決方案的參考架構(gòu)。
問題陳述
我們將設(shè)計和部署一個解決方案,該解決方案可以從多個風扇攝取遙測數(shù)據(jù),并在故障發(fā)生之前使用實時流(real-time stream)來預測故障。該解決方案運行在低端機器(如英特爾NUC)的邊緣基礎(chǔ)設(shè)施上。在本文中,我們將使用前文搭建的基礎(chǔ)設(shè)施(基于K3s、Calico以及Portwox),它們提供了Kubernetes集群的核心組件。
解決方案架構(gòu)
連接到風扇的傳感器提供了當前的轉(zhuǎn)速、振動、溫度和噪音水平等數(shù)據(jù)。這些遙測數(shù)據(jù)流和每個風扇的設(shè)備ID一起作為預測性維護解決方案的輸入。

Mosquitto是一款使用廣泛的開源MQTT broker,它將作為傳感器的網(wǎng)關(guān)以及平臺的集中式消息broker。傳感器將遙測數(shù)據(jù)攝入Mosquitto broker的fan/messages類別下方。
以下是每個風扇發(fā)布到MQTT主題的有效載荷:

預測器微服務(wù)和風扇發(fā)布的數(shù)據(jù)在同一個遙測頻道,它會從中讀取數(shù)據(jù)。對于每個入站數(shù)據(jù)點,它都會調(diào)用異常檢測服務(wù),并將結(jié)果發(fā)布到一個單獨的MQTT主題中,即fan/anomaly。
import?timeimport requestsimport randomimport datetimeimport jsonimport osimport paho.mqtt.client as mqttbroker_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"]=faultpayload = 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_messageclient.on_subscribe = on_subscribeclient.connect(broker_address)client.subscribe(dev_topic, 0)while True:client.loop()
SCORING_URL是異常檢測推理服務(wù)的一個端點。通過Flask網(wǎng)絡(luò)服務(wù)暴露了一個在TensorFlow中訓練的深度學習模型。
下面是預測服務(wù)發(fā)布到MQTT主題的有效載荷:

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

從數(shù)據(jù)集中觀察到,在故障發(fā)生前的幾個小時,風扇的轉(zhuǎn)速會降低并伴隨著振動、聲音、溫度值的增加。
轉(zhuǎn)速數(shù)據(jù)的散點圖直觀地顯示了這一點。風扇的轉(zhuǎn)速從正常的平均600轉(zhuǎn)下降到400轉(zhuǎn)。

基于此,我們可以輕松地訓練一個簡單的TensorFlow邏輯回歸模型來預測故障風扇。我們先去掉時間戳和設(shè)備ID列。
dataframe?=?pandas.read_csv("../data/fan.csv",?header=None,skiprows=1)del dataframe[0]del dataframe[1]
分離特征和標簽后,再將數(shù)據(jù)集分為訓練數(shù)據(jù)和測試數(shù)據(jù)。
dataset = dataframe.valuesX = 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)
然后我們創(chuàng)建一個4層神經(jīng)網(wǎng)絡(luò),做邏輯回歸。
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模型被推理服務(wù)加載,然后對預測器微服務(wù)發(fā)送的數(shù)據(jù)進行預測。
時間序列數(shù)據(jù)和可視化
InfluxDB的實例通過Telegraf與Mosquitto連接。這種配置為我們提供了一個優(yōu)雅的機制,可以在不寫代碼的情況下將時間序列數(shù)據(jù)攝入InfluxDB。
下面是連接Mosquitto和InfluxDB的Telegraf配置:
??[]interval = "10s"round_interval = truemetric_batch_size = 1000metric_buffer_limit = 10000collection_jitter = "0s"flush_jitter = "0s"debug = falsequiet = falsehostname = ""omit_hostname = true[]]urls = ["http://influxdb:8086"]database = "fan"retention_policy = "autogen"precision = "s"timeout = "5s"[]]files = ["stdout"]data_format = "influx"[]]servers = ["tcp://mosquitto:1883"]qos = 0topics = ["fan/#"]insecure_skip_verify = trueclient_id = ""data_format = "json"name_override = "fan"tag_keys = ["deviceID"]json_string_fields = ["rotation","temperature","vibration","sound","fault"]
現(xiàn)在可以從InfluxDB查詢時間序列數(shù)據(jù)。

最后,我們將Grafana儀表盤連接到InfluxDB,為我們的AIoT解決方案構(gòu)建一個直觀的可視化面板。

在本教程的下一部分,我將討論部署架構(gòu)以及基于K3s、Calico和Portworx的存儲和網(wǎng)絡(luò)。保持關(guān)注喲!
推薦閱讀
掃碼添加k3s中文社區(qū)助手
加入官方中文技術(shù)社區(qū)
官網(wǎng):https://k3s.io

