跳轉到主要內容
工程的博客”>
             <noscript>
              <img data-gatsby-image-ssr=

為物聯網設備管理和大規模機器學習模型

分享這篇文章

公共數據科學物聯網(物聯網)用例涉及培訓機器學習模型實時數據來自軍隊的物聯網傳感器。一些用例要求每個連接的設備都有自己的個人模型由於許多基本的機器學習算法通常比一個複雜的模型。我們看到在供應鏈優化、預測性維護,電動汽車充電時,智能家居管理,或任何其他的用例。問題是這樣的:

  • 整個物聯網數據是如此巨大,以至於不適合在任何一台機器
  • 每個設備數據並在單個機器上
  • 一個單獨的模型需要為每一台設備
  • 數據科學團隊實現使用單節點庫sklearn和熊貓一樣,所以他們需要低摩擦分發他們的單機的概念

在這個博客中,我們展示如何解決這個問題有兩個不同的方案,每一個物聯網設備:模型訓練和模型得分。

毫升Multi-IoT設備的解決方案

這是一個規範的大數據問題。物聯網設備如天氣傳感器和車輛產生一個令人驚歎的數據點的數量。單機解決方案不會擴展到這種複雜性的問題,通常不也集成到生產環境中。和數據科學團隊不想擔心DataFrame是否他們使用是一個單機熊貓對象或分布Apache火花。還有一件事:我們需要日誌模型及其性能的地方再現性,監測,和部署。

這裏有兩個模式,我們需要解決這個問題:

  • 模型訓練:創建一個函數,接受一個設備的數據作為輸入。火車模型。使用日誌生成的模型和評價指標MLflow,一個開源平台的機器學習生命周期Beplay体育安卓版本
  • 模型評分:創建第二個函數,把訓練模型從MLflow設備,應用它,並返回預測

有了這些抽象,我們隻需要把我們的功能熊貓UDF為了分發的火花。熊貓UDF允許任意Python代碼的效率分布在一個火花工作,允許否則串行操作的分布。我們將會有一個單節點的解決方案,使其高度平行。

物聯網模型訓練

現在,讓我們仔細看看模型訓練。從一些假數據。我們有一個連接設備,為每個樣本,一些功能,我們想要預測一個標簽。這是常有的事與物聯網設備,可以用火花featurization步驟利用其可伸縮性。

進口pyspark.sql.functions作為fdf =(火花。範圍(10000年*1000年).select (f.col (“id”).alias (“record_id”),(f.col (“id”)%10).alias (“device_id”)).withColumn (“feature_1”f.rand () *1).withColumn (“feature_2”f.rand () *2).withColumn (“feature_3”f.rand () *3).withColumn (“標簽”,(f.col (“feature_1”)+ f.col (“feature_2”)+ f.col (“feature_3”)+ f.rand ()))

接下來,我們需要定義的模式,我們的訓練函數將返回。我們想要返回設備ID,用於培訓的記錄數量,路徑模型和評價指標。

進口pyspark.sql.types作為t
              trainReturnSchema = t.StructType ([t.StructField (“device_id”t.IntegerType ()),#唯一的設備標識t.StructField (“n_used”t.IntegerType ()),#用於培訓的記錄數量t.StructField (“model_path”t.StringType ()),#路徑模型對於一個給定的設備t.StructField (mse的t.FloatType ())#度量模型性能])

需要定義一個熊貓UDF熊貓DataFrame一組數據作為輸入,並返回模型元數據作為輸出。

進口mlflow進口mlflow.sklearn進口熊貓作為pdsklearn.ensemble進口RandomForestRegressorsklearn.metrics進口mean_squared_error@f.pandas_udf (trainReturnSchema functionType = f.PandasUDFType.GROUPED_MAP)deftrain_model(df_pandas):“‘火車一個分組sklearn模型實例“‘#把元數據device_id = df_pandas [“device_id”].iloc [0]n_used = df_pandas.shape [0]run_id = df_pandas [“run_id”].iloc [0]#把ID進行嵌套跑#火車模型X = df_pandas [[“feature_1”,“feature_2”,“feature_3”]]y = df_pandas [“標簽”]射頻= RandomForestRegressor ()射頻。fit(X, y)#評估模型預測= rf.predict (X)mse = mean_squared_error (y,預測)#注意我們可以添加一列火車/測試#恢複高層培訓mlflow.start_run (run_id = run_id):#創建一個嵌套運行特定的設備mlflow.start_run (run_name =str(device_id),嵌套的=真正的)作為運行:mlflow.sklearn.log_model (rf,str(device_id))mlflow.log_metric (“mse”mse)artifact_uri =f: /{run.info.run_id}/{device_id}#創建一個返回熊貓DataFrame相匹配的模式returnDF = pd。DataFrame ([[device_id, n_used artifact_uri, mse]],列= [“device_id”,“n_used”,“model_path”,“mse”])返回returnDF

物聯網設備模型和嵌套在MLflow運行日誌

MLflow跟蹤方案允許我們開發過程日誌機器學習的不同方麵。在我們的例子中,我們將創建一個運行(或一個機器學習的執行代碼)為每一個我們的設備。我們將聚合這些運行使用一個父母一起運行。

這也讓我們看到如果任何個人的模型的性能不如別人。我們隻需要添加日誌邏輯大熊貓UDF,如上圖所示。雖然這段代碼將執行工作的節點集群上,如果我們開始父母在我們開始嵌套跑,我們還是可以一起日誌這些模型。

物聯網設備模型和嵌套在MLflow運行日誌”height=

我們可以查詢MLflow拿回URI的為每個模型。從熊貓UDF返回URI而不是隻是讓整個管道有點容易縫合在一起。

並行訓練

現在我們隻需要應用分組地圖熊貓UDF。隻要數據對於任何給定的設備將安裝在一個節點的集群的火花,我們可以分發培訓。首先使MLflow父運行,然後應用熊貓UDF使用groupby然後一個應用。

mlflow.start_run (run_name =“所有設備訓練”)作為運行:run_id = run.info.run_uuid
              modelDirectoriesDF = (df.withColumn (“run_id”f.lit (run_id))#添加run_id.groupby (“device_id”)蘋果(train_model))
              combinedDF = (df. join (modelDirectoriesDF =“device_id”,=“左”))

你走吧!一個模型為每個設備已被訓練和記錄。

物聯網模型得分

現在的得分。優化技巧在於確保我們隻獲取模型一次對每一個設備,限製了通信開銷。然後我們應用模型在一個機器上下文並返回一個熊貓DataFrame記錄id和他們的預測。

applyReturnSchema = t.StructType ([t.StructField (“record_id”t.IntegerType ()),t.StructField (“預測”t.FloatType ())])@f.pandas_udf (applyReturnSchema functionType = f.PandasUDFType.GROUPED_MAP)defapply_model(df_pandas):“‘模型適用於特定設備,數據表示為熊貓DataFrame“‘model_path = df_pandas [“model_path”].iloc [0]input_columns = [“feature_1”,“feature_2”,“feature_3”]X = df_pandas [input_columns]
              模型= mlflow.sklearn.load_model (model_path)預測= model.predict (X)
              returnDF = pd.DataFrame ({“record_id”:df_pandas (“record_id”),“預測”:預測})返回returnDFpredictionDF = combinedDF.groupby (“device_id”蘋果(apply_model)

注意,在每種情況下我們使用分組地圖熊貓UDF。在第一種情況下,我們采取作為輸入並返回一組一行每一個設備(多對一映射)。在這種情況下,我們需要一組作為輸入並返回一個預測每一行(一對一的映射)。分組地圖熊貓UDF允許這兩種方法。

結論

所以你有個性化模型訓練整個軍隊的物聯網設備。這支持許多基本模型通常比一個更複雜的模型。即使這是一般的情況,可能會有個別模型執行低於平均水平部分原因是有限的或缺失數據的設備。這裏有一些建議如何更進一步:

  • 使用的數量記錄在培訓和評估指標,你可以很容易地描述個體模型與模型,表現不佳表現良好。您可以使用此信息之間切換種每設備模型和模型訓練整個艦隊。
  • 你也可以訓練一個整體模型,以預測從種每設備模型,預測提供從機艙模型和元數據評價指標和每個設備的記錄數。這將創建一個最終改善不佳的單個模型的預測。

為物聯網設備開始使用MLflow

準備試一試自己嗎?你可以看到這篇博客中使用的完整的示例在runnable筆記本AWSAzure

如果您是MLflow,閱讀最新的MLflow快速入門MLflow釋放。生產用例,讀到管理MLflow磚上

免費試著磚
看到所有工程的博客的帖子