尽管本次实验不涉及 CDF 组件,但我们已将其用于解释其他实验中使用的 CDSW 模型端点是如何实现的。
在本次实验中,您将在 CDSW 中运行实验,选择产生最佳实验结果的模型并将该模型部署到生产环境中。
实验总结
- 实验 1 - CDSW:训练模型。
- 实验 2 - 部署模型。
实验 1 - CDSW:训练模型
在本实验和接下来的实验中,您将戴上数据科学家的帽子。您将编写模型代码,对其进行多次训练,最后将模型部署到生产环境。整个实验全部在30分钟内完成!
第 1 步:配置 CDSW
- 打开 CDSW Web UI 并以 身份登录admin,如果您还没有这样做的话(第一次登陆,请创建admin用户)。
- 导航到 CDSW Site Administration页面以微调环境:
- 在Runtime/Engines选项卡中,在Resource Profiles中添加一个具有 2 个 vCPU 和 4 GB RAM 的新引擎(docker 映像),同时删除默认引擎。
- 检查环境变量下是否已存在以下变量。如果没有,请添加:
HADOOP_CONF_DIR=/etc/hadoop/conf/
第 2 步:创建项目
- 返回主页并单击New Project,使用此 GitHub 项目作为源:https://github.com/cloudera-labs/edge2ai-workshop
- 现在您的项目已经创建,单击Open Workbench并启动 Python3 会话:
修改Docker的PIP安装默认源路径,在CDSW Project的页面打开_Terminal Access:
在Terminal中执行下面的命令:
代码语言:javascript复制cat > ~/.pip/pip.conf <<EOF
[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host=pypi.douban.com
EOF
然后再执行pip的安装等,速度就快了很多。执行完之后就可以关掉该终端了。
在/home/cdsw下做的修改,都会持久化存储和使用。
- 引擎准备就绪后,运行以下命令来安装一些必需的库:
!pip3 install --upgrade pip scikit-learn pandas
- 该项目带有一个历史数据集。将此数据集复制到 HDFS:
!hdfs dfs -put -f data/historical_iot.txt /user/$HADOOP_USER_NAME
- 您现在已准备好运行实验以根据您的历史数据训练模型。
- 此时您可以停止引擎。
- 修改cdsw_build.sh文件,在pip安装中增加pandas,然后保存。
pip3 install --upgrade pip scikit-learn pandas
第 3 步:检查cdsw.iot_exp.py
打开文件cdsw.iot_exp.py。这是一个 python 程序,它构建一个模型来预测机器故障(这台机器发生故障的可能性)。hdfs 上有一个包含客户数据的数据集,包括故障指示器字段。
该程序将使用随机森林算法构建故障预测模型。随机森林是决策树的集合。随机森林是用于分类和回归的最成功的机器学习模型之一。它们结合了许多决策树以降低过度拟合的风险。与决策树一样,随机森林处理分类特征,扩展到多类分类设置,不需要特征缩放,并且能够捕获非线性和特征交互。
spark.mllib支持随机森林进行二元和多类分类以及回归,同时使用连续和分类特征。spark.mllib使用现有的决策树实现来实现随机森林。有关树的更多信息,请参阅决策树指南。
随机森林算法需要几个参数:
- numTrees:森林中的树木数量。
增加树的数量将减少预测的方差,提高模型的测试时间准确性。训练时间在树的数量上大致呈线性增长。
- maxDepth:森林中每棵树的最大深度。
增加深度使模型更具表现力和功能。然而,深度树需要更长的时间来训练,也更容易过度拟合。一般来说,与使用单个决策树相比,使用随机森林训练更深的树是可以接受的。一棵树比随机森林更容易过度拟合(因为对森林中的多棵树进行平均会降低方差)。
在cdsw.iot_exp.py程序中,这些参数可以在运行时传递给程序,传递给这些python变量:
代码语言:javascript复制param_numTrees = int(sys.argv[1])
param_maxDepth = int(sys.argv[2])
另请注意,随机森林模型的质量指标被写回到 Data Science Workbench 存储库:
代码语言:javascript复制cdsw.track_metric("auroc", auroc)
cdsw.track_metric("ap", ap)
这些指标稍后将显示在“Experiments”仪表盘中。
第 4 步:第一次运行实验
- 现在,使用以下参数运行实验:
nnumTrees = 20 numDepth = 20
- 从菜单中选择Run → Run Experiments…。现在,在后台,Data Science Workbench 环境将启动一个新的 docker 容器,该程序将在其中运行。
- 返回 CDSW 中的Projects页面,然后点击Experiments按钮。
- 如果状态指示Running,您必须等待运行完成。如果状态为Build Failed或Failed ,请检查日志信息。这可以通过单击Experiments的运行编号来访问。在那里您可以找到会话日志以及构建信息。
- 如果您的状态显示为Success,您应该能够看到auroc(曲线下面积)模型质量指示器。CDSW 用户界面可能隐藏了此值。在这种情况下,单击“3 metrics”链接,然后选择 auroc 字段。可能需要取消选择其他一些字段,因为界面只能同时显示 3 个指标。
- 在这个例子中,~0.8415。不错,但也许有更好的参数值可用。
第 5 步:重新运行实验几次
- 返回 Workbench 并再运行 2 次实验,并为 NumTrees 和 NumDepth 尝试不同的值。尝试以下值:
NumTrees NumDepth
15 25
25 20
- 当所有运行都成功完成后,检查哪些参数具有最佳质量(最佳预测值)。这由曲线下的最高面积表示:auroc指标。
第 6 步:将最佳模型保存到您的环境中
- 选择具有最佳预测值的运行编号(在上面的示例中,实验3)。
- 在实验的概览屏幕中,您可以看到Pickle 格式 (.pkl )的模型,捕获到iot_model.pkl文件中。选择此文件并点击添加到项目按钮。这会将模型复制到您的项目目录中。
实验 2 - CDSW:部署模型
第 1 步:检查程序cdsw.iot_model.py
- 打开您在上一个实验中创建的项目并在 Workbench 中检查该文件。这个 PySpark 程序使用该pickle.load机制来部署模型。模型是从iot_modelf.pkl文件中加载的,该文件保存在上一个实验中,来自具有最佳预测模型的实验。
该程序还包含predict定义,它是调用模型的函数,将特征作为参数传递,并将返回结果变量。
- 在部署模型之前,在 Workbench 中进行尝试:启动 Python3 引擎(如果之前的session没有关掉,可以从Sessions进入)并运行文件中的代码cdsw.iot_model.py。然后从提示中调用该predict()方法:
predict({"feature": "0, 65, 0, 137, 21.95, 83, 19.42, 111, 9.4, 6, 3.43, 4"})
- 函数成功返回,所以我们知道我们现在可以部署模型了。您现在可以停止引擎。
第 2 步:部署模型
- 从项目的主页中,选择“模型”按钮。选择新模型并指定以下配置:
Name: IoT Prediction Model
Description: IoT Prediction Model
File: cdsw.iot_model.py
Function: predict
Example Input: {"feature": "0, 65, 0, 137, 21.95, 83, 19.42, 111, 9.4, 6, 3.43, 4"}
Kernel: Python 3
Engine: 1 vCPU / 4 GB Memory
Replicas: 1
- 设置完所有参数后,单击“Deploy Model”按钮。等到模型部署完毕。这可能需要几分钟。
第 3 步:测试部署的模型
- 当您的模型状态更改为Deployed时,单击模型名称链接以转到模型的概览页面。在该页面上,单击“测试”按钮以检查模型是否正常工作。
因为模型启用了API Key认证,因此上述执行会报错。
- 点击左上角的Cloudera Data Science Workbench图标,进入主页,然后点击左侧的User Settings按钮,进入用户设置页面,再点击API Keys菜单,进入API Key设置页面。找到下面的API Key区域,点击Create API Key
将生成的API Key和KeyID复制保存,用于后续使用。待退出该页面后,API Key将无法再获取。
- 将复制的API Key粘贴到模型的API Key区域,然后再进行Test
- 带有状态的绿色圆圈success表示我们对模型的 REST 调用正在运行。1响应中的表示{"result": 1}收集这些温度读数的机器不太可能出现故障。
- 现在,让我们更改输入参数并再次调用预测函数。在输入字段中输入以下值:
{
"feature": "0, 95, 0, 88, 26.62, 75, 21.05, 115, 8.65, 5, 3.32, 3"
}
- 有了这些输入参数,模型返回0,这意味着机器很可能会坏掉。