关于开源:Towhee开源的-embedding-框架与社区

11次阅读

共计 5151 个字符,预计需要花费 13 分钟才能阅读完成。

Towhee 是什么

Towhee 是一个开源的 embedding 框架,蕴含丰盛的数据处理算法与神经网络模型。通过 Towhee,可能轻松地解决非结构化数据(如图片、视频、音频、长文本等),实现原始数据到向量的转换。

同时,Towhee 也是一个凋谢的算法与模型交换社区。在这里,来自世界各地的开发者能够自在地的分享模型与流水线,促成技术与效率的晋升。

Towhee website: https://towhee.io

GitHub: https://github.com/towhee-io/…

Slack: https://slack.towhee.io

Twitter: https://twitter.com/towheeio

为什么须要 Towhee?

以后,由神经网络模型来驱动数据利用曾经成为业界的规范实际。在商品举荐、版权保护、数据管理、软件平安、短视频、制药、金融、保险等诸多畛域中,都能看到 embedding 的大量利用。「万物皆可 embedding」的理念在近些年受到了学术界与工业界的宽泛认可。如何依据业务需要,对原始数据进行正当的 embedding,成为了工业界亟需解决的问题。Towhee 我的项目的发动初衷,就是为了搬开这块挡在路两头的大石头。

一个常见的 embedding 流水线的构建流程如上图所示。从最开始的数据筹备,到模型调研,模型选型,模型编码,训练与调优,构建流水线,流水线部署,一共通过七个阶段。这些阶段横跨数据管理、算法调研与调优、流水线的工程部署等多个业余畛域。另一方面,AI 利用往往面向传统产业降级。对于超过 95% 的用户来说,实现一条具备业余水准的 embedding 流水线都是极具技术挑战的,当然,在大多数状况下,也是远超预算的。

AI 畛域以往的工作根本都是以模型为核心,这就导致模型成绩与工业界落地利用之间产生了一道鸿沟。以视频中物品 embedding 为例,其中用到的外围模型是指标检测与物品图像的 embedding。这两个方向的模型都有十分丰盛的成绩,如 RetinaNet,YOLO,CornerNet,ResNet,EfficientNet,ViT 等等。然而,要对一个视频中呈现的物品进行 embedding,在算法层面须要视频解码与关键帧提取、关键帧去冗余、图像变换、指标检测、图像裁剪、图像 embedding 等多个算子,在零碎层面须要数据并行、数据处理流水线、计算资源管理、内存资源管理等多项零碎能力。对应到上述七个阶段中,就造成了模型利用中必须要面对的两项外围工作:一个是「有这么多模型,要依据业务须要顺次实现,并选型比拟」,另一个是「实现 embedding 流水线中模型以外缺失的局部」。而这些工作,为数据利用落地引入了微小的技术挑战与老本问题。

与以往的我的项目相比,Towhee 最大的特点是 以利用场景为核心 ,而非以模型为核心。针对典型的 embedding 场景须要,Towhee 从中形象出一系列 embedding 流水线。一个典型的 Towhee 流水线的创立与调用如上所示。 仅三行代码,即可将一个图片编码为向量。

Towhee 的设计初衷是在笨重友善的接口下,封装大量的算法与零碎实现细节。下面的例子只是 Towhee 能力的一小部分,我的项目愿景是笼罩 embedding 流水线构建过程中的全副七个阶段:

  • 精心组织的开源数据集与工具
  • 社区共建的 SOTA 预训练模型
  • 紧贴学术前沿与业界前沿的模型热度趋势
  • 遵循标准接口的算子 / 流水线开源代码库
  • 轻便的 fine-tuning 能力
  • 端到端的流水线,笼罩 embedding 过程中的每个步骤,不再局限于神经网络模型
  • 多平台的部署能力

流水线与算子

目前大家相熟的 ML 流水线框架,如 kubeflow 等,次要面向模型的训练过程。Towhee 的流水线则次要偏重预测过程,补救了现有流水线框架在这个方面的有余。

在 Towhee 中,算子是数据处理的根本算法单元,流水线由多个算子组成。在算子与流水线两个层面,都具备规范的接口,这形成了 Towhee 中算子与流水线的复用与灵便组合的根底。流水线依照场景被分为若干个类别,每个类别都具备对立的接口标准。如下面代码例子中的流水线名称为 image-embedding-resnet101,其遵循 image embedding pipeline 接口标准。遵循同一接口标准的流水线形成了一个 流水线族(pipeline family),如:

  • image-embedding-resnet50
  • image-embedding-resnet101
  • image-embedding-skresnext50d
  • image-embedding-inceptionv4
  • image-embedding-efficientnetb7
  • image-embedding-swinbase
  • image-embedding-swinlarge
  • image-embedding-vitlarge
  • ……

流水线族的对立接口大幅度简化了流水线的选型与降级。用户在流水线选型的过程中,只须要向流水线构建接口 pipeline(pipeline_name:str) 中传入不同的流水线名称,即可疾速实现多条同性能流水线的疾速构建。因为同一个流水线族内的所有流水线具备完全一致的接口,用户在降级迭代流水线的过程中也不会引发下层代码的改变。

在算子层面,也对应的有 算子族(operator family)的概念。如一个 image embedding pipeline 中,会蕴含 image loader、image transform、image embedding 三类算子,性能别离是图像加载、图像变换、图像特色的向量化编码。每类算子都是一个算子族。如 image embedding 这类算子具备同样的接口,针对这套接口有大量不同的算子实现,如基于 ResNet,EfficientNet,swin-transformer,ViT 等的算子。这些算子就如同具备规范制式的积木个别,在组装成流水线的过程中能够灵便组合或替换。

聚焦 Embedding 的开源社区

Towhee 零碎整体上由两局部组成,别离是云上的 Towhee hub,以及驱动具体流水线执行的执行框架。与之对应,Towhee 技术社区的工作也聚焦在流水线执行与流水线内容这两方面。一方面,执行框架次要解决流水线的图示意、图构建、多平台部署、数据并行、执行调度、本地资源管理等要害零碎问题。另一方面,Towhee hub 面向社区提供 embedding 流水线与算子的托管服务,构建内容丰盛的内容共享与交流平台。

在 Towhee hub 中,流水线族与算子族的接口标准形成了社区成员共享工作的根底。算子与流水线内容以业务场景为核心进行迭代。业务场景 - 算子 - 流水线 三局部内容的迭代闭环如下。通常,在五种状况下会产生新的算子或流水线:

  • 增加新的流水线族:新的场景需要无奈被已有流水线族笼罩,或无奈拆解为已有流水线族的性能组合
  • 增加新的流水线:流水线内新的算子组合,或置换原有流水线中局部算子以达到更好的成果
  • 增加新的算子族:新的场景需要无奈被已有算子族笼罩
  • 增加新的算子:须要纳入新的数据处理办法,或新的神经网络构造
  • 调优后的算子:对预训练模型进行调优,扭转了模型参数

在 Towhee 框架中,对上图五类工作提供了丰盛的工具反对:

  • 针对流水线提供了一套形容规范,能够通过 yaml 格局进行流水线的书写或调整
  • 提供了对神经网络中经典 layer 的封装,可能帮忙算子开发者更便捷的构建新的神经网络模型
  • 在算子层面提供了反对模型 fine-tuning 的接口

模型调优,自定义算子与流水线

在少数利用中,都须要对预训练模型进行调优。Towhee 的算子是神经网络模型的根本封装单元,因而 Towhee 在每个神经网络类型的算子上都提供了对 fine-tuning 的反对。

一个典型的 fine-tuning 流程如上图所示。用户依据业务场景,在流水线族中选取一到多个能力最靠近须要的流水线。如果在此基础上须要进一步调优,那么用户就须要深刻到算子层,找到影响成果的要害算子。之后就进入调优环节,筹备数据,并调用 Towhee 提供的接口进行模型的 fine-tuning。期间能够将失去的模型配置回原流水线进行成果验证。所有称心后,用最终实现的算子将原算子替换,就失去了一条全新的流水线。

上方给出了一个应用默认训练参数的 fine-tuning 过程。fine-tuning 的接口放弃了 Towhee 一贯的简洁。仅五行代码即可实现一次算子的调优。对于高级用户,train 接口提供了对训练参数的管制,能够通过 training_args 这个参数进行调节。

Layer block

Towhee 对工业界与学术界积攒的优良模型进行合成,将罕用构造封装到一系列 layer block 中。Layer block 是对根底神经网络层的进一步封装,每一个 layer block 都蕴含一组具备特定性能的 layer 组合,目标是进一步提高神经网络的模块化水平,进步代码的复用性。例如,在 SwinTransformer 中,构建网络结构的次要单元是 PatchEmbed2D,PatchMerging 和 SwinTransformerBlock,SwinTransformerBlock 蕴含 LN,MLP,W-MSA 和 SW-WSA 等 layer,应用 pytorch 接口形容一个这样的构造,须要约 500 行 python 代码。在 Towhee 中,形象并封装了 Transformer 的通用 layer block,通过向这个 layer block 传入一组特定的初始化参数,即可取得一个 SwinTransformerBlock。

目前,Towhee 内置的 layer block 共有 29 种,笼罩了常见的 CNN,GAN,Transformer 等网络结构。在后续的版本中,Towhee 将继续的减少、更新 layer block,帮忙开发者更加便捷的构建神经网络。与此同时,在现有的 layer block 根底上,Towhee 还将提供更便捷的 embedding 提取形式,能够灵便获取指定 layer block 的 embedding 输入。

流水线的形容与执行

在零碎方面,Towhee 的次要指标是进步 embedding 流水线的示意能力与执行效率,以后零碎的能力涵盖:流水线的图示意,计算资源管理,内存资源管理,算子缓存,多流水线并行,算子并行,数据并行等。

每个流水线都由一个有向无环图示意(DAG),其中的节点是流水线中的算子,边形容了算子间的计算依赖关系。在目前的版本中,流水线的 DAG 能够被存储为一个 yaml 文件。给定一个 yaml 格局的流水线形容文件,Towhee 即可实例化残缺的流水线。因而,通过形容文件,社区用户能够十分便捷的共享彼此在流水线方面的工作。为了进步流水线的创作效率与可读性,Towhee 在后续的版本中还打算推出流水线的高级语法,相似 Spark 的 RDD 操作。

Towhee 能够依据一个 DAG 创立多组运行期的流水线实例,这些流水线实例能够并发的执行同一组输出数据上的 embedding 工作,更多的流水线实例意味着更高的流水线级并行度。每个流水线实例内蕴含多个算子实例。在算子层面,同样提供了并发执行能力。算子内的数据处理是根本的任务调度单元,每个工作的执行过程通过 Runner 进行管制。Executor 封装了 CPU 与 GPU 资源,调度器将工作指派给 Excutor,Excutor 为任务分配计算资源,驱动工作的执行。

值得注意的是,Towhee 封装了上述的大量零碎细节,并为下层用户提供便捷的调用接口。绝大多数 Towhee 用户都不用关怀底层零碎问题,从而更聚焦业务。

退出 Towhee

如果您正在利用 Embedding 技术解决具体的业务问题,无论您是神经网络技术的爱好者,还是硬核零碎技术的爱好者,或是开源软件与开源社区的参与者,您的专业知识与开源激情将会极大的帮忙咱们疾速迭代 Towhee 我的项目。Towhee 社区期待您的退出!

Towhee website : https://towhee.io

GitHub : https://github.com/towhee-io/…

Slack : https://slack.towhee.io

Twitter : https://twitter.com/towheeio


Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。

Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。

正文完
 0