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 名称 | 任务类型 | Pipeline 文件 CDN 链接 |
---|---|---|
image classification MobileNet | 图片分类 | image-classification-mobilenet.json |
image classification ResNet | 图片分类 | image-classification-resnet.json |
text classification Bayes | 文本分类 | text-classification-bayes.json |
object detection YOLO | 目标检测 | object-detection-yolo.json |
在文章开始时演示的就是其中的 text classification Bayes
模型。
那么这个 Pipeline 到底是什么样的呢?Pipeline 使用 JSON 来描述样本收集、数据流,模型训练/预测这些阶段和每个阶段相关的参数。
{
"specVersion": "2.0",
"type": "ImageClassification",
"datasource": "https://cdn.jsdelivr.net/gh/imgcook/pipcook-script@5ec4cdf/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/pipcook-script@5ec4cdf/scripts/image-classification/build/dataflow.js?size=224&size=224"
],
"model": "https://cdn.jsdelivr.net/gh/imgcook/pipcook-script@5ec4cdf/scripts/image-classification/build/model.js",
"artifacts": [],
"options": {
"framework": "tfjs@3.8",
"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 上(ai-sample.oss-cn-hangzhou.aliyuncs.com/image_class…),样本中包含两个类别,分别是 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/pipcook@main/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
ℹ 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 "image=@/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 仓库地址:github.com/alibaba/pip… 脚本仓库地址:github.com/imgcook/pip…
转载自:https://juejin.cn/post/7003297331411943460