訓練機器學習模型
教學
概觀
要完成的內容
在本指南中,您將:
- 使用指令碼模式建置、訓練和調整模型
- 偵測 ML 模型中的偏差及了解模型預測
- 將經過訓練的模型部署到即時推論端點進行測試
- 透過產生樣本預測和理解特徵影響來評估模型
先決條件
在開始本指南之前,您需要具備:
- AWS 帳戶:如果您還沒有,請按照設定您的 AWS 環境快速入門指南進行操作。
AWS 經驗
初階
最短完成時間
2 小時
完成成本
請參閱 SageMaker 定價以估算本教學的成本。
要求
您必須登入 AWS 帳戶。
使用的服務
Amazon SageMaker Studio、Amazon SageMaker Clarify
上次更新日期
2023 年 3 月 27 日
實作
步驟 1:設定 Amazon SageMaker Studio 網域
藉助 Amazon SageMaker,您可以使用主控台視覺化地部署模型,也可以使用 SageMaker Studio 或 SageMaker 筆記本以程式設計方式部署模型。在本教學課程中,您將使用 SageMaker Studio 筆記本以程式設計的方式部署模型,而該筆記本需要一個 SageMaker Studio 網域。
如果您在美國東部 (維吉尼亞北部) 區域已有 SageMaker Studio 網域,請按照 SageMaker Studio 設定指南將所需的 AWS IAM 政策連接到您的 SageMaker Studio 帳戶,然後略過步驟 1,並直接進行步驟 2。
如果您沒有現有的 SageMaker Studio 網域,請繼續進行步驟 1 以執行 AWS CloudFormation 範本,該範本將建立 SageMaker Studio 網域,並新增本教學課程其餘部分所需的許可。
此堆疊假定您已經在您的帳戶中設定了預設公有 VPC。如果您沒有公有 VPC,請參閱具有單一公有子網路的 VPC,了解如何建立公有 VPC。
選取我認知 AWS CloudFormation 可能會建立 IAM 資源,然後選擇建立堆疊。
步驟 2:設定 SageMaker Studio 筆記本
在此步驟中,您將啟動一個新的 SageMaker Studio 筆記本,安裝必要的開放原始碼程式庫,並設定與其他服務 (包括 Amazon Simple Storage Service (Amazon S3)) 互動所需的 SageMaker 變數。
2.1 在管理主控台搜尋列中輸入 SageMaker Studio,然後選擇 SageMaker Studio。
2.2 從 SageMaker 主控台右上角的「區域」下拉式清單中選擇美國東部 (維吉尼亞北部)。若要啟動應用程式,請從左側導覽窗格中選取 Studio。 選取 studio-user 做為使用者設定檔,然後選擇開啟 Studio 按鈕。
2.3 SageMaker Studio 中的建立應用程式畫面即會顯示。該應用程式需要幾分鐘才能載入完畢。
2.4 開啟 SageMaker Studio 介面。在導覽列上,依次選擇檔案、新增、筆記本
2.5 在設定筆記本環境對話方塊中的映像下,選取資料科學 3。將會自動選取 Python 3 核心。在執行個體類型下,選擇 ml.t3.medium。選擇選取。
2.6 筆記本右上角上的核心現在應顯示 Python 3 (資料科學)。
2.7 在該 Jupyter 筆記本的新程式碼儲存格中,複製並貼上以下程式碼並執行該儲存格。這會確保您使用目前版本的 SageMaker。
%pip install sagemaker --upgrade --quiet
2.8 若要安裝開放原始碼 XGBoost 和 Pandas 程式庫的特定版本,請複製並貼上以下程式碼片段到筆記本的儲存格中,然後按 Shift+Enter 以執行當前儲存格。忽略任何警告以重新啟動核心或任何相依性衝突錯誤。
%pip install -q xgboost==1.3.1 pandas==1.0.5
2.9 您還需要具現化 S3 用戶端物件,以及預設 S3 儲存貯體中指標和模型成品等內容上傳到的位置。為此,複製並貼上以下程式碼範例到筆記本的儲存格中並執行。
import pandas as pd
import boto3
import sagemaker
import json
import joblib
from sagemaker.xgboost.estimator import XGBoost
from sagemaker.tuner import (
IntegerParameter,
ContinuousParameter,
HyperparameterTuner
)
from sagemaker.inputs import TrainingInput
from sagemaker.image_uris import retrieve
from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer
# Setting SageMaker variables
sess = sagemaker.Session()
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"
region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)
sagemaker_role = sagemaker.get_execution_role()
sagemaker_client = boto3.client("sagemaker")
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims"
# Setting S3 location for read and write operations
train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
validation_data_key = f"{read_prefix}/validation.csv"
model_key = f"{write_prefix}/model"
output_key = f"{write_prefix}/output"
train_data_uri = f"s3://{read_bucket}/{train_data_key}"
test_data_uri = f"s3://{read_bucket}/{test_data_key}"
validation_data_uri = f"s3://{read_bucket}/{validation_data_key}"
model_uri = f"s3://{write_bucket}/{model_key}"
output_uri = f"s3://{write_bucket}/{output_key}"
estimator_output_uri = f"s3://{write_bucket}/{write_prefix}/training_jobs"
bias_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/bias"
explainability_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/explainability"
2.10 請注意,寫入儲存貯體名稱由 SageMaker 工作階段物件派生而來。您的預設儲存貯體名稱為 sagemaker-<您的區域>-<您的帳戶 ID>。 此儲存貯體是所有訓練成品上傳到的位置。用於訓練的資料集存在於一個名為 sagemaker-sample-files 的公有 S3 儲存貯體中,該儲存貯體被指定為讀取儲存貯體。請注意,正在匯入的 SageMaker XGBoost 架構不是您在上一步中安裝的開放原始碼架構。它是一個內建架構,帶有一個 Docker 容器映像,可以用來向上擴展模型訓練。
2.11 複製並貼上以下程式碼區塊,以設定模型名稱以及訓練和推論執行個體組態和計數。這些設定使您能夠透過使用適當的執行個體類型和數量,來管理訓練和推論過程。
tuning_job_name_prefix = "xgbtune"
training_job_name_prefix = "xgbtrain"
xgb_model_name = "fraud-detect-xgb-model"
endpoint_name_prefix = "xgb-fraud-model-dev"
train_instance_count = 1
train_instance_type = "ml.m4.xlarge"
predictor_instance_count = 1
predictor_instance_type = "ml.m4.xlarge"
clarify_instance_count = 1
clarify_instance_type = "ml.m4.xlarge"
步驟 3:在指令碼模式下啟動超參數調整任務
藉助 SageMaker Studio,您可以在 Python 指令碼內引入您自己的邏輯,以用於訓練。透過將訓練邏輯封裝在指令碼中,您可以結合自訂訓練慣例和模型組態,同時仍然使用由 AWS 維護的通用 ML 架構容器。在本教學課程中,您將準備一個訓練指令碼,該指令碼使用 AWS 提供的 XGBoost 容器支援的開放原始碼 XGBoost 架構,並大規模啟動超參數調整任務。若要訓練此模型,您可以將詐騙一欄用作目標欄。
3.1 指令碼模式的第一級是能夠在一個獨立的自訂 Python 指令碼中定義自己的訓練程序,並在定義 SageMaker 估算器時使用該指令碼作為進入點。複製並貼上以下程式碼區塊,以編寫封裝模型訓練邏輯的 Python 指令碼。
%%writefile xgboost_train.py
import argparse
import os
import joblib
import json
import pandas as pd
import xgboost as xgb
from sklearn.metrics import roc_auc_score
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# Hyperparameters and algorithm parameters are described here
parser.add_argument("--num_round", type=int, default=100)
parser.add_argument("--max_depth", type=int, default=3)
parser.add_argument("--eta", type=float, default=0.2)
parser.add_argument("--subsample", type=float, default=0.9)
parser.add_argument("--colsample_bytree", type=float, default=0.8)
parser.add_argument("--objective", type=str, default="binary:logistic")
parser.add_argument("--eval_metric", type=str, default="auc")
parser.add_argument("--nfold", type=int, default=3)
parser.add_argument("--early_stopping_rounds", type=int, default=3)
# SageMaker specific arguments. Defaults are set in the environment variables
# Location of input training data
parser.add_argument("--train_data_dir", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
# Location of input validation data
parser.add_argument("--validation_data_dir", type=str, default=os.environ.get("SM_CHANNEL_VALIDATION"))
# Location where trained model will be stored. Default set by SageMaker, /opt/ml/model
parser.add_argument("--model_dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
# Location where model artifacts will be stored. Default set by SageMaker, /opt/ml/output/data
parser.add_argument("--output_data_dir", type=str, default=os.environ.get("SM_OUTPUT_DATA_DIR"))
args = parser.parse_args()
data_train = pd.read_csv(f"{args.train_data_dir}/train.csv")
train = data_train.drop("fraud", axis=1)
label_train = pd.DataFrame(data_train["fraud"])
dtrain = xgb.DMatrix(train, label=label_train)
data_validation = pd.read_csv(f"{args.validation_data_dir}/validation.csv")
validation = data_validation.drop("fraud", axis=1)
label_validation = pd.DataFrame(data_validation["fraud"])
dvalidation = xgb.DMatrix(validation, label=label_validation)
params = {"max_depth": args.max_depth,
"eta": args.eta,
"objective": args.objective,
"subsample" : args.subsample,
"colsample_bytree":args.colsample_bytree
}
num_boost_round = args.num_round
nfold = args.nfold
early_stopping_rounds = args.early_stopping_rounds
cv_results = xgb.cv(
params=params,
dtrain=dtrain,
num_boost_round=num_boost_round,
nfold=nfold,
early_stopping_rounds=early_stopping_rounds,
metrics=["auc"],
seed=42,
)
model = xgb.train(params=params, dtrain=dtrain, num_boost_round=len(cv_results))
train_pred = model.predict(dtrain)
validation_pred = model.predict(dvalidation)
train_auc = roc_auc_score(label_train, train_pred)
validation_auc = roc_auc_score(label_validation, validation_pred)
print(f"[0]#011train-auc:{train_auc:.2f}")
print(f"[0]#011validation-auc:{validation_auc:.2f}")
metrics_data = {"hyperparameters" : params,
"binary_classification_metrics": {"validation:auc": {"value": validation_auc},
"train:auc": {"value": train_auc}
}
}
# Save the evaluation metrics to the location specified by output_data_dir
metrics_location = args.output_data_dir + "/metrics.json"
# Save the model to the location specified by model_dir
model_location = args.model_dir + "/xgboost-model"
with open(metrics_location, "w") as f:
json.dump(metrics_data, f)
with open(model_location, "wb") as f:
joblib.dump(model, f)
注意指令碼匯入您之前安裝的開放原始碼 XGBoost 程式庫的方式。
SageMaker 執行進入點指令碼並提供所有輸入參數,如模型組態詳細資訊和作為命令列引數的輸入輸出路徑。該指令碼使用 Python 程式庫 "argparse" 取得提供的參數。
您的訓練指令碼在 Docker 容器中執行,SageMaker 會自動將訓練和驗證資料集從 Amazon S3 下載到容器內的本機路徑。這些位置可以透過環境變數來存取。如需 SageMaker 環境變數的詳盡清單,請參閱環境變數。
3.2 當您準備好訓練指令碼後,您可以具現化 SageMaker 估算器。您可以使用 AWS 管理的 XGBoost 估算器,因為它管理可以執行自訂指令碼的 XGBoost 容器。若要具現化 XGBoost 估算器,複製並貼上以下程式碼。
# SageMaker estimator
# Set static hyperparameters that will not be tuned
static_hyperparams = {
"eval_metric" : "auc",
"objective": "binary:logistic",
"num_round": "5"
}
xgb_estimator = XGBoost(
entry_point="xgboost_train.py",
output_path=estimator_output_uri,
code_location=estimator_output_uri,
hyperparameters=static_hyperparams,
role=sagemaker_role,
instance_count=train_instance_count,
instance_type=train_instance_type,
framework_version="1.3-1",
base_job_name=training_job_name_prefix
)
3.3 您可以在指定估算器時指定靜態組態參數。在本教學課程中,您可以使用接收者操作特徵曲線下面積 (ROC-AUC) 作為評估指標。為了控制執行所需的時間,輪數已設定為 5 輪。
自訂指令碼和訓練執行個體組態已作為參數傳遞給估算器物件。選擇的 XGBoost 版本匹配您之前安裝的版本。
3.4 在本教學課程中,您將調整四個 XGBoost 超參數:
- eta:在更新中使用步長收縮來防止過度擬合。每次提升步驟後,您可以直接取得新特徵的權重。eta 參數實際上縮小了特徵權重,使提升過程更加保守。
- subsample:訓練執行個體的次取樣比率。將它設定為 0.5 意味著 XGBoost 會在產生樹之前對訓練資料的一半進行隨機取樣。在每次提升迭代中使用不同的子集有助於防止過度擬合。
- colsample_bytree:用於產生提升過程中的每棵樹的部分特徵。使用特徵子集來建立每棵樹能夠在建模過程中引入更多的隨機性,從而提高類推性。
- max_depth:樹的最大深度。增加這個值會使模型更加複雜,並可能過度擬合。
複製並貼上以下程式碼區塊,以設定要從中搜尋的上述超參數的範圍。
# Setting ranges of hyperparameters to be tuned
hyperparameter_ranges = {
"eta": ContinuousParameter(0, 1),
"subsample": ContinuousParameter(0.7, 0.95),
"colsample_bytree": ContinuousParameter(0.7, 0.95),
"max_depth": IntegerParameter(1, 5)
}
3.5 複製並貼上以下程式碼區塊,以設定超參數調整器。SageMaker 執行貝氏最佳化常式作為搜尋程序的預設設定。在本教學中,您可以使用隨機搜尋方法來減少執行時間。參數根據使用驗證資料集時模型的 AUC 效能進行調整。
objective_metric_name = "validation:auc"
# Setting up tuner object
tuner_config_dict = {
"estimator" : xgb_estimator,
"max_jobs" : 5,
"max_parallel_jobs" : 2,
"objective_metric_name" : objective_metric_name,
"hyperparameter_ranges" : hyperparameter_ranges,
"base_tuning_job_name" : tuning_job_name_prefix,
"strategy" : "Random"
}
tuner = HyperparameterTuner(**tuner_config_dict)
3.6 您可以在調整器物件上呼叫 fit () 方法以啟動超參數調整任務。為了擬合調整器,您可以指定不同的輸入管道。此教學提供訓練和驗證管道。複製並貼上以下程式碼區塊,以啟動超參數調整任務。完成此操作大約需要 13 分鐘。
# Setting the input channels for tuning job
s3_input_train = TrainingInput(s3_data="s3://{}/{}".format(read_bucket, train_data_key), content_type="csv", s3_data_type="S3Prefix")
s3_input_validation = (TrainingInput(s3_data="s3://{}/{}".format(read_bucket, validation_data_key),
content_type="csv", s3_data_type="S3Prefix")
)
tuner.fit(inputs={"train": s3_input_train, "validation": s3_input_validation}, include_cls_metadata=False)
tuner.wait()
3.7 啟動的調整任務可在 SageMaker 主控台的超參數調整任務下查看。請注意,由於時間戳記不同,附加的影像中顯示的調整任務名稱與您看到的名稱並不相同。
3.8 調整完成後,您即可存取結果摘要。複製並貼上以下程式碼區塊,以在依遞減順序排序的 pandas DataFrame 中擷取調整任務結果。
# Summary of tuning results ordered in descending order of performance
df_tuner = sagemaker.HyperparameterTuningJobAnalytics(tuner.latest_tuning_job.job_name).dataframe()
df_tuner = df_tuner[df_tuner["FinalObjectiveValue"]>-float('inf')].sort_values("FinalObjectiveValue", ascending=False)
df_tuner
3.9 您可以檢查效能最佳的超參數組合。
步驟 4:使用 SageMaker Clarify 檢查模型偏差並解釋模型預測
在得到經過訓練的模型後,您需要了解模型或資料中是否存在任何固有偏差,然後才能部署模型。模型預測可能是偏差的來源 (例如,如果它們做出的預測對一個群體產生負面結果比另一個群體更頻繁)。SageMaker Clarify 使用特徵歸因方法協助解釋經過訓練的模型的預測。本教學的重點是訓練後偏差指標和可解釋性的模型 SHAP 值。具體來說,包含以下常見任務:
- 資料和模型偏差偵測
- 使用特徵重要性值的模型可解釋性
- 特徵影響和對單個資料樣本的局部解釋
4.1 在 SageMaker Clarify 能夠執行模型偏差偵測之前,它需要一個 SageMaker 模型,該模型由 SageMaker Clarify 部署到一個臨時端點,作為分析的一部分。然後,當 SageMaker Clarify 分析完成後,該端點將被刪除。複製並貼上以下程式碼區塊,以根據從調整任務中確定的最佳訓練任務建立 SageMaker 模型。
tuner_job_info = sagemaker_client.describe_hyper_parameter_tuning_job(HyperParameterTuningJobName=tuner.latest_tuning_job.job_name)
model_matches = sagemaker_client.list_models(NameContains=xgb_model_name)["Models"]
if not model_matches:
_ = sess.create_model_from_job(
name=xgb_model_name,
training_job_name=tuner_job_info['BestTrainingJob']["TrainingJobName"],
role=sagemaker_role,
image_uri=tuner_job_info['TrainingJobDefinition']["AlgorithmSpecification"]["TrainingImage"]
)
else:
print(f"Model {xgb_model_name} already exists.")
4.2 若要執行偏差偵測,您需要為 SageMaker Clarify 設定多個元件組態。您可以在 Amazon SageMaker Clarify 中找到更多詳細資訊。對於此教學,除了標準組態之外,您還需要設定 SageMaker Clarify,以透過檢查目標是否偏向於以客戶性別為基礎的值,來偵測資料在統計學上是否對女性有偏差。複製並貼上以下程式碼,以設定 SageMaker Clarify 組態。
train_df = pd.read_csv(train_data_uri)
train_df_cols = train_df.columns.to_list()
clarify_processor = sagemaker.clarify.SageMakerClarifyProcessor(
role=sagemaker_role,
instance_count=clarify_instance_count,
instance_type=clarify_instance_type,
sagemaker_session=sess,
)
# Data config
bias_data_config = sagemaker.clarify.DataConfig(
s3_data_input_path=train_data_uri,
s3_output_path=bias_report_output_uri,
label="fraud",
headers=train_df_cols,
dataset_type="text/csv",
)
# Model config
model_config = sagemaker.clarify.ModelConfig(
model_name=xgb_model_name,
instance_type=train_instance_type,
instance_count=1,
accept_type="text/csv",
)
# Model predictions config to get binary labels from probabilities
predictions_config = sagemaker.clarify.ModelPredictedLabelConfig(probability_threshold=0.5)
# Bias config
bias_config = sagemaker.clarify.BiasConfig(
label_values_or_threshold=[0],
facet_name="customer_gender_female",
facet_values_or_threshold=[1],
)
4.3 在 SageMaker Clarify 內,訓練前指標顯示資料中預先存在偏差,而訓練後指標顯示模型預測存在偏差。藉助 SageMaker 開發套件,您可以指定想要檢查哪些群組的偏差,以及要考慮哪些偏差指標。出於本教學的目的,您將分別使用 Class Imbalance (CI) (類不平衡 (CI)) 和 Difference in Positive Proportions in Predicted Labels (DPPL) (預測標籤中正比例的差異 (DPPL)) 作為訓練前和訓練後偏差統計的範例。如需其他偏差指標的詳細資訊,請參閱衡量訓練前偏差和訓練後資料和模型偏差。複製並貼上以下程式碼區塊,以執行 SageMaker Clarify 並產生偏差報告。所選的偏差指標將作為參數傳遞到 run_bias 方法中。執行此程式碼大約需要 12 分鐘。
clarify_processor.run_bias(
data_config=bias_data_config,
bias_config=bias_config,
model_config=model_config,
model_predicted_label_config=predictions_config,
pre_training_methods=["CI"],
post_training_methods=["DPPL"]
)
clarify_bias_job_name = clarify_processor.latest_job.name
4.4 SageMaker Clarify 的輸出會儲存到您的預設 S3 儲存貯體。複製並貼上以下程式碼,以將 PDF 格式的 SageMaker Clarify 報告從 Amazon S3 下載到 SageMaker Studio 中的本機目錄。
# Copy bias report and view locally
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/bias/report.pdf ./clarify_bias_output.pdf
4.5 在該 PDF 報告中,訓練前和訓練後偏差指標顯示,該資料集似乎在客戶性別特徵方面存在類不平衡性。這種不平衡性可以透過套用 SMOTE 等技術重新建立訓練資料集來糾正。您還可以使用 SageMaker Data Wrangler 並指定服務中可用的 SMOTE 等多個選項之一,以平衡訓練資料集。如需詳細資訊,請參閱 Data Wrangler 平衡資料。為簡單起見,本教學課程中不包含此步驟。
4.6 除了資料偏差之外,SageMaker Clarify 還可以分析經過訓練的模型,並根據特徵重要性建立模型可解釋性報告。SageMaker Clarify 會使用 SHAP 值來解釋每個輸入特徵對最終預測的貢獻。複製並貼上以下程式碼區塊,以設定並執行模型可解釋性分析。執行此程式碼區塊大約需要 14 分鐘。
explainability_data_config = sagemaker.clarify.DataConfig(
s3_data_input_path=train_data_uri,
s3_output_path=explainability_report_output_uri,
label="fraud",
headers=train_df_cols,
dataset_type="text/csv",
)
# Use mean of train dataset as baseline data point
shap_baseline = [list(train_df.drop(["fraud"], axis=1).mean())]
shap_config = sagemaker.clarify.SHAPConfig(
baseline=shap_baseline,
num_samples=500,
agg_method="mean_abs",
save_local_shap_values=True,
)
clarify_processor.run_explainability(
data_config=explainability_data_config,
model_config=model_config,
explainability_config=shap_config
)
4.7 複製並貼上以下程式碼,以將 PDF 格式的 SageMaker Clarify 可解釋性報告從 Amazon S3 下載到 SageMaker Studio 中的本機目錄。
# Copy explainability report and view
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/explainability/report.pdf ./clarify_explainability_output.pdf
4.8.該報告包含特徵重要性圖表,展示輸入特徵對模型預測的貢獻度。對於本教學課程中訓練的模型,產生預測最重要的特徵似乎是 customer_gender_male,緊隨其後的特徵是 num-injuries。這種特徵排名提供對預測機制的重要洞見,並透過合理且可解釋的 ML 使用驅動模型的微調和開發。
4.9 偏差和可解釋性分析結果也可在 SageMaker Studio 中的 SageMaker 首頁和實驗區段下檢視。
4.10 選擇未指派的執行。 選取名為 clarify-explainability-<datetimestamp> 的可解釋性報告。
4.11 在可解釋性標籤上,您可以看到特徵重要性圖表。您還可透過選擇匯出 PDF 報告來下載報告。
4.12 SageMaker Clarify 產生的可解釋性報告還提供一個稱為 out.csv 的檔案,其中包含各個樣本的本機 SHAP 值。複製並貼上下面的程式碼區塊,以使用該檔案來視覺化任何單個範例的解釋 (每個特徵對模型預測的影響)。
import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
local_explanations_out = pd.read_csv(explainability_report_output_uri + "/explanations_shap/out.csv")
feature_names = [str.replace(c, "_label0", "") for c in
local_explanations_out.columns.to_series()]
local_explanations_out.columns = feature_names
selected_example = 100
print("Example number:", selected_example)
local_explanations_out.iloc[selected_example].plot(
kind="bar", title="Local explanation for the example number " + str(selected_example), rot=60, figsize=(20, 8)
);
4.13 對於選擇的範例 (測試集中的第一個樣本),汽車索賠總額、性別、每日事故和傷害次數對預測影響最大。
步驟 5:將模型部署到即時推論端點
在此步驟中,您將部署從超參數調整任務中取得的最佳模型部署到一個即時推論端點,然後使用該端點產生預測。有多種方法可以部署一個訓練好的模型,例如使用 SageMaker 開發套件、AWS 開發套件 - Boto3 和 SageMaker 主控台。如需詳細資訊,請參閱 Amazon SageMaker 文件中的部署用於推論的模型。在此範例中,您將使用 SageMaker 開發套件將模型部署到即時端點。
5.1 複製並貼上以下程式碼區塊,以部署最佳模型。
best_train_job_name = tuner.best_training_job()
model_path = estimator_output_uri + '/' + best_train_job_name + '/output/model.tar.gz'
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")
create_model_config = {"model_data":model_path,
"role":sagemaker_role,
"image_uri":training_image,
"name":endpoint_name_prefix,
"predictor_cls":sagemaker.predictor.Predictor
}
# Create a SageMaker model
model = sagemaker.model.Model(**create_model_config)
# Deploy the best model and get access to a SageMaker Predictor
predictor = model.deploy(initial_instance_count=predictor_instance_count,
instance_type=predictor_instance_type,
serializer=CSVSerializer(),
deserializer=CSVDeserializer())
print(f"\nModel deployed at endpoint : {model.endpoint_name}")
5.2 該程式碼使用最佳訓練任務名稱從 Amazon S3 擷取模型。XGBoost 可以接受 text/libsvm 或 text/csv 格式的輸入資料。本教學中使用的輸入資料集採 CSV 格式,因此部署組態包括一個 CSVSerializer (將 CSV 輸入轉換為位元組串流) 以及一個 CSVDeserializer (將位元組串流中的原生模型輸出轉換回 CSV 格式供我們使用)。該程式碼區塊執行完畢後,將返回模型部署到的端點的名稱。該部署還會返回一個 SageMaker Predictor,它可以用來調用端點來執行預測,如下一部分所示。
5.3 您可透過選取 SageMaker 首頁圖示,接著選取部署,然後選取端點,從 SageMaker Studio 介面檢查已部署的端點。
5.4 您還可透過 SageMaker 主控台下的推論、端點檢查端點。
5.5 現在,模型已部署到端點,您可以透過直接叫用 REST API (本教學課程中未描述)、透過 AWS 開發套件、SageMaker Studio 中的圖形介面或使用 SageMaker Python 開發套件來調用。在本教學課程中,您將使用透過部署步驟提供的 SageMaker Predictor 來取得對一個或多個測試樣本的即時模型預測。複製並貼上下面的程式碼區塊,以調用端點併傳送單個測試資料樣本。
# Sample test data
test_df = pd.read_csv(test_data_uri)
payload = test_df.drop(["fraud"], axis=1).iloc[0].to_list()
print(f"Model predicted score : {float(predictor.predict(payload)[0][0]):.3f}, True label : {test_df['fraud'].iloc[0]}")
5.6 該儲存格的輸出顯示模型端點發回的真實標籤和預測分數。由於預測的機率很低,測試樣本被模型正確地標記為非詐騙。
步驟 6:清除資源
最佳實務是刪除不再使用的資源,以免產生意外費用。
6.1 若要刪除模型和端點,請將以下程式碼複製並貼到筆記本中。
# Delete model
try:
sess.delete_model(xgb_model_name)
except:
pass
sess.delete_model(model.name)
# Delete inference endpoint config
sess.delete_endpoint_config(endpoint_config_name=predictor._get_endpoint_config_name())
# Delete inference endpoint
sess.delete_endpoint(endpoint_name=model.endpoint_name)
6.2 若要刪除 S3 儲存貯體,請執行以下操作:
- 開啟 Amazon S3 主控台。在導覽列上,選擇 Buckets (儲存貯體)、sagemaker-<您的區域>-<您的帳戶 ID>,然後選取 fraud-detect-demo 旁邊的核取方塊。然後選擇 Delete (刪除)。
- 在 Delete objects (刪除物件) 對話方塊中,確認您已選取要刪除的物件,然後將 permanently delete (永久刪除) 輸入到 Permanently delete objects (永久刪除物件) 確認方塊。
- 當此操作完成且儲存貯體為空時,您可以透過再次執行相同程序來刪除儲存貯體 sagemaker-<您的區域>-<您的帳戶 ID>。
若要刪除 SageMaker Studio 應用程式,請執行下列操作:在 SageMaker 主控台上,選擇網域,然後選擇 StudioDomain。從使用者設定檔清單中,選取 studio-user,然後透過選擇刪除應用程式,來刪除應用程式下列出的所有應用程式。若要刪除 JupyterServer,請選擇動作,然後選擇刪除。等待片刻直到狀態變更為已刪除。
6.4 如果您在步驟 1 中使用了現有的 SageMaker Studio 網域,請略過步驟 6 的其餘部分並直接進入「結論」部分。
如果您在步驟 1 中執行 CloudFormation 範本來建立新的 SageMaker Studio 網域,請繼續執行下列步驟以刪除由 CloudFormation 範本建立的網域、使用者和資源。
6.5 若要開啟 CloudFormation 主控台,請在 AWS Console 搜尋列中輸入 CloudFormation,然後從搜尋結果中選擇 CloudFormation。
6.6 開啟 CloudFromation 主控台。在 CloudFormation 窗格中,選擇堆疊。從狀態下拉式清單中,選取作用中。在堆疊名稱下,選擇 CFN-SM-IM-Lambda-catalog 以開啟堆疊詳細資訊頁面。
6.7 在 CFN-SM-IM-Lambda-catalog 堆疊詳細資訊頁面上,選擇刪除以刪除在步驟 1 中建立的堆疊及資源。