谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!( 二 )

谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
HuggingFace与Towhee的流水线性能对比经过多次实验 , HuggingFace流水线的平均QPS67 , Towhee流水线的平均QPS328 。 Towhee的流水线有接近5倍的提速 。 也就是说 , 通过使用Towhee , 仅用一块卡就可以达到之前五块卡的服务能力 , 两个字 , 省钱!接下来 , 继续分享一些Towhee中的重要组件和实用工具:TowheeOperatorHub、DataCollection编程接口、高性能推理服务 , 以及项目的Roadmap 。 TowheeOperatorHubTowhee的Hub不叫ModelHub , 而是叫OperatorHub 。 主要原因在于 , Towhee是面向端到端的流水线构建 , 不仅仅是聚焦神经网络模型 , 还更加关注算法模块功能的丰富度、高性能推理、标准的任务接口 。 算法模块的丰富度:Towhee中的算法模块 , 包括神经网络模型 , 也包括各种五花八门的数据处理方法 , 如音视频编解码、图片裁切、文本分词、向量降维、数据库操作等 。 Towhee关注的算法来源主要有四类:应用场景所需的通用算法或数据处理方法;各类顶会以及arXiv上受到广泛关注的前沿模型;PaperwithCode关键领域的benchmark上榜模型;业务领域常用的算法库、模型库集成 。 目前 , Towhee已经覆盖计算机视觉、自然语言处理、音频、生物医药、多模态五大领域的十多项任务 , 120多种模型结构 , 700多个预训练模型 。 查看Towhee支持的Operator列表(https://github.com/towhee-io/towhee) 。 高性能推理:TowheeHub上的算法模块除了提供预训练模型以及Fine-tuning能力 , 会更加聚焦流水线落地后的推理性能 。 Towhee会为常用算法或前沿模型提供对应的高性能实现 , 根据Python侧流水线的定义 , 在推理服务的构建期进行自动化替换 。 这些加速支持包括:模型转ONNX、TensorRT;前后处理的多线程、GPU加速;常见的数据处理过程加速 , 如图片、音频、视频解码加速等 。 标准的任务接口:Towhee会按照任务类型对算子进行模块化组织 。 任务类型确定了标准的调用接口 , 并通过算子提供这些接口的不同实现 。 在TowheeHub中Operator的组织方式类似PapersWithCode , 相同任务的Operator会组织在一个分类下 , 结构目录清晰、方便阅读和使用 。 目前 , Towhee社区也在尝试逐步覆盖PaperswithCode上的重点任务 , 支持用户对SOTA模型的快速试用 , 避免用户在“读懂论文-看懂论文作者的初版实现-面向工程落地的代码重构-PoC-性能优化”这个链条上的重复造轮子 。 Towhee会对已支持的模型添加PaperswithCode链接 。 如果在PaperswithCode模型页面的'Code'部分看到towhee-io/towhee , 就说明在Towhee可以对该模型进行试用 。 例如跨模态视频召回的CLIP4Clip模型 。 TowheeHub上的每一个Operatorrepo , 既是一个模型的代码仓库 , 也是一个直接可调用的模块 。 如前面的例子中用到的image_text_embedding.clip_image算子 , 对应Hub上image-text-embedding/clip_image这个repo 。 这个仓库的用户名和仓库名分别与流水线调用中的包名image_text_embedding、算子名clip_image对应 。 Towhee规定了一套Operator代码仓库的接口协议 。 只要代码仓库的组织方式遵守这套协议规范 , 就可以通过Towhee提供的工具 , 将仓库代码自动化打包 , 并可以通过"用户名.仓库名"的方式对算法模块直接加载调用 。 任务接口标准化有一个非常大的优势是可以灵活切换模型 , 而不用担心引入额外的工程量 。 这对于快速PoC以及流水线升级都很重要 。 在原型阶段 , 可以根据业务逻辑确定需要哪些类型的任务 , 由于相同任务下的不同算子具有一致的调用接口 , 因此可以乐高积木式的自由组合 , 进行快速的效果尝试 。 在生产环境如果需要对流水线的某个Operator升级 , 也只需要在流水线的定义中替换相应的Operator , 通过Towhee重新构建dockerimage即可 。 目前Towhee社区也在收集用户的算子需求 , 在每个版本中进行汇总并更新实现 。 有这方面需求的同学可以加项目的Slack/微信群进行讨论或提githubissue 。 相关链接在文章末尾 。 DataCollection编程接口Operator是乐高积木 , DataCollection接口则是强力胶 , 用来连接积木 。 通过DataCollecton接口 , Towhee用户可以轻松构建推理流水线 。 DataCollection在逻辑上的定义是一个带Schema的非结构化数据表格 , 每一行对应一个数据实体(Entity) , 每一列对应一种数据属性 。 一个流水线对应着一组数据属性操作 , 每个Operator接受一到多个数据属性作为输入 , 并产生新的数据属性作为输出 。 DataCollection主要有三个作用:在原型阶段 , 用于构建可直接本地执行的流水线;用于定义面向生产部署的DAG;作为driverprogram连通业务逻辑与流水线服务 。 在文章一开始CLIP的例子中 , 已经简单演示了后两个用法 。 这里对流水线的本地快速原型构建做一个简单的介绍 。 CLIP这个例子的本地可执行版本写出来是这样: