亚马逊AWS官方博客
使用Amazon SageMaker部署CVAT AI自动图像标注系统
背景介绍
Amazon SageMaker可以帮助开发人员和数据科学家快速准备构建、训练和部署机器学习(ML)模型的完全托管的云服务。特别的SageMaker提供了一种可扩展且经济高效的方法来部署大量的预先训练好的机器学习模型,借助SageMaker多容器多模型的部署可以使用单个端点访问的模式提供多种类型的推理服务。
而我们都知道在机器学习领域,训练数据集的重要性不言而喻,特别是目前应用最为广泛的监督式计算机视觉领域中的深度学习,往往一个这种项目最开始的工作就是标注各种媒资数据。而CVAT就是为用户提供一套完整的工具平台,方便用户标注数字图像和视频。CVAT 支持与对象检测、图像分类、图像分割和3D数据标注有关的监督机器学习任务,CVAT自2018年在GitHub上开源以来已经发展成为业界中最为流行的视觉领域标注工具,特别是AI自动标注功能非常受用户欢迎。
官方文档中安装CVAT的推荐方式为单机部署模式,无论应用层、数据库层还是缓存层以及AI推理层都是通过Docker的方式部署在一台物理机或者虚拟机中,这种方式无论从资源利用、安全性、部署架构的高可用性上都难以满足企业级应用部署的规范。本文作者拥有多次大型企业在亚马逊云科技上通过无服务器化(Serverless)部署CVAT的经验,特别是对最为受欢迎的AI自动标注功能使用SageMaker模型部署推理层改造的经验,通过AWS CloudFormation一键部署模式,将整个CVAT平台系统部署在亚马逊云的Serverless的架构之上。
部署架构介绍
CVAT主体开发使用了Python Django Web应用框架,并大量使用了缓存技术提升系统的稳定性和降低应用的延迟,数据库使用了开源的PostgreSQL,最为重要的AI推理引擎也使用了数据科学界开源的nuclio作为基础无服务器(Serverless)的架构层。由于上文提及CVAT官方提供的部署方案需要把所有的技术组建容器化后部署在一台物理机或者虚拟机中,通过Docker Compose的集群方式部署。官方的推荐架构明显较于目前云原生或Serverless的架构趋势有很大的区别,因此我们在将CVAT部署到AWS云上的时候将架构进行改造。具体的架构图如下:
其中改造的点如下:
- 首先我们可以将整套架构运行在安全的AWS VPC中,通常情况下我们把需要通过公网访问的CVAT用户界面的ALB放在公有子网,同时我们的Fargate(一种适用于容器的无服务器计算引擎)到公网拉取Docker镜像需要的NAT Gateway也放在公有子网,其余所有Fargate容器、RDS/ElastiCache、EFS甚至SageMaker的Endpoint都通过私有网络进行访问,如有必要甚至可以将整个VPC与互联网进行隔离,满足客户企业级安全的要求;
- 将CVAT的Server和UI两个服务的容器运行到ECS的Fargate Serverless上,并通过ALB替换掉traefik容器将用户的流量分别发送到这两个ECS的服务上,实现Fargate容器多节点和冗余;
- 将CVAT的缓存层从原来的Docker容器中剥离出来运行在ElastiCache的Redis上,实现缓存层的全托管;
- 将CVAT的数据库层从原来的Docker容器中剥离出来运行在RDS的PostgreSQL上,实现数据库层的全托管;
- 将CVAT存放媒资的本地Docker卷剥离出来存放在EFS的共享存储上,方便CVAT Server的容器在Fargate上的漂移和多节点扩展;
- 最为重要的是对AI推理层的改造,新增CVAT Serverless服务替换原有nuclio无服务器服务,主要原因是nuclio对底层物理机或虚拟机的侵入性太强,需要开放大量的底层权限才能使用(比如运行Docker的UNIX Socket接口),无法在AWS上真正实现Serverless,同时Amazon SageMaker为我们提供了强大的推理端点(Endpoint)部署的功能,因此我们通过新增的CVAT Serverless服务与SageMaker进行对接,将推理服务运行在SageMaker Host Endpoint上,并将CVAT Serverless服务运行在Fargate上;
- 另外为了初始化CVAT数据库,及一些S3上的Demo媒资复制到创建好的EFS上,我们使用了一个Fargate ECS的Task来完成一次性初始化的动作;
- 最后我们还会使用一些其他亚马逊云科技的服务来帮助我们实现整个CVAT架构的无服务器化,包括使用S3存储AI推理模型、媒资,使用Cloud Map作为微服务的发现机制,使用ECR来托管所有Docker镜像(包括ECS和SageMaker都会使用)。
相比较于CVAT社区官方版本的部署方案,运行在亚马逊云上CVAT具有非常明显的优势:
- 所有技术模块实现了高可用;
- 真正全解偶并实现无服务器化,用户无需再关心底层资源调度;
- 可以支持大量用户同时使用CVAT系统进行协作标注,实现了CVAT内部协作功能架构基础;
- AI推理模块可扩展性更强,更为灵活。
方案部署步骤
本方案所有的技术模块可以通过预先定义好的CloudFormation服务创建,点击下面的按键就可以跳转到Amazon CloudFormation控制台界面(宁夏区)进行整个方案架构的部署,对于部署的源代码大家可以参考这个链接。
快速启动
方案架构快速部署有很多配置选项可以修改,但是如果是基于测试或者全新快速部署使用的目的可以全部使用默认的值,只有两个是必须输入的:一个是给整个架构堆栈起一个名称,另外一个就是对创建IAM资源影响的确认项。
额外灵活的配置
如果你想对整个CVAT有更为深入灵活的配置,可以通过修改CloudFormation参数来实现,这些参数主要分为以下几种类型:
- CVAT用户相关的参数
- 与数据库相关的参数
- VPC网络相关的参数
模版的输出
经过15到20分钟的等待,我们CVAT的模版将创建完成。
点击“输出”的页面,模版输出了在AWS创建的各种资源的ID,其中最为重要的URL,这个输出是部署好的CVAT链接地址,可以直接点击这个链接登录新创建好的CVAT系统。
使用CVAT AI图像自动标签系统
登录CVAT的链接会需要使用CVAT的用户名密码登录,就是我们在创建CloudFormation时使用到CVATUser和CVATPassword参数,默认为admin/cvat123456
登录后点击Models链接,可以查看我们已经在SageMaker五个模型推理的端点(Endpoint)
点击Tasks链接,并点击Create new task按钮
在Create a new task页面需要填入如下信息:Name可以填入handball,增加一个标签person,并点击Connected file share链接
在Connected file share这个页面中所有的媒资文件都是存放在我们CloudFormation创建的EFS共享存储中,实现我们通过Fargate Task已经将S3上的demo数据复制到共享存储上了,点击展开root节点,选择handball文件夹,这里包含了400张图片,是一段视频经过抽帧的结果,点击Submit按钮。
很快页面就会反馈后台已经把CVAT Task已经创建好,会有一个浮动窗口提示我们,这里可以点击Open task按钮或者点击页面上方的Tasks链接进入Tasks页面。
现在我们已经创建好了一个CVAT Task,可以选择用手工的方式给每一帧分别打标签,这里我们使用AI标注的功能来提升打标签的效率。在Tasks页面点击Actions链接中的菜单,并点击Automatic annotation链接
这时会弹出一个浮动窗口让我们选择一个模型,这里我们选择使用pth-faster-rcnn模型。
这时CVAT会帮助我们自动将模型里能够识别的标签与我们在任务中定义个标签进行匹配,点击Annotate,CVAT就会通过SageMaker的Endpoint进行推理,对任务里所有的图片帧中的人物进行标注。
这个过程会持续一段时间,在Task页面我们可以监控到后台推理的进度。
经过10分钟左右我们就可以用过SageMaker将400张图片全部标注完成,现在可以通过点击下面Job的链接查看结果。
打开Job页面以后我们就能看到AI标注的结果,所有在每帧图片中的人物都用标注框标注出来了,我们可以点击播放按钮看到以下效果。
如果大家感兴趣还可以继续尝试其他AI标注方式,比如interactor方式可以自动识别物体边界多边形式标注,tracker方式可以通过自动语义分割的方式在视频中追踪标记目标标注物,reid方式可以使用业界流行的行人重识别(reidentification)算法对所有标注的行人人物进行标签合并。
结论
使用将CVAT通过无服务器化改造的方式,特别是将AI标注推理功能运行在Amazon SageMaker上,可以大大提升开源CVAT单机部署的性能以及稳定性,可以非常好的支撑企业内部图像AI项目的标注任务。