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

谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!】作者|郭人通
“从用Python定义流水线 , 到生成Docker镜像 , 再到启动服务并调用执行 , 一共不到30行代码!?”想要模型落地 , 有一连串大坑躲都躲不开:模型转不了ONNX , TensorRT 。 模型推理搞的飞快之后 , 发现预处理、后处理才是瓶颈 。 除了需要搜寻各种英伟达的算法库 , 还需要学习各种高性能计算和CUDA编程技术 , 对着图片解码、视频解码、tensortransform、分词之类的操作一顿猛搞 。 发现英伟达老爷的东西“又高又硬” , 根本装不起来 。 不仅要写一堆脚本程序 , 努力的把一整条处理流水线串起来 , 更要设计好服务的调用接口 。 串完发现流水线各级速度不匹配 , 想着把慢的阶段起多实例并行 , 又扯上了负载均衡和流水线优化 。 流水线上的算法实例起多了 , 物理资源又不够了 。 一切内容终于准备就绪了 , 竟然又要去学写Dockerfile......为了解决上面一连串的问题 , 我们发起了一个开源项目Towhee , 任何用户都能够从Python代码一键构建面向生产的高性能推理流水线 。 这个项目提供了一套优雅的函数式Python编程接口 , 以及一组覆盖日常工作所需要的工具集 , 只需要几行代码 , 就能够自动的解决上述问题:将推理流水线内出现的代码(模型、算法、数据处理过程等)转换成对应的高性能实现 , 组织端到端的推理服务代码 , 一键生成Docker镜像 。 下面举一个小例子演示如何使用Towhee:用CLIP做图片embedding特征提取 。 从定义流水线到生成Docker镜像 , 再到启动服务并调用执行 , 一共不到30行代码 。 首先 , 用Python定义一个“流水线”:谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
流水线接受图片作为输入 , 输出图片对应的embedding向量 。 这个流水线包含两个算子image_decode.cv2_rgb和image_text_embedding.clip_image , 分别负责图片的解码以及CLIP的图片特征提取 。 例子里对流水线进行了配置 , 通过pipeline_config的format_priority参数给到Towhee一个提示 , 告诉Towhee优先把模型转到TensorRT的格式去做推理 , 如果失败就尝试走ONNX 。 image_decode.cv2_rgb的算子配置是num_instance=4 , 让Towhee在流水线中起4个图片解码的实例提高并发 。 image_text_embedding.clip_image的算子配置是dev_id=0 , 让Towhee在GPU0上跑CLIP的推理 。 如果指定了使用GPU进行模型推理 , Towhee会自动的选择GPU版本的模型前后处理过程 , 并在同一块GPU设备上执行前处理、模型推理、后处理 。 更多流水线配置能力详见官方文档(https://docs.towhee.io/) 。 接下来 , 我们通过Towhee把这个流水线制作成Docker镜像 , 这里选用NvidiaTriton作为高性能推理服务框架:谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
命令执行完毕 , 我们将得到一个名为clip_image_embedding:v1的镜像 , 使用下面的命令启动服务实例:谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
在完成了模型服务启动之后 , 我们在本地编写一个简单的测试程序 , 通过调用刚才启动的服务 , 对当前目录下jpg图片做embedding特征提取:谁说 Python 搞不定 AI 模型微服务?!Towhee 来了!
文章图片
如果你想进一步做一个基于CLIP的“文本-图像跨模态”召回服务 , 我们还可以再添加一个用“CLIP提取文本embedding特征”的流水线 , 并进一步丰富服务的调用代码 , 完整程序不会超过100行Python代码 。 (这里因为和上面的示例代码比较接近 , 就不展开赘述了 , 感兴趣的同学可以自行尝试 , 遇到问题欢迎到Slack或微信反馈 , 链接见文章末尾)除了对大量工程细节的极致封装 , Towhee在性能方面也有不俗的表现 。 在我自己的机器上(64核CPU , 3080单卡) , 使用HuggingFace的CLIP预训练模型和配套工具库实现了同样功能的流水线 , 并和Towhee的流水线进行了性能对比: