簡體   English   中英

AWS SageMaker Canvas Model 在邊緣設備上的使用 Python

[英]AWS SageMaker Canvas Model usage on Edge device in Python

這樣我想問一個關於AWS Sagemaker的問題。 我必須承認,我是這個主題的新手,因此我對 SageMaker Canvas 應用程序非常滿意。 它工作起來非常簡單,並給了我一些不錯的結果。

首先是我的 model。我嘗試根據時間 (dt)、AWS IoT 事物名稱 (thingname)、雲百分比 (clouds) 和溫度 (temp) 來預測太陽能發電。 我有一個 csv,里面裝滿了物聯網測量的數據

clouds + temp + dt + thingname => import

dt,clouds,temp,import,thingname
2022-08-30 07:45:00+02:00,1.0,0.1577,0.03,***
2022-08-30 08:00:00+02:00,1.0,0.159,0.05,***
2022-08-30 08:15:00+02:00,1.0,0.1603,0.06,***
2022-08-30 08:30:00+02:00,1.0,0.16440000000000002,0.08,***
2022-08-30 08:45:00+02:00,,,0.09,***
2022-08-30 09:00:00+02:00,1.0,0.17,0.12,***
2022-08-30 09:15:00+02:00,1.0,0.1747,0.13,***
2022-08-30 09:30:00+02:00,1.0,0.1766,0.15,***
2022-08-30 09:45:00+02:00,0.75,0.1809,0.18,***
2022-08-30 10:00:00+02:00,1.0,0.1858,0.2,***
2022-08-30 10:15:00+02:00,1.0,0.1888,0.21,***
2022-08-30 10:30:00+02:00,0.75,0.1955,0.24,***

在 AWS SageMaker canvas 中,我上傳了 csv 並構建了 model。一切都非常簡單,當我使用預測選項卡時,我上傳了一個 CSV,其中缺少導入列,其中包含 API 天氣數據以備將來使用:

dt,thingname,temp,clouds
2022-09-21 10:15:00+02:00,***,0.1235,1.0
2022-09-21 10:30:00+02:00,***,0.1235,1.0
2022-09-21 10:45:00+02:00,***,0.1235,1.0
2022-09-21 11:00:00+02:00,***,0.1235,1.0
2022-09-21 11:15:00+02:00,***,0.12689999999999999,0.86
2022-09-21 11:30:00+02:00,***,0.12689999999999999,0.86
2022-09-21 11:45:00+02:00,***,0.12689999999999999,0.86
2022-09-21 12:00:00+02:00,***,0.12689999999999999,0.86
2022-09-21 12:15:00+02:00,***,0.1351,0.69
2022-09-21 12:30:00+02:00,***,0.1351,0.69
2022-09-21 12:45:00+02:00,***,0.1351,0.69

根據此數據,SageMaker Canvas 預測了一些真實的現實數字,我假設 model 構建得很好。 所以我想把這個 model 移到我的 Greengrass Core Device 上做現場預測。 我使用 Junyper 筆記本的共享鏈接找到了最佳位置 model。

通過閱讀 AWS 文檔,我似乎有幾個選項可以在邊緣設備上運行 model:

  • 運行 Greengrass SageMaker Edge 組件並將 model 作為組件運行並編寫推理組件
  • 自己運行 SageMaker Edge Agent
  • 只需自己下載 model 並在設備上使用它即可

現在看來,SageMaker 使用 XGBoost 創建了 model,我找到了xgboost-model文件並將其下載到設備。

但這就是問題開始的地方:SageMaker Canvas 從未提供任何關於它對 CSV 進行格式化的信息,所以我真的不知道如何使用 model 進行預測。當我嘗試打開時我得到了一些結果我用於 Canvas 預測的相同 csv 文件,但數據完全不同,根本不現實

# pip install xgboost==1.6.2
import xgboost as xgb

filename = f'solar-prediction-data.csv'
dpredict = xgb.DMatrix(f'{filename}?format=csv')
model = xgb.Booster()
model.load_model('xgboost-model')
result = model.predict(dpredict)
print('Prediction result::')
print(result)

我讀到列順序很重要,CSV 可能不包含 header。但它並沒有接近 SageMaker Canvas 結果。

我也嘗試使用pandas

# pip install xgboost==1.6.2
import xgboost as xgb
import pandas as pd

filename = f'solar-prediction-data.csv'
df = pd.read_csv(filename, index_col=None, header=None)

dpredict = xgb.DMatrix(df, enable_categorical=True)

model = xgb.Booster()
model.load_model('xgboost-model')
result = model.predict(dpredict, pred_interactions=True)
print('Prediction result::')
print('===============')
print(result)

但是最后一個總是給我以下錯誤:

ValueError: DataFrame.dtypes for data must be int, float, bool or category.  When
categorical type is supplied, DMatrix parameter `enable_categorical` must
be set to `True`. Invalid columns:dt, thingname

老實說,我完全被困住了,希望周圍的人能給我一些建議或線索,告訴我如何繼續。

謝謝! 親切的問候

哈科爾

Hacor,Canvas autoML 創建工件,包括 python 特征工程代碼和特征工程 model。 您可以在工件選項卡下訪問它們以獲得最佳 model。

Canvas 神器

Canvas 特征工程 python 代碼(.py 文件)示例

謝謝回復。 這確實是難題的一部分。 我將嘗試讓這個問題成為其他想要嘗試這個主題的人的指南。

據我現在得到:

  • 您在 SageMaker Canvas 上將 go 到您的 model,然后選擇共享

  • 您訪問鏈接並轉到最佳 model -> 工件

  • 在此頁面上,您下載以下項目(非常感謝@Danny):

  • 特征工程 Model

  • 算法 Model

現在您開始一個帶有虛擬環境的新 python3.7 項目。

  • 將包含xgboost xgboost-model文件的model.tar.gz復制到這個目錄下(不要解壓)
  • 將包含code目錄的 model.tar.gz 和model.joblib文件復制並解壓縮到同一根文件夾中。

現在在code目錄中創建一個包含以下內容的 requirements.txt:

sagemaker-scikit-learn-extension==2.5.0
numpy>=1.16.4
psutil
scikit-learn==0.23.2
python-dateutil==2.8.0
pandas==1.2.4
tsfresh==0.18.0
statsmodels==0.12.2

(此文件的內容基於sagemaker-scikit-learn-extension package 並在未實現時拋出錯誤。 鏈接

然后創建一個名為prediction.py的文件,其內容如下:

from sagemaker.xgboost import XGBoostModel
from sagemaker.local import LocalSession
from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer
import csv

DUMMY_IAM_ROLE = 'arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-20200101T000001'
LOCAL_SESSION = LocalSession()
LOCAL_SESSION.config={'local': {'local_code': True}} # Ensure full code locality, see: https://sagemaker.readthedocs.io/en/stable/overview.html#local-mode

def main():

    xgb_inference_model = XGBoostModel(
        model_data='file://model.tar.gz',
        role=DUMMY_IAM_ROLE,
        entry_point="sagemaker_serve.py",
        source_dir="./solar-code",
        framework_version="1.3-1",
        sagemaker_session=LOCAL_SESSION
    )

    serializer = CSVSerializer()
    deserializer = CSVDeserializer()

    print('Deploying endpoint in local mode')
    predictor = xgb_inference_model.deploy(
        initial_instance_count=1,
        instance_type="local",
        serializer=serializer
    )

    predictions = predictor.predict(['2022-09-21 10:15:00+02:00','grnrg-zoersel','0.1235','1.0'])  # type: ignore
    print("Prediction: {}".format(predictions))

    print('About to delete the endpoint to stop paying (if in cloud mode).')
    predictor.delete_endpoint(predictor.endpoint_name)

if __name__ == "__main__":
    main()

現在安裝要求:

pip install -r requirements.txt

並運行代碼進行預測:

python prediction.py

預測文件基於 AWS 示例存儲庫中的XGBOOST 示例 數據根據 Sagemaker Canvas 進程的 CloudWatch 日志進行調整。 結果是:

  • framework_version="1.3-1"
  • code目錄中額外的requirements.txt文件

但目前的問題是 docker 容器返回錯誤(我認為這不是錯誤):

Prediction: [['Received data of unknown size. Expected number of columns is 4. Number of columns in the received data is 1.']]

我認為容器正在退回所需的預測,但這里似乎不正確。 有什么建議么?

TODO:: 構建一個預先安裝了需求的新容器。 所有代碼都可以在這個 repo中找到

差不多了,希望有人能提出最后的建議。 我確實希望這能幫助其他人在邊緣設備上運行訓練有素的模型

此致

哈科爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM