likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 8

文/ 阿里淘系 F(x) Team - 牟牟

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

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

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

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

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

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

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

是的,从模型开始训练到文本分类服务上线,也只需要 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 类型,dataSourcedataflowmodel 这三类脚本以及构建插件 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…),样本中包含两个类别,分别是 avatarblurBackground,你也可以用自定义的数据集替换,训练出属于你自己的分类模型。定义了所使用的 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 客户端进行安装。在此示例中没有配置构建插件,所以此项会被忽略。

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

我们定义 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 目录中的。

预测

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

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

通过 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 就可以访问到图片分类任务的交互界面进行测试了。

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

选择图片并点击 Predict 按钮:

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

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

$ 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,也欢迎加入钉钉群讨论。

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

Pipcook 仓库地址:github.com/alibaba/pip… 脚本仓库地址:github.com/imgcook/pip…


淘系前端-F-x-Team 开通微博 啦!(微博登录后可见)
除文章外还有更多的团队内容等你解锁🔓
转载自:https://juejin.cn/post/7003297331411943460
评论
请登录