[英]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:
現在看來,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。
謝謝回復。 這確實是難題的一部分。 我將嘗試讓這個問題成為其他想要嘗試這個主題的人的指南。
據我現在得到:
您在 SageMaker Canvas 上將 go 到您的 model,然后選擇共享
您訪問鏈接並轉到最佳 model -> 工件
在此頁面上,您下載以下項目(非常感謝@Danny):
特征工程 Model
算法 Model
現在您開始一個帶有虛擬環境的新 python3.7 項目。
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.