Jarvis-拍立淘里面的深度学习引擎-之持续优化-阿里云开发者社区

开发者社区> 搜索与推荐技术> 正文
登录阅读全文

Jarvis-拍立淘里面的深度学习引擎-之持续优化

简介: 介绍 Jarvis是一款专门为手机端而设计研发的深度学习引擎,它比我们目前已知的所有开源产品都要快。在使用高通芯片的安卓手机上,其他产品在性能上甚至还没有接近于我们的。小小骄傲一下。在最开始的时候,Jarvis was heavily influenced by Caffe2 and borrowed quite a bit of code from it. 但是随着时间的推移以及业务的演进,Jarvis离Caffe2也越来越远,所以,我们最终决定发布独立的产品。

介绍

Jarvis是一款专门为手机端而设计研发的深度学习引擎,它比我们目前已知的所有开源产品都要快。在使用高通芯片的安卓手机上,其他产品在性能上甚至还没有接近于我们的。小小骄傲一下。在最开始的时候,Jarvis was heavily influenced by Caffe2 and borrowed quite a bit of code from it. 但是随着时间的推移以及业务的演进,Jarvis离Caffe2也越来越远,所以,我们最终决定发布独立的产品。

Jarvis由淘宝的 拍立淘 业务而生,已持续稳定服役一年。

性能

距离上次介绍Jarvis又过去了三个月的时间,现在的Jarvis相比之前又有了很多进步,在端上承载的拍立淘业务也逐渐增多。不知不觉间,Jarvis已经成为了最快的那一款。之前我们的CPU实现比ncnn要慢,现在已经超过了。而GPU的实现在之前的高起点上又有了更大的提高,之前GPU的性能大约是ncnn的两倍,现在已经到了4倍。

在下表中,我列出了几款常见的端上深度学习引擎的SqueezeNet耗时(毫秒)对比。

Jarvis(GPU) Jarivs(CPU) Caffe2(Facebook) ncnn(Tencent) mdl(Baidu)
Samsung S8 30 80 110 120 150
Huawei P10 - 110 160 140 180
iPad pro 23 56 140 65 -
iPhone 6sp 35 58 160 80 -

在我们测试几款高中低端手机上,Jarvis的CPU实现的性能表现都是最好的。GPU就不用说了。

下面这幅图是在Samsung S8上,换算成FPS(每秒处理图片数)的对比结果。

TB1XjMLXGmWBuNjy1XaXXXCbXXa-822-621.png

使用

编译打包

已经随源码一起提供了预编译包,参考目录里面的android和iOS demo工程。也可以使用里面的工程自己编译打包。

模型生成

为了平衡性能、包大小以及便利程度,Jarvis采用flatbuffers作为模型文件格式。

示例里面带有SqueezeNet和MobileNet两个已经生成好的model,tools目录下面有转化caffe和caffe2模型的工具。

如果需要,你也可以可以使用C++,包含public目录下的schema_generated.h头文件通过代码动态生成模型。

当然,你也可以使用Objective-C++来包含这个文件。事实上,如果你想,你甚至可以根据schema.fbs文件生成Java类来做同样的事儿。

API

Jarvis提供了android(Java),iOS(Objective-C)和C++三套API,都很简单。Jarvis在设计时已尽量屏蔽掉烦人的东西,而只提供给你极速的体验。

查看一下Java类,Objective-C interface或者public目录里面的header file,即可知道Jarvis为数不多的API了。

android

// 构建网络,modelBuffer是包含jarvis模型文件的ByteBuffer
Session session = new Session(modelBuffer);

// Where amazing happens, jarvis会根据网络配置的输入大小对testBitmap做缩放
Tensor[] results = session.inference(testBitmap);

// 得到结果
float[] values = results[0].readFloats();


// 更通用的调用方式
Tensor input = session.input(0);
float[] data = new float[input.size()];
// put some values...
input.write(data);
// run
session.inference();
// got result
Tensor output = session.output(0);
float[] results = output.readFloats();

iOS

// model是包含模型的NSData *
JVSSession *session = [[JVSSession alloc] initWithModel:model];
NSArray<JVSTensor *> *results = [session inferenceWithImage:testImage];

C++

std::unique_ptr<jarvis::Session> session(new jarvis::Session(model_buffer));
auto results = session->inference_rgba(p_rgba, width, height, stride);

目前我们在运行的业务

  1. 用户行为特征端上实时计算
  2. 拍立淘活动页面扫商品/logo抠图
  3. 拍立淘多主体拍照识别和智能识别

这一阶段我们所完成的工作

  1. 性能优化,iOS和Android都有较大提升
  2. 统一了iOS和Android的基础代码
  3. 完善了caffe model的转化工具
  4. 多数据类型支持,现在已经可以运行float32和float16网络
  5. 更多的线上业务

接下来的安排

  1. int8的支持,下一个必需攻克的难关。有了它,安卓低端机无忧
  2. Mali GPU优化,能达到和高通GPU同样的水平吗

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

AI Online Serving,阿里巴巴集团搜索与推荐,算法与工程技术的大本营,大数据深度学习时代的创新主场。

官方博客
最新文章
相关文章
友情链接