点击我爱计算机视觉标星,更快获取CVML新技术


本文转自机器之心

参与:一鸣、杜伟

还在为机器学习模型打包成 API 发愁?这个工具能让你一行代码直接打包。

专注于机器学习应用的人们知道,从训练好的模型到实际的工业生产工具还有一定的距离。其中工作量很大的地方在于将模型打包,预留 API 接口,并和现有的生产系统相结合。近日,GitHub 上有了这样一个项目,能够让用户一行代码将任意模型打包为 API。这一工具无疑能够帮助开发者在实际的生产应用中快速部署模型。

项目地址:https://github.com/cortexlabs/cortex

项目特点和原理

该项目名为 Cortex,是一个命令行工具。作者表示,该项目具有以下优点:

  • 自动定义:Cortex 可以自动定义需要负责生产工作的 API;

  • 多框架支持:Cortex 支持多种机器学习框架,包括 TensorFlow、PyTorch、scikit-learn、XGBoost 等;

  • CPU/GPU 支持:Cortex 能够在 CPU 或者 GPU 上进行推理工作;

  • 回滚式更新:Cortex 可以对部署的 API 直接更新;

  • 日志流:Cortex 会保留部署模型的日志流,并在 CLI 上显示;

  • 预测监控:Cortex 能够监控网络的评价指标,并追踪预测结果;

  • 最小配置:部署时,用户只需要在一个名为 cortex.yaml 的文件中配置相关属性。

这一项目是怎样工作的?具体而言,每当用户运行 cortex deploy 时,命令行将配置属性和代码发送到服务器集群上。每个模型都载入到一个 Docker 容器中,包括相关的 Python 包和处理请求的代码。模型通过网络服务,如 Elastic Load Balancing (ELB)、Flask、TensorFlow Serving 和 ONNX Runtime 公开 API 给用户使用。容器通过 Elastic Kubernetes Service (EKS) 进行控制,而日志文件和评价指标的记录和打印工作由 CloudWatch 完成。

使用方法

使用过程主要分为以下三个步骤:

定义模型的 API

# predictor.pymodel = download_my_model()
def predict(sample, metadata):        return model.predict(sample["text"])

如上所示,用户需要做的是定义代表这个 API 的函数,使其能够根据输入数据返回输出。

配置部署

# cortex.yaml- kind: deploymentname: sentiment- kind: apiname: classifierpredictor:path: predictor.pytracker:model_type: classificationcompute:gpu: 1

第二个步骤中,用户需要创建一个新的 yaml 文件,这个文件用于配置相关属性。

具体而言,用户可以定义部署模型的名称,本例中名为 classifierpredictor。然后还需要定义 API 的名称,如 classifierpredictor 以及路径、模型的类型和使用的 GPU 数量等。

AWS 部署

$ cortex deploycreating classifier (http://***.amazonaws.com/sentiment/classifier)

以 AWS 为例,以上工作完成后,用户可以创建这个 API,使其利用 AWS 进行工作。

当然,用户还可以实时保存推断结果,如下所示:

$ curl http://***.amazonaws.com/sentiment/classifier \
-X POST -H "Content-Type: application/json" \
-d '{"text": "the movie was great!"}'positive

此外,用户还可以监控运行结果。

$ cortex get classifier --watchstatus up-to-date available requested last update avg latency
live 1 1 1 8s 123msclass count
positive 8
negative 4

使用教程

为了让用户更好地使用这一工具,项目作者同时还提供了一些使用案例。包括:

  • 基于 TensorFlow 和 BERT 进行情感分析:https://github.com/cortexlabs/cortex/tree/0.10/examples/tensorflow/sentiment-analysis

  • 基于 TensorFlow 和 Inception 模型进行图像分类:https://github.com/cortexlabs/cortex/tree/0.10/examples/tensorflow/image-classifier

  • 基于 PyTorch 和 DistilGPT2 进行文本生成:https://github.com/cortexlabs/cortex/tree/0.10/examples/pytorch/text-generator

  • 基于 XGBoost / ONNX 进行虹膜分类:https://github.com/cortexlabs/cortex/tree/0.10/examples/xgboost/iris-classifier

以使用 BERT 进行情感分析为例:

首先用户需要在模型上定义 API 接口函数,使其可以通过函数输入数据,并返回模型的推理结果。这一 py 文件被定义为 handler.py:

# handler.pyimport tensorflow as tf
import tensorflow_hub as hub
from bert import tokenization, run_classifierlabels = ["negative", "positive"]with tf.Graph().as_default():bert_module = hub.Module("https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1")info = bert_module(signature="tokenization_info", as_dict=True)
with tf.Session() as sess:vocab_file, do_lower_case = sess.run([info["vocab_file"], info["do_lower_case"]])tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)def pre_inference(sample, signature, metadata):input_example = run_classifier.InputExample(guid="", text_a=sample["review"], label=0)input_feature = run_classifier.convert_single_example(0, input_example, [0, 1], 128, tokenizer)return {"input_ids": [input_feature.input_ids]}def post_inference(prediction, signature, metadata):return labels[prediction["labels"][0]]

接着,用户需要定义配置 yaml 文件,在文件中指定相关属性,这里需要注意,文件名必须定义为 cortex.yaml:

# cortex.yaml- kind: deploymentname: sentiment- kind: apiname: classifiertensorflow:model: s3://cortex-examples/tensorflow/sentiment-analysis/bertrequest_handler: handler.pytracker:model_type: classification

从中可以看到,yaml 文件中需要指定出使用的模型,以及作为 API 接口的 py 文件(即第一步中定义了的 py 文件)。

然后进行部署即可:

$ cortex deploydeployment started

如果需要获得监控信息,则需要输入 cortex get 命令:

$ cortex get classifier --watchstatus up-to-date available requested last update avg latency
live 1 1 1 8s

还可以用命令行获得实时预测:

$ cortex get classifierurl: http://***.amazonaws.com/sentiment/classifier$ curl http://***.amazonaws.com/sentiment/classifier \-X POST -H "Content-Type: application/json" \-d '{"review": "The movie was great!"}'"positive

模型压缩与应用部署交流群

关注最新最前沿的模型压缩、轻量级模型设计、量化剪枝、知识蒸馏、推断部署技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)

(请务必注明:部署)

喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。

(不会时时在线,如果没能及时通过验证还请见谅)


长按关注我爱计算机视觉

模型秒变API只需一行代码,支持TensorFlow等框架相关推荐

  1. vscode代码提示只显示一行_模型秒变API只需一行代码,支持TensorFlow等框架

    选自GitHub 机器之心编译参与:一鸣.杜伟 还在为机器学习模型打包成 API 发愁?这个工具能让你一行代码直接打包. 专注于机器学习应用的人们知道,从训练好的模型到实际的工业生产工具还有一定的距离 ...

  2. 将毫秒值(currentTimeMillis)转换为(年-月-日 时-分-秒)的形式,只需一行代码

    //首先获取当前的毫秒值long currentTimeMillis = System.currentTimeMillis();/*** 转换为年月日时分秒的形式,得到的currentTime就是转换 ...

  3. python实现英文新闻摘要自动提取_利用Python实现摘要自动提取,完美瘦身只需一行代码...

    原标题:利用Python实现摘要自动提取,完美瘦身只需一行代码 今天给大家推荐一个也可以用于关键字提取的算法TextRank,但主要实现的功能是快速从长篇新闻中抽取精准摘要. 前言介绍 TextRan ...

  4. 【CVPR2020 Oral】只需一行代码就可提升迁移性能

    关注上方"深度学习技术前沿",选择"星标公众号", 精选文章,第一时间送达! 作者:Hassassin 知乎链接:https://zhuanlan.zhihu. ...

  5. 实现一个在JNI中调用Java对象的工具类,从此只需一行代码

    前言 我们知道在jni中执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID ...

  6. 【Python】Modin,只需一行代码加速你的Pandas

    本文翻译自:Shrivarsheni的博客 Modin是一个Python第三方库,可以通过并行来处理大数据集.它的语法和pandas非常相似,因其出色的性能,能弥补Pandas在处理大数据上的缺陷. ...

  7. [JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版

    前天熬了大半宿发了一篇[一行代码轻松搞定快捷留言功能],同时发布了V1.0beta版的快捷留言功能和源代码,之所以是beta版,就是当时感觉虽然基本功能有了,但是还不够完善,特性也不一定合理,今天不知 ...

  8. [JavaScript]只需一行代码,轻松搞定快捷留言功能

    快捷留言功能,就是您现在看到在右侧浮动的那个小玩意,通过它可以直接提交留言并推荐,您想在博客里加上这个功能吗? 别急,方法非常简单,还是先听我说说它的来历吧... 最开始,快捷留言这个功能要追溯到发表 ...

  9. php导航代码在线编辑器,只需一行代码,轻松实现一个在线编辑器

    在大部分人眼里,技术宅给人的印象是沉默寡言,总摸不透他心里想些什么,彼此都保持距离.作为半个程序员,我觉得真正的技术宅大部分时间都在找乐子,鼓捣各种想法,和大部分人的极客心理是一样的,程序员也还爱讲笑 ...

最新文章

  1. 数据挖掘视频教程下载
  2. 高德h5地图api接口_html5通过腾讯地图、高德地图、百度地图开发api接口获取坐标对应的周边信息...
  3. 0004-Median of Two Sorted Arrays(寻找两个正序数组的中位数)
  4. Java Hotspot G1 GC的一些关键技术
  5. 部署OCS后修改web farm地址
  6. 通过Microsoft Learn进行学习以提升技能
  7. 字节跳动高工面试:mysql查询重复数据sql
  8. AttributeError: 'numpy.int64' object has no attribute 'translate'
  9. 开关电源Buck电路CCM及DCM工作模式
  10. 记录一次网线水晶头的安装
  11. 120_x轴与y轴平移【transform: translateX(n) translateY(n)】利用定位和变形使元素水平垂直居中
  12. SCI-HUB最新文献网站
  13. 关于CISC和RISC的一些总结
  14. 【Java】Spring 教程
  15. EWSTM8系列教程06_工程节点选项配置(一)
  16. 自动驾驶-自适应卡尔曼滤波AKF
  17. 高德地图Demo,生成apk发布到手机签名不一致
  18. oracle instr函数(oracle 用instr 来代替 like)
  19. 辉羲智能完成天使+轮融资,用创新计算平台赋能智慧出行
  20. 龙武2服务器正在维护,龙武2惊云服务器没有了

热门文章

  1. ZZULIOJ21级新生周赛(1)——命题人:朱会东老师--2824: 探姬同学@出题人
  2. python装饰器简单理解_python装饰器的简单理解
  3. java学完jdk后学什么_学完了javase之后要学什么?
  4. 刷脏页策略linux,linux – 生成大量脏页阻止同步写入
  5. python telnet登录发送命令_Telnet发送命令,然后读取响应
  6. debian9为什么默认是pip2_VirtualBox内刚刚安装完Debian9系统,也无法设置共享文件夹。解决的方法就是安装VirtualBox客户端增强包。...
  7. 汇编指令mrs_专题1:电子工程师 之 软件】 之 【8.arm指令】
  8. mysql 单表数据_Mysql--单表数据记录查询
  9. 计算机科学竞赛加拿大,滑铁卢大学计算机科学与数学竞赛最新考试时间!
  10. python 动态相册_Python编程:制作电子相册