SKIL/快速入门

59 篇文章 0 订阅

快速入门

Skymind智能层(SKIL)的社区版是免费的。它是一个数据科学平台,可以快速轻松地将数据科学项目从原型带入到生产部署。SKIL通过面向数据科学家、数据工程师和DevOps/IT的跨团队平台,在python数据科学生态系统和生产JVM环境之间架起桥梁。它是用于机器学习工作流程的自动化工具,可以方便地在Spark-GPU集群上进行训练 ;实验跟踪;训练模型的一键部署;模型性能监控等等。


在这个快速入门中,你将学习如何:

  • 下载和安装SKIL CE
  • 创建示例工作间笔记本并训练模型
  • 将模型部署到SKIL模型服务器
  • 从REST端点获取预测
    • 通过Web浏览器
    • 通过Java代码

检查系统要求

在继续之前,确保你的机器满足系统要求。
如果你需要快速启动与SKIL兼容的机器,请阅读我们的Amazon AMI启动指南。

 

安装SKIL

选决条件

确保你的机器安装了Git和Apache Maven。
SKIL有两种风格:

  • 下载
  • 安装

 

启动 SKIL CE

确保端口9008和8080打开。
要在本地启动SKIL CE系统,请使用以下命令:

Shell

sudo systemctl start skil

等待一分钟,让SKIL加载,然后在Web浏览器中访问地址http://localhost:9008或http://hostname:9008。等待5-10分钟,让SKIL完成第一次启动(随后的运行将比这快)。

SKIL Starting up

SKIL 启动中

 

输入SKIL许可证
首先,你需要在“许可证”屏幕上输入SKIL许可证:

如果你没有许可证,可以在https://skymind.ai/activate注册试用许可证。

 

为用户“admin”添加密码
现在添加根帐户的密码,即“admin”,以完成初始设置。

Updating "admin" user password

更新“admin”用户密码

SKIL CE是由单个数据科学家使用和评估的,因此在这篇快速入门的文章中,我们将忽略角色和帐户管理。

接下来,本指南将演示如何构建笔记本并将其部署到模型服务器。

 

将模型从笔记本带到部署

SKIL和SKIL CE的目的是快速构建深度学习应用程序的原型,并将最佳模型部署到生产级的人工智能模型服务器上。

深度学习模型的构建很复杂,部署起来很难。SKIL为数据科学家和基础设施工程团队解决了这些难题。深度学习在预测分析和机器感知方面有广泛的应用领域,它几乎影响到每个行业。

下面是一些可以集成到我们的应用程序中的深度学习模型:

  • ICU 患者死亡率
  • 计算机视觉
  • 异常检测

除了构建上述模型外,SKIL还使开发人员能够将预测引擎插入到现实应用程序中,例如:

  • Tomcat Web应用程序
  • WildFly应用程序
  • 移动应用程序
  • 流系统(流集)
  • 机器人系统和边缘设备(Somatic, Lego Mindstorms)

SKIL平台帮助数据科学家构建深度学习模型,并用工作台和人工智能模型服务器将其集成到应用程序中。
你可以跟踪模型的多个版本,比较每个版本在训练后的表现,并通过一键式操作将最佳模型部署到生产环境的SKIL的人工智能模型服务器上。
使用SKILCE,开发人员可以开始构建真正的、最先进的深度学习应用程序,而无需担心基础设施和管道系统。
下图概述了SKIL工作间系统和SKIL的AI模型服务器如何协同工作,以提供一个企业级平台来操作深度学习应用程序。

下面介绍如何用SKIL CE构建你的第一个SKIL模型。

 

创建工作间

 

要开始,请按照以下步骤在SKIL用户界面中创建新的工作间:
1)单击主SKIL界面左侧的工作空间选项卡,弹出工作空间屏幕,如下图所示。

 

每个新的工作间都是一个围绕特定项目进行一组“实验”的地方。

“实验”只是应用于给定问题的神经网络模型和数据管道的不同配置,而工作间实际上是一个共享实验室,数据科学家可以使用它来测试哪些神经网络在该问题上表现最好。一个关于SKIL的实验可以包含在一个Zeppelin笔记本中,它允许你根据需要保存、克隆和运行一个特定的建模作业。


每个笔记本都由SKIL跟踪和索引,笔记本中配置的训练模型可以直接发送到SKIL的AI模型服务器。当数据科学家寻求最佳模型时,一个SKIL工作间可以有许多不同的笔记本来进行不同的实验。假设经过几次实验,发现了一个性能良好的模型,并且希望将它与生产中的应用程序集成在一起。

2)创建工作间
单击左侧的“工作间”选项卡后,单击页面右侧的“创建工作间”按钮(见下文)。

单击“创建工作间 ”按钮将显示此对话框窗口:

在这个窗口中,你命名一个实验,以区别于将在这个公共工作间中创建的其它实验。

对于本教程,请将此实验称为“First Sensor Project”。或者,我们可以向此工作间添加一些标签,以帮助稍后识别它(例如,“side_project”或“prod_job”等)。准备完成新工作间后,可以单击窗口右下角的“创建工作间(Create Workspace)”。

新工作间应出现在工作区列表中:

单击刚刚创建的工作间名称(“First Sensor Project”)将显示工作间详细信息:

现在,你已经准备好在新工作间中创建第一个实验。

 

创建实验
在工作间中,你可以创建包含在Zeppelin笔记本中的实验。你和你的团队可以创建、运行和克隆这些笔记本实验,以改进协作并加快洞察时间。
通过单击“创建新实验(Create New Experimen)”按钮,你将打开“创建实验(Create Experiment)”对话框窗口(如下)。

使用“实验名称”下的输入框,为该实验提供一个唯一的描述性名称,以便以后查找。

为“Model History Server ID”和“Zeppelin Server ID”选择唯一列出的选项(在当前SKIL CE版本中,每个选项只有一个选项)。你还可以提供一个独特的笔记本名称,该名称将应用于Zeppelin笔记本存储系统中。

完成实验及其笔记本的设置后,单击“创建实验笔记本(Create Experiment Notebook)”按钮。新实验应该出现在当前工作间的实验列表中,如下所示。

创建实验后,你可以通过单击新实验的“打开笔记本(Open Notebook)”按钮来签出关联的实验笔记本。这将显示嵌入式笔记本系统(如下)。

每个笔记本都以包含DL4J代码的通用模板开始,该模板将作为典型项目的基础。


对于这个例子,你将基于传感器数据构建一个LSTM模型。此笔记本的代码如下:
uci_quickstart_notebook.scala


在这个特定的示例中,删除模板代码块,并将代码块从上面的Github链接复制并粘贴到笔记本中。笔记本应该自动保存,但在任何时候,你都可以使用“版本控制”按钮对Zeppelin版本控制系统进行特定的提交,如下所示。

单击Zeppelin内部的版本控制按钮,可以选择添加提交消息以保存当前状态。一旦笔记本代码输入到笔记本本身并保存,就可以执行此笔记本并生成模型。

 

运行实验

要在笔记本中运行实验,请单击嵌入的Zeppelin笔记本用户界面顶部工具栏上的“播放”图标。这将运行该笔记本中的所有代码段。

笔记本需要一些时间才能运行。一旦完成,笔记本的输出将在笔记本本身中可见。

本指南将介绍笔记本的一些代码片段。笔记本中的第一段运行所有需要的导入(scala中)并设置其他段落以供执行。本笔记本有四个主要功能区:

  1. UCI 数据下载与预处理 / ETL
  2. 神经网络配置
  3. 网络训练循环
  4. 向SKIL模型服务器注册建模结果

代码的第一个区域,我们将重点介绍下载训练数据和对代码执行一些基本ETL。这个链接带我们到代码,在这里我们可以看到原始的CSV数据:

  1. 从磁盘加载
  2. 转换成序列
  3. 统计收集的数据
  4. 然后对序列进行归一化/标准化

代码的下一个区域是使用DL4J API配置神经网络。在这个例子中,我们使用了一个称为长短期记忆网络(LSTM)的循环神经网络的变体。

Scala

// 配置网络
val conf = new NeuralNetConfiguration.Builder()
  .seed(123)
  .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
  .weightInit(WeightInit.XAVIER)
  .updater(new Nesterovs(0.005, 0.9))
  .gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
  .gradientNormalizationThreshold(0.5)
  .graphBuilder()
  .addInputs("input")
  .setInputTypes(InputType.recurrent(1))
  .addLayer("lstm", new GravesLSTM.Builder().activation(Activation.TANH).nIn(1).nOut(10).build(), "input")
  .addVertex("pool", new LastTimeStepVertex("input"), "lstm")
  .addLayer("output", new OutputLayer.Builder(LossFunction.MCXENT)
            .activation(Activation.SOFTMAX).nIn(10).nOut(numLabelClasses).build(), "pool")
  .setOutputs("output")
  .pretrain(false)
  .backprop(true)
  .build()

该网络有一个单独的LSTM隐藏层(Graves变体)和一个softmax输出层,以给出六类时间序列数据的概率。网络的训练循环为40轮(每轮是对训练集中所有记录的完整传递)。

Scala

val nEpochs = 40
for (i <- 0 until nEpochs) {
  network_model.fit(trainData)
  // 在测试集上评估
  val evaluation = eval(testData)
  val accuracy = evaluation.accuracy()
  val f1 = evaluation.f1()
  println(s"Test set evaluation at epoch $i: Accuracy = $accuracy, F1 = $f1")
  testData.reset()
  trainData.reset()
}

//在笔记本的训练循环的正下方,有一些调试行显示如何查询LSTM网络。
//测试一条记录(标签应为1)
val record = Array(Array(Array(
  -1.65, 1.38, 1.37, 2.56, 2.72, 0.64, 0.76, 0.45, -0.28, -2.72, -2.85, -2.27, -1.23, -1.42, 0.90,
  1.81, 2.77, 1.12, 2.25, 1.26, -0.23, -0.27, -1.74, -1.90, -1.56, -1.35, -0.54, 0.41, 1.20, 1.59,
  1.66, 0.75, 0.96, 0.07, -0.70, -0.32, -1.13, -0.77, -0.96, -0.55, 0.39, 0.56, 0.52, 0.98, 0.91,
  0.23, -0.13, -0.31, -0.98, -0.73, -0.85, -0.77, -0.80, -0.04, 0.64, 0.77, 0.50, 0.98, 0.40, 0.24
)))
val flattened = ArrayUtil.flattenDoubleArray(record)
val input = Nd4j.create(flattened, Array(1, 1, 60), 'c')
val output = network_model.output(input)
val label = Nd4j.argMax(output(0), -1)
println(s"Label: $label")

网络预测返回的标签应该是“1”,稍后我们将从客户端手动检查。笔记本以一段代码结尾,该代码收集刚刚训练过的模型,并将其编入模型历史跟踪系统中。


每个实验都需要向模型服务器发送一个模型及其评估指标,以便注册和存档。每个SKIL笔记本必须包含少量代码,如下所述,以确保模型存储在正确的位置。

Scala

val modelId = skilContext.addModelToExperiment(z, network_model, "LSTM model")
val evalId = skilContext.addEvaluationToModel(z, modelId, evaluation, "Test set")

 

除了正确的导入头和在笔记本顶部附近创建skilContext对象之外,这些代码行还将此笔记本与SKIL系统的结果连接起来。

在第一行中,具体的模型被附加到SKIL系统的实验中。在下一行中,使用SKIL中的model id标记对评估度量结果进行编目,以便稍后在UI中相对其他模型进行评估。

 

编目模型

人工智能模型服务器允许SKIL存储深度学习模型并将其与人工智能应用程序集成。它存储给定实验的所有模型修订,并允许你选择要“部署”或标记为“活动”的模型。部署模型意味着它将是向查询REST端点的任何生产应用程序提供预测的模型。

在SKIL中运行上述笔记本示例后,单击“实验”页面中的“模型”子选项卡,以查看表中列出的新模型(如下所示)。这可能需要刷新页面。

既然你已经用笔记本构建了一个模型,并确保模型已在模型服务器中编目,那么下一个指南将展示如何通过部署模型的其余接口将模型向世界其他地方公开。

部署模型
一旦模型在模型历史服务器中建立了索引,它将显示在模型列表中,这些模型可以部署到生产中以处理新的数据推理请求。
在“实验”页面的“模型”子选项卡中,有一个列表,列出了本实验笔记本运行生成的所有模型,如上图所示。单击列表中的一个模型将显示特定的模型详细信息(如下)。

对于此列表中的每个模型,可以执行两个操作:

  1. 标记为最好
  2. 部署 

如上图所示,将模型标记为“最佳”会将其固定到模型列表的顶部。点击“部署向导”按钮,弹出“部署模型”对话框窗口。

在SKIL中,“部署”是“模型、转换和KNN端点的逻辑组”。它有助于我们在逻辑上对部署的组件进行分组,以跟踪哪些组件组合在一起,以便更好地管理系统。

如对话框中所述,此向导将通过REST API使你的模型可用。然后你将能够公开ETL进程作为转换端点,并配置模型。你还可以选择就地更新现有模型。单击“下一步”将允许你创建新部署或替换现有部署,如下面的对话框所示。

让我们创建一个新的部署,并将其命名为“OurFirstDeployment”。在按下“下一步”按钮后出现的对话框窗口中,你可以看到“将当前ETL JSON部署为转换”选项。

这指的是ETL数据的矢量化,对此的解释超出了本文的范围。现在,你可以不选中该复选框。再次单击“下一步”将进入最终部署向导屏幕(如下)。

这里的“name”选项不同于“deployment name”,因为它区分了部署组内的模型。这是必需的。对于这个例子,我们将使用名称“lstm_model”。你还可以在本地文件系统中看到物理模型文件的静态文件路径。

“Scale”选项告诉系统要启动多少模型服务器进行模型复制。SKIL CE仅限于1个模型服务器,因此你不必更改该参数。

在下一行中,存在提供其他JVM参数的选项。最后一个选项“端点URL(Endpoint URLs)”提供了在同一个URI下容纳多个模型的选项。在本快速入门教程中,我们不会设置此选项。接受“部署模式”为“新模型”,然后单击“部署”完成部署。

单击“Deploy”(部署)按钮完成部署后,模型将在“Deployments”(部署)屏幕中列出(如下)。

单击这个新部署模型的条目会显示部署详细信息(如下)。

注意:如果模型未部署,请单击模型上的“开始”按钮:

此部署包括其各自的ETL矢量化转换。它还包括“端点”列中绑定到模型服务器的端点URL。以下是如何通过这个新部署的模型的REST接口获得实时预测:

故障排除

你可能会在某个时刻看到以下错误(部署模型、不存在JWT或已过期):

如果是这样,请保持当前浏览器选项卡打开。创建一个新选项卡,然后重新登录。重新登录后关闭新选项卡。再次尝试执行发生错误的原始操作。

 

推理

 

通过模型服务器获取预测

一旦创建并启动了一个部署,你就需要通过实际服务从这个新创建的人工智能模型到一个真正的应用程序的实时预测来完成“最后一英里”。

在本节中,你将学习如何建立一个样例Java客户端(可以很容易地集成到Tomcat或Java应用程序)中,以查询你刚刚用笔记本构建的模型。


模型服务器正在本地运行,它已在以下位置公开了一个REST端点:
http://[host]:9008/endpoints/ourfirstdeployment/model/lstmmodel/default/
现在,正确地将客户端配置为“speak REST”,并使用你选择的输入数据发送特定的查询。让我们看看如何获得这些预测,REST Java客户端示例代码如下。

 

通过REST获得预测


要获得一个工作的SKIL模型服务器客户端,“git clone”存储在这里的项目

https://github.com/SkymindIO/SKIL_Examples

用如下命令:

Shell

$ git clone git@github.com:SkymindIO/SKIL_Examples.git

使用以下命令构建客户端应用程序JAR:

Shell

$ cd SKIL_Examples
$ cd sample-api
$ mvn clean package

构建客户端应用程序后,使用jar通过以下命令对SKIL的AI模型服务器进行REST调用:

Shell

$ java -jar target/skil-ce-examples-1.0.0.jar quickstart http://host:9008/[skil_endpoint_name]

注意:用模型部署到的端点替换[skil_endpoint_name]。

客户端示例代码的输出应该如下所示:

Shell

Inference response: Inference.Response.Classify{results{[1]}, probabilities{[0.9729845]}
  Label expected: 1
Inference response: Inference.Response.Classify{results{[4]}, probabilities{[0.8539419]}
  Label expected: 4
Inference response: Inference.Response.Classify{results{[5]}, probabilities{[0.9414516]}
  Label expected: 5
Inference response: Inference.Response.Classify{results{[5]}, probabilities{[0.94135857]}
  Label expected: 5
The output above shows inference predictions the SKIL AI model server returns, referring to specific labels in the classifier.

有了它,你就可以用SKIL构建你的第一个深度学习应用程序,从笔记本到部署的生产模型。不是很难吧?

观看此空间,了解有关生产中深度学习的更多应用程序的进一步教程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值