执行作业

作业是在后台对连接的SKIL资源运行的计算。作业可以有两种类型:

  1. 训练
  2. 推理

运行作业

完成将外部资源连接到skil之后,可以通过以下两种方式对其执行训练/推理作业。

A. CLI
B. REST 端

skil jobs命令管理通过SKIL CLI执行作业的工作流程。等效的REST端点也可用。
作业工作流程如下:

  1. 创建一个作业。
  2. 提交在步骤1中创建的作业以运行。作业在后台开始运行。
  3. 定期检查正在运行的作业的状态。
  4. 从已完成的作业下载输出文件。
  5. 从作业列表中删除已完成的作业(可选)。

可以使用SKIL同时创建和运行多个作业。它们的执行顺序将取决于底层计算资源。

1. 创建作业

对于创建作业,skil提供以下内容:
cli:skil jobs create<args>。
REST端点:post -/jobs/<type>。其中<type>指的是作业类型,可以是训练或推理。
两种变体的格式如下:

cli

skil jobs create --type <training/inference> --storageResourceId <storage_resource_id> --computeResourceId <compute_resource_id> --jobArgs <job_arguments> --outputFileName <output_file_name>

REST - cURL

curl -d '{"computeResourceId": <compute_resource_id>, "storageResourceId": <storage_resource_id>, "jobArgs": "<skil_spark_main_args>", "outputFileName": "<output_file_name>"}' -H "Authorization: Bearer <auth_token>" -H "Content-Type: application/json" -X POST http://localhost:9008/jobs/<type># <type> => one of ["training", "inference"]

参数如下:

参数 详情 类型
computeResourceId 计算资源的ID。 Long
storageResourceId 存储资源的ID。 Long
jobArgs

作业参数

示例:

"jobArgs":"-mo /var/skil/neuralnet.zip -tm /var/skil/parameteraveraging.json -dsp io.skymind.skil.train.spark.MnistProvider --evalType evaluation --numEpochs 1 --outputPath /tmp/output5049941383652659983.zip"
String
outputFileName 从作业生成的输出文件应该具有的名称。 String
type 作业类型["training", "inference"]之一 String

2.运行工作
要运行作业,请使用以下任一项:
cli:skil jobs run--id<jobid>。
REST端点:post-/jobs/<id>/run。创建作业时会获取作业ID。
它们的格式是:

CLI

skil jobs run --id <jobId>

REST 端

curl -d '{}' -H "Authorization: Bearer <auth_token>" -H "Content-Type: application/json" -X POST http://localhost:9008/jobs/<id>/run

参数如下

参数 详情 类型
id 作业ID,创建作业后获得 Long

3.获取作业状态
注意
由YARM资源支持的作业目前不支持状态检查。
要接收作业状态,请使用以下任一项:
cli:skil jobs status --id<jobid>。
REST端点:get-/jobs/<id>/refresh。创建作业时会获得作业ID。
它们的格式是:

skil jobs status --id <jobId>

REST 端

curl -d '{}' -H "Authorization: Bearer <auth_token>" -H "Content-Type: application/json" -X POST http://localhost:9008/jobs/<id>/refresh

参数如下

参数 详情 类型
id 作业ID,创建作业后获得 Long

4.从作业中获取输出
目前,只有通过REST端点才支持下载作业的输出。
注意
只有当作业的运行状态为“完成”时,此操作才有效。
相关端点及其格式如下:
REST端点:post -/jobs/<id>/outputfile。创建作业时会获取作业ID。

REST 端

curl -d '{"localDownloadPath": "<local_download_path>"}' -H "Authorization: Bearer <auth_token>" -H "Content-Type: application/json" -X POST http://localhost:9008/jobs/<id>/outputfile

参数如下

参数 详情 类型
localDownloadPath 要下载输出的本地文件路径。 String
id 作业ID,创建作业后获得 Long

5.删除完成的作业(可选)
要删除作业,请使用以下任一项:
cli:skil jobs rm --id<jobid>。
REST端点:DELETE -http://localhost:9008/jobs/<id>。创建作业时会获取作业ID。
它们的格式是:

CLI

skil jobs rm --id <jobId>

REST 端

curl -H "Authorization: Bearer <auth_token>" -X DELETE http://localhost:9008/jobs/<id>

参数如下

参数 详情 类型
id 作业ID,创建作业后获得 Long

创建并运行作业同样可以在笔记本中执行如下示例代码来完成

import io.skymind.auth.JWTUtil;
import io.skymind.jobs.client.JobClient;
import io.skymind.jobs.model.JobModel;
import io.skymind.jobs.model.JobRun;
import io.skymind.jobs.model.JobType;
import io.skymind.resource.client.SKILResourceClient;
import io.skymind.resource.model.Resource;
import io.skymind.resource.model.subtypes.ResourceDetails;
import io.skymind.resource.model.subtypes.compute.SparkResourceDetails;
import io.skymind.resource.model.subtypes.storage.HDFSResourceDetails;
import io.skymind.skil.train.spark.MnistKeyedProvider;
import org.apache.spark.storage.StorageLevel;
import org.datavec.api.transform.serde.JsonMappers;
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.inputs.InputType;
import org.deeplearning4j.nn.conf.layers.ConvolutionLayer;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.conf.layers.SubsamplingLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.deeplearning4j.spark.impl.paramavg.ParameterAveragingTrainingMaster;
import org.deeplearning4j.util.ModelSerializer;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.learning.config.Nesterovs;
import org.nd4j.linalg.lossfunctions.LossFunctions;
import com.mashape.unirest.http.Unirest;
import scala.collection.JavaConversions._import java.io.File;
import java.io.IOException;
import java.util.List;def getTrainingMasterConfFile(nameNodePort: Int, folder: File): File = {val parameterAveragingTrainingMaster: ParameterAveragingTrainingMaster =new ParameterAveragingTrainingMaster.Builder(100).batchSizePerWorker(1000).averagingFrequency(3).exportDirectory("hdfs://localhost:" + nameNodePort + new File(folder,"exportdir").getAbsolutePath).workerPrefetchNumBatches(10).storageLevel(StorageLevel.DISK_ONLY).build()val jsonWriteParamAveraging: File =new File(folder, "parameteraveraging.json")JsonMappers.getMapper.writeValue(jsonWriteParamAveraging, parameterAveragingTrainingMaster)jsonWriteParamAveraging}def getModelFile(folder: File): File = {val builder: MultiLayerConfiguration.Builder = // Training iterations as abovenew NeuralNetConfiguration.Builder().seed(230).l2(0.0005).weightInit(WeightInit.XAVIER).optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).updater(Nesterovs.builder().learningRate(0.01).momentum(0.9).build()).list().layer(0,new ConvolutionLayer.Builder(5, 5).nIn(1).stride(1, 1).nOut(20).activation(Activation.IDENTITY).build()).layer(1,new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2).stride(2, 2).build()).layer(2,new ConvolutionLayer.Builder(5, 5).stride(1, 1).nOut(50).activation(Activation.IDENTITY).build()).layer(3,new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2).stride(2, 2).build()).layer(4,new DenseLayer.Builder().activation(Activation.RELU).nOut(500).build()).layer(5,new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(10).activation(Activation.SOFTMAX).build()).setInputType( //See note belowInputType.convolutionalFlat(28, 28, 1))val network: MultiLayerNetwork = new MultiLayerNetwork(builder.build())network.init()val neuralNet: File = new File(folder, "neuralnet.zip")ModelSerializer.writeModel(network, neuralNet, true)neuralNet}def main() {val localSparkHome: String = "/opt/spark"val sparkMasterUrl: String = "spark://localhost:7077"val hadoopNamenodeHost: String = "localhost"val hadoopNamenodePort: Int = 8020val SKILURL: String = "http://localhost:9008"val JOBS_WORK_DIR: String = "/tmp/skil-jobs"val resourceClient: SKILResourceClient = new SKILResourceClient(SKILURL)resourceClient.setAuthToken(JWTUtil.generateSystemToken())val jobClient: JobClient = new JobClient(SKILURL)jobClient.setAuthToken(JWTUtil.generateSystemToken())// cleanup all earlier jobs and resourcesval jobs: List[JobModel] = jobClient.getAllJobsfor (job <- jobs) {jobClient.deleteJob(job.getJobId)}val resources: List[Resource] = resourceClient.getResourcesprintln(resources)for (resource <- resources) {resourceClient.deleteResource(resource.getResourceId)}// Create the compute and storage resourcesval sparkResourceDetails = new SparkResourceDetails(localSparkHome, sparkMasterUrl);val hdfsResourceDetails = new HDFSResourceDetails(hadoopNamenodeHost, String.valueOf(hadoopNamenodePort));// add the resources to the databaseval computeResource = resourceClient.addResource("SKIL YARN", sparkResourceDetails, "");val storageResource = resourceClient.addResource("SKIL HDFS", hdfsResourceDetails, "");val jobsFolder = new File(JOBS_WORK_DIR);if (!jobsFolder.exists()) jobsFolder.mkdirs();val outputPath = new File(jobsFolder.getAbsolutePath(), "output.zip").getAbsolutePath();// create a new SKIL training job using these resourcesval jobArgs: Array[String] = Array("--skil.spark.master", "local[*]","--skil.spark.deploy-mode", "client","--skil.spark.conf", "spark.executor.extraJavaOptions=-Dorg.bytedeco.javacpp.maxbytes=6G","--skil.spark.executor-memory", "1g","--skil.spark.total-executor-cores", String.valueOf(1),"--skil.spark.conf", "spark.hadoop.fs.defaultFS=hdfs://" + hadoopNamenodeHost + ":" + hadoopNamenodePort,"-mo", getModelFile(jobsFolder).getAbsolutePath(),"-tm", getTrainingMasterConfFile(hadoopNamenodePort, jobsFolder).getAbsolutePath(),"-kdsp",classOf[MnistKeyedProvider].getName,"--evalType", "evaluation","--numEpochs", "1","--outputPath", outputPath);println("jobArgs: " + jobArgs.mkString(" "));val testTrainingJob = jobClient.createJob(JobType.TRAINING, computeResource.getResourceId(), storageResource.getResourceId(), jobArgs.mkString(" "));println("job created:" + testTrainingJob.toString())// run the jobUnirest.setTimeouts(0, 0);var jobEntity = jobClient.runJob(testTrainingJob.getJobId());Unirest.setTimeouts(10000, 60000);// check the status immediately after submissionprintln("jobEntity started running:" + jobEntity.toString());// check the status after 90 secondsThread.sleep(90000);jobEntity = jobClient.getRunStatus(jobEntity.getRunId());println("jobEntity after 90 seconds:" + jobEntity.toString());// cleanupjobClient.deleteJob(testTrainingJob.getJobId());resourceClient.deleteResource(computeResource.getResourceId());resourceClient.deleteResource(storageResource.getResourceId());}main()

SKIL/工作流程/执行作业相关推荐

  1. SKIL/工作流程/与SKIL客户端一起工作

    与SKIL客户端一起工作 SKIL可以通过外部环境通过SKIL Clients使用.外部环境可以是笔记本,也可以是客户端应用程序.SKIL客户端(又称skil-clients)是用于操作SKIL实例的 ...

  2. 机器人末端执行器气爪怎么吸合_机器人的手部也称末端执行器,它是装在机器人的( )上,直接抓握工作或执行作业的部件。_学小易找答案...

    [填空题]网络虚拟化是指让一个物理网络支持多个 . [简答题]标称电压与额定电压有何不同 ? (15.0分) [简答题]符号检验用于哪种检验问题?检验拒绝域是什么? [简答题]赠孟浩然 李白 吾爱孟夫 ...

  3. SKIL/工作流程/资源

    资源 当今世界,我们收集越来越多的增长和复杂的数据集,这些数据集往往需要使用复杂的模型.更重要的是,大型和非结构化的数据并没有一个适合所有存储解决方案. 要在有趣的现实问题上进行机器学习,需要适应大量 ...

  4. SKIL/工作流程/概述

    概述 SKIL减少了实验数据科学建模.关键测试和产品决策以及可扩展部署工程之间的冲突.它弥合了Python生态系统与DevOps.IT和数据工程师部署体系结构之间的鸿沟. 从开始到结束 使用skil的 ...

  5. SKIL/工作流程/命令行

    命令行 (CLI) SKIL带有一个内置的命令行界面(CLI),用于高级设置和管理任务.有时,你需要用特殊变量手动实例化一个进程,或者编写一个定制的shell脚本来管理你自己的SKIL应用程序-CLI ...

  6. SKIL/工作流程/嵌入式SKIL

    嵌入式SKIL 除了提供几乎所有用于创建高效机器学习管道的工具之外,SKIL还可以非常方便地作为嵌入式应用程序.这对于一个DevOps团队来说是非常有用的,可以让他们的模型在最短的时间内运行起来,并且 ...

  7. SKIL/工作流程/SKIL上的分布式训练

    SKIL中的分布式训练 SKIL提供了skil spark命令,用于在spark 集群上对DL4J模型进行分布式训练.它几乎类似于使用带有一些附加功能的spark-submit命令,以便能够查看DL4 ...

  8. SKIL/工作流程/Java部署客户端

    Java部署客户端 SKIL部署客户端是用于处理SKIL客户端请求的Java API.与原始JSON请求相比,它直观且易于使用.它提供了构建请求对象的构建器模式.响应有自己的类对象. 添加到项目 客户 ...

  9. SKIL/工作流程/实验中的TensorFlow

    实验中的TensorFlow SKIL还支持TensorFlow开箱即用.使用新的Keras API的任何TensorFlow模型都可以导入SKIL的模型服务系统.在尝试一个实验之前,请确保你已首先将 ...

最新文章

  1. Request.ServerVariables参数集
  2. 政府要尽快对应用商店出台管理办法
  3. Thinking in java 多线程导致数组越界崩溃的BUG
  4. Google因数据泄露关闭Google+消费者版本
  5. python有道翻译-Python版有道翻译
  6. mysql 通过sock来登陆
  7. 百度地图 key_Android百度地图导航的接入(包含驾车、公交、步行)
  8. Linux目录结构及作用
  9. 年底求职难?起薪28万的数据岗位,人才缺口达150万,不限专业学历……
  10. MindSpore:不用摘口罩也知道你是谁
  11. (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail...
  12. js触发button的点击事件
  13. Java实现一个会员制度的CD出租销售店,基本的功能有:一是对会员的管理,包括增加会员、删除会员;二是对货品的管理,包括出租、销售CD、进货、统计账目等。
  14. 大数据技术在应急事件处理中的启示
  15. 第一次JAVA课,第一次课堂考,课后感受
  16. 基于Python自动登录QQ空间过滑块验证
  17. 跨时钟域传输和Verilog代码
  18. PLC高精度定时器(T法测速功能块)
  19. ruoyi导出excel时合并单元格
  20. 《和平精英》×开心麻花电影《独行月球》的讨巧互利联动

热门文章

  1. 国产开源项目年度盘点
  2. Small Object Detection using Context and Attention
  3. 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)
  4. 轨迹误差评估指标[APE/RPE]和EVO[TUM/KITTI]
  5. 解决java “错误:编码GBK的不可映射字符 (0xBD)“原创
  6. CSS基础学习(三)
  7. 江苏电信欢go与省公安厅合作保无线上网安全
  8. 编程中保护眼睛的颜色
  9. Landsat影像的辐射定标和大气校正
  10. Intel万兆网卡,intel万兆双口网卡X540T2 性能解剖