Press "Enter" to skip to content

20秒完成机器学习模型训练和部署?! 说说 Pipcook 2.0

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

Pipcook 1.0 让 Web 开发者能够以比较低的门槛开始机器学习之路,开启和加速了前端智能化时代。而在实践的过程中,我们也发现了一些问题,其中用户反馈最多的问题就是安装 Pipcook 比较困难,成功率比较低,经常因为网络问题安装失败,即便网络顺畅,安装时长也至少需要3分钟以上,其次是初次启动训练时 Pipcook 会安装插件,也会耗费用户大量的时间。

 

 

针对 1.0 的问题问题,我们在 2.0 中做了大量重构和优化,我们先看看 Pipcook 2.0 的安装速度:

 

从 1.0 的几分钟降低到不到 20 秒!也不再需要通过  pipcook init
命令安装 daemon。由于解耦了沉重的机器学习框架,包大小得到了有效的控制,安装成功率接近 100%。

 

让我们再来看一下文本分类任务从模型训练到服务上线的时间:

 

 

是的,从模型开始训练到文本分类服务上线,也只需要 20 秒!

 

接下来,我们自己动手,来看一下如何使用 Pipcook 2.0 快速训练出模型并部署上线。

 

Pipeline 介绍

 

在开始动手之前,我们需要先了解一下 Pipeline。在 Pipcook 中,我们用 Pipeline 表示一个模型的工作流,目前实现了 4 条 Pipeline,分别是:

 

 

Pipeline 名称任务类型
image classification MobileNet图片分类
image classification ResNet图片分类
text classification Bayes文本分类
object detection YOLO目标检测

 

在文章开始时演示的就是其中的text classification Bayes
模型。

 

那幺这个 Pipeline 到底是什幺样的呢?Pipeline 使用 JSON 来描述样本收集、数据流,模型训练/预测这些阶段和每个阶段相关的参数。

 

{
"specVersion": "2.0",
"type": "ImageClassification",
"datasource": "https://cdn.jsdelivr.net/gh/imgcook/[email protected]/scripts/image-classification/build/datasource.js?url=http://ai-sample.oss-cn-hangzhou.aliyuncs.com/image_classification/datasets/imageclass-test.zip",
"dataflow": [
"https://cdn.jsdelivr.net/gh/imgcook/[email protected]/scripts/image-classification/build/dataflow.js?size=224&size=224"
  ],
"model": "https://cdn.jsdelivr.net/gh/imgcook/[email protected]/scripts/image-classification/build/model.js",
"artifacts": [],
"options": {
"framework": "[email protected]",
"train": {
"epochs": 10
    }
  }
}

 

如上面的 JSON 所示,Pipeline 由版本,Pipeline 类型,dataSource
dataflow
model
这三类脚本以及构建插件artifacts
,Pipeline 选项options
组成。

 

目前支持的 Pipeline 类型包括ImageClassification
(图片分类),TextClassification
(文本分类),ObjectDetection
(目标检测),在 Pipcook 后续迭代中也会不断增加对其他任务类型的支持。

 

每个脚本通过 URI query 传递参数,model 脚本的参数也可以通过options.train
定义。

 

artifacts
定义了一组构建插件,每个构建插件会在训练结束后被依次调用,从而可以对输出的模型进行转换、打包、部署等。

 

options
包含框架(Framework)定义和训练参数的定义。

 

在这个示例 Pipeline 中,任务类型为ImageClassification
,即图片分类。我们还定义了图片分类所需的数据源脚本,数据处理脚本,模型脚本,我们准备的数据源存储在 OSS 上(http://ai-sample.oss-cn-hangzhou.aliyuncs.com/image_classification/datasets/imageclass-test.zip),样本中包含两个类别,分别是avatar
blurBackground
,你也可以用自定义的数据集替换,训练出属于你自己的分类模型。定义了所使用的 Pipeline 运行依赖的框架为 tfjs 3.8,训练的参数为 10 个 epoch。

 

下一步,我们就能通过 Pipcook 来运行它了。

 

运行 Pipeline

 

安装

 

想要安装和运行 Pipcook,需要满足几个条件:

 

操作系统:MacOS 或 Linux,(Windows 有基本的支持,但未完全测试)

 

Node.js v12.17.0 或 v14.0.0 以上( v13 不支持)

 

然后运行命令:

 

$ npm install @pipcook/cli -g

 

等待安装完成即可。

 

训练

 

我们把 Pipeline 文件保存为image-classification.json
,然后执行:

 

$ pipcook train ./image-classification.json -o my-pipcook
ℹ preparing framework
████████████████████████████████████████ 100% 133 MB/133 MB
ℹ preparing scripts
████████████████████████████████████████ 100% 1.12 MB/231 kB
████████████████████████████████████████ 100% 11.9 kB/3.29 kB
████████████████████████████████████████ 100% 123 kB/23.2 kB
ℹ preparing artifact plugins
ℹ initializing framework packages
ℹ running data source script
downloading dataset ...
unzip and collecting data...
ℹ running data flow script
ℹ running model script
Platform node has already been set. Overwriting the platform with [object Object].
2021-08-29 23:32:08.647853: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
loading model ...
Epoch 0/10 start
Iteration 0/20 result --- loss: 0.8201805353164673 accuracy: 0.5
Iteration 2/20 result --- loss: 0.03593956679105759 accuracy: 1
.....
Epoch 9/10 start
Iteration 0/20 result --- loss: 1.1920930376163597e-7 accuracy: 1
Iteration 2/20 result --- loss: 2.0116573296036222e-7 accuracy: 1
Iteration 4/20 result --- loss: 2.5331991082566674e-7 accuracy: 1
Iteration 6/20 result --- loss: 2.123416322774574e-7 accuracy: 1
Iteration 8/20 result --- loss: 1.937151523634384e-7 accuracy: 1
Iteration 10/20 result --- loss: 0.000002644990900080302 accuracy: 1
Iteration 12/20 result --- loss: 0.000003799833848461276 accuracy: 1
Iteration 14/20 result --- loss: 2.8312223321336205e-7 accuracy: 1
Iteration 16/20 result --- loss: 1.49011640360186e-7 accuracy: 1
Iteration 18/20 result --- loss: 5.438936341306544e-7 accuracy: 1
ℹ pipeline finished, the model has been saved at /Users/pipcook-playground/my-pipcook/model

 

我们在代码仓库中也保存了这个示例,你也可以通过 URL 直接运行:

 

$ pipcook train https://cdn.jsdelivr.net/gh/alibaba/[email protected]/example/pipelines/image-classification-mobilenet.json -o my-pipcook

 

参数-o
表示我们的训练工作空间被定义在./my-pipcook
中。

 

从日志中我们可以看出,Pipcook 在准备阶段会下载一些必要的依赖项,分别为:

Framework:一个框架指的是一组压缩包,每个压缩包针对不同的运行环境,比如操作系统,node 版本等,提供了 pipeline 运行所需要的依赖。我们的运行环境是 MacOS, node 12.22,依赖 tfjs 3.8 框架,Pipcook 会自动根据当前环境选择适配的框架文件。这个框架文件是由 Pipcook 维护的,默认镜像是国内的阿里云 OSS,所以网络不佳的同学们不用担心下载的问题。同时在us-west
也维护了一份拷贝,国外的同学也可以方便地下载到。每个框架 URL 的文件只会被下载一次,之后再次使用时会从缓存中获取。

Scripts:Pipcook 的模型任务由一组 bundle 后的脚本组成,在这个示例中,脚本被存储在 github 上,可以通过 jsdelivr 进行 CDN 加速,脚本可以引入框架中的包对数据进行处理或者进行模型训练。

 

Artifacts: 构建插件用于对训练后的模型进行处理,比如上传 OSS 等 post-train 的操作。由于这些插件本身都比较轻,且每个插件安装完后都会有缓存,因此它们被设计成了 npm 包,通过 npm 客户端进行安装。在此示例中没有配置构建插件,所以此项会被忽略。

 

准备工作完成后,就会依次运行datasource
dataflow
model
,开始拉取训练数据,处理样本,喂入模型进行训练。

 

我们定义 Pipeline 的训练参数为 10 个 epoch,因此模型训练在 10 个 epoch 后停止。

 

此时,我们的训练产物被保存在工作空间./my-pipcook
中的model
文件夹内。

 

my-pipcook
    ├── cache
    ├── data
    ├── framework -> /Users/pipcook-playground/.pipcook/framework/c4903fcee957e1dbead6cc61e52bb599
    ├── image-classification.json
    ├── model
    └── scripts

 

可以看到,工作空间中包含了此次训练所需的所有内容,其中 Framework 是下载完成后被软链到工作空间的framework
目录中的。

 

预测

 

接下来我们准备一张头像图片。

 

 

通过pipcook predict
命令输入模型进行类别预测,两个参数分别为工作空间和待预测的图片地址:

 

$ pipcook predict ./my-pipcook -s ./avatar.jpg
ℹ preparing framework
ℹ preparing scripts
ℹ preparing artifact plugins
ℹ initializing framework packages
ℹ prepare data source
ℹ running data flow script
ℹ running model script
Platform node has already been set. Overwriting the platform with [object Object].
2021-08-30 00:08:28.070916: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
predict result: [{"id":0,"category":"avatar","score":0.9999955892562866}]
✔ Origin result:[{"id":0,"category":"avatar","score":0.9999955892562866}]

 

预测和训练时一样,也会准备 Framework,Scripts 和 Artifact 等必要的依赖,当依赖已存在时则会忽略。这样即使我们将模型移动到其他设备上,也可以直接运行,Pipcook 会自动进行运行环境的准备。

 

从输出日志上看,模型预测这张图片的类型为avatar
,可信度 0.999。

 

部署

 

通过 Pipcook 部署机器学习模型的命令为pipcook serve <workspace-path>

 

$ pipcook serve ./my-pipcook/image-classification.json
ℹ preparing framework
ℹ preparing scripts
ℹ preparing artifact plugins
ℹ initializing framework packages
Pipcook has served at: http://localhost:9091

 

默认端口为 9091,也可以通过-p
参数指定。

 

然后我们通过浏览器打开 http://localhost:9091 就可以访问到图片分类任务的交互界面进行测试了。

 

 

选择图片并点击 Predict 按钮:

 

 

当然我们也可以直接访问预测接口:

 

curl http://localhost:9091/predict -F "[email protected]/Users/pipcook-playground/avatar.jpg" -v
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9091 (#0)
> POST /predict HTTP/1.1
> Host: localhost:9091
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 60452
> Content-Type: multipart/form-data; boundary=------------------------6917c53e808d414f
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
< Content-Length: 64
< ETag: W/"40-kCOJxkKqWqcndfPNbdrICzIiW+A"
< Date: Mon, 30 Aug 2021 03:59:49 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
* Connection #0 to host localhost left intact
{"success":true,"data":[{"id":0,"category":"avatar","score":1}]}* Closing connection 0

 

Pipcook 会根据 Pipeline 类型提供不同的交互界面和接口。

 

结语

 

Pipcook 2.0 的介绍到这里就结束啦,有兴趣的小伙伴欢迎 star,欢迎 issue 和 PR,也欢迎加入钉钉群讨论。

 

 

Pipcook 仓库地址:https://github.com/alibaba/pipcook

 

脚本仓库地址:https://github.com/imgcook/pipcook-script

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注