一、概述
VSOURCE平台是来自中国人民大学DBIIR刘桃老师小组的远程算法调用平台(Remote Algorithm Platform),采用Kubernetes及其开源组件建设,其目的在于将已经研发的具有明确输入输出的算法在平台上挂起,通过接口直接远程访问。平台除核心的远程算法访问外,附带算法的版本控制与监控等组件。
VSOURCE平台致力于解决如下痛点:
- 算法难以复现,哪怕整个算法打包开源后,其他的同学只有复现一遍流程(搭环境、看懂流程)后才能够直接体验到该算法。
- 算法框架复杂,依赖环境多变。算法框架有TensorFlow、PyTorch、MxNet等,往往互相兼容困难,这导致不同框架实现的模型理解与复现成本非常的高。比如我一直采用TensorFlow构建模型,但需要依赖某些上游任务,这些任务大部分的实现都是采用PyTorch实现,这个时候我的理解成本会很高。在一个实验室内,大家可能会的框架也不同,某同学做好的模型,希望方便的给另一位熟悉其他框架的同学直接使用,最好的方式是存在一个远程调用的机制可以访问到该算法。
- 算法版本控制艰难,也许三个月前我可以跑通一个人脸识别的算法,但是这段时间陆陆续续本机的环境发生了变化,如果我忽然又需要用到之前的算法,很容易又需要看一遍自己记录过的复现流程。
- 算法展示困难,算法实现后往往需要很多的演示场景,如会议场景、开源说明页,Colab是目前一种流程的形式,但我们同样也可以部署在本地的机器上,然后将算法注册到远程调用平台,提供一个远程调用的接口,会非常的方便。
- 算法希望保密,但又希望可以部署作为展示,让其他人可以测试….
二、灵感来源
VSOURCE的思路灵感来源于Paperswithcode,以图像分类的著名数据集ImageNet为例,在paperswithcode中,可以看到很清晰的看到每个算法在该数据集上的性能、排名、发布者、是否有源代码等信息:
进一步,在有源代码的基础上,我们思考,每一个算法任务实际上都可以抽象为一个算法函数,如图像分类,实际上就是输入一张图像,得到一个类别。如人脸相似度对比,实际上就是输入两张图像,得到相似度分数等等。那么在有源代码的基础上,能否进一步抽出这样的一个算法函数,并且持久化的挂在云端,让每个人都可以直接调用和对比。
如调用class_id = image_classification(image_path, version=’NFNet-F4+’),可以直接得到上述排名第五的算法运行结果,这样无论是对比公平,还是方便理解差异,都是非常棒的。
再进一步思考,每一个研究机器学习的实验室,几乎都要去对算法任务进行“刷分”,也就是对同一个算法任务,进行多次的调整和处理,以期望达到更好的测试效果。那么无论是自己进行一个版本控制,还是实验室内的同学们的算法互相共享,有一个上述这样的算法函数挂起的平台,会更加的方便和高效。同学们不需要再重复的造轮子以及互相解决环境问题。
在这样的基础上,VSOURCE远程算法调用平台诞生了,我们采用实验室机器资源构建了核心服务集群,并且设计了分离式的部署架构,即算法可以部署在任何地方持久运行即可,然后在集群注册后,即可供给使用者远程调用,使用者不需要安装任何的环境依赖。
目前VSOURCE平台在实验室内部已经趋于成熟,离第一个稳定成熟开源发布版本已经不久,所以需求更多的合作伙伴和算法资源。
三、算法发布/调用模型
介绍一个VSOURCE简单的例子,StyleGAN是一个人脸生成模型,可以直接生成一张人脸,在我本地复现该模型后,将其抽象为一个本地函数,即类似于:
import 依赖库
model = 依赖库.model(params=参数路径)
def face_generation():
image = model.generate()
generated_image_path = './tmp/tmp.jpg'
cv2.write(generated_image_path, image)
return {
'output_path': generated_image_path
}
VSOURCE平台以算法函数作为最主要的调度对象,所以算法发布者一共只需要两个步骤,一个是撰写算法函数的描述配置,另一个就是找一个机器将其挂起。
第一步是编写该函数的接口配置,描述上述这样的一个函数的位置、入参、出参等说明。
第二步就是挂起服务,为了方便挂起服务,VSOURCE提供了本地调用包,包含了一系列的自动化生成脚本,帮助发布用户直接挂起算法。使用VSOURCE的本地命令包可以自动化制作为容器,或者生成本地挂起的脚本。挂起后向VSOURCE集群管理员发送接口配置与注册请求。
发布用户只需要做到这两步,直到算法服务挂起后即可,后续由集群管理员在集群注册算法服务,就实现了全发布流程。VSOURCE集群管理员会在集群上注册对应的算法服务(算法名称+版本作为唯一标识符),并提供VSOURCE本地接口进行访问。所以最后,算法挂起,且在集群注册后,任何一个人,只要可以联网且使用Python,可以使用以下的方式调用人脸生成接口:
# 安装或更新vsource本地调用库: pip install -U vsource -i https://pypi.python.org/simple
import vsource
if __name__ == '__main__':
# 目前需要先登录
vsource.login('用户名', '密码')
# 直接调用接口得到生成的人脸图像
generated_image = vsource.face_generation(version='StyleGAN')
print(generated_image)
# http://120.26.143.61/get_files/tmp/tmp/2021-07-11-14-13-09-307/tmp.jpg
会发现无需任何的依赖,也无需安装任何环境,只需要有一个vsource的本地接口库即可使用,当然目前还处于内测阶段,需要一次性的登录(只需要登陆一次即可),接口暂不对外访问。
要注意,上述的人脸生成算法,并没有部署在集群,而是部署在【任意能联网机器】都可以,部署后需要在集群注册一下服务,都可以正常的使用了,所以发布算法,以及调用算法都非常的方便,集群工作人员也看不到任何的代码。
整体算法发布的流程如下所示:
整体步骤为下面所示:
- 算法的发布者整合算法工程包,抽出一个算法函数,并撰写相关的算法配置,通过VSOURCE本地调用包的自动化脚本进行容器式挂起(或者本地式挂起)。
- 算法函数服务挂起后,需要将配置发送给集群管理员。
- 集群管理员拿到配置后,可以通过VSOURCE本地调用包进行自动化的审核和注册。算法注册后,集群会自动生成出算法所需要的服务组件并调度在集群节点上对外访问。
- 算法的使用者采用VSOURCE的本地调用包访问算法接口,会向集群注册算法服务发送请求。
- 集群注册算法服务会将请求转发到算法发布者挂起的算法函数处进行计算。
- 计算的结果会推送给集群注册算法组件。
- 集群注册算法会将结果再返回到算法使用者。
四、其他设计
除了上述最核心的远程调用算法流程设计外,我们还考虑到了其他的一系列设计问题,包括但不限于:
- 高并发的场景。算法调用所消耗的资源非常的多,那么算法使用者的请求一旦多了,是否会让服务出现故障。这里的设计在于上述的第五步,集群转发请求到算法接口处时,会形成队列等待,等待之前的请求被处理结束后才会转发,保持算法函数运行处只有一个请求在被处理,并且请求多的时候,部署的算法可以同步复制n份在n台机器上进行运行,每多一台机器,则增大一条并发能力,因为同一个算法(算法名+版本号)会消费同一个队列。
- 分离式的部署。很容易发现算法部署的位置,可以不在集群内,再哪一台机器都可以,这里一方面可以弹性增大并发能力,另一方面方便了算法发布者进行部署,可以在自己的信任环境下部署,也不会泄露算法的源代码。我们团队目前也存在一个高性能集群可以代理部署发布算法。
- 算法监控组件。算法的注册、以及调用的所有数据交换都会保存在集群核心服务的数据库,对每一个用户组,管理员可以在监控组件中查看过去的调用记录、调用数量以及管理组内用户。
- 算法用户鉴权。由于算法是敏感资源,每一个算法都有用户组的权限,只有特定的用户组才可以访问到对应算法,且目前是内测状态,必须要登录才可以访问到具体算法。参与建设的同学会被分配账号进行体验。
- 算法部署的方式。发布者发布算法有两种发布形式,分别是容器式发布和本地式发布。容器式发布,适用于不需要GPU,环境安装较为简单的项目,可以在配置中将依赖填写完全,容器会将依赖环境一起打包后将算法进行部署,且可以随时调度容器到其他的机器上运行。本地式发布,是为了解决带GPU环境,以及环境依赖较为复杂的情况。在这种情况下,本地如果存在可以跑通算法函数的环境,可以直接本地发布,调用VSOURCE本地包生成的本地运行脚本,连接集群的服务来完成一样的效果。
五、寻求更多的算法与合作
目前平台整体已经成熟度已经较高,仍在进一步的完善与推广中,课题组能可以部署的算法有限,所以寻求更多的可复现算法部署,从而可以很方便的进行远程调用。加入的方法可以来参与建设,直接联系我即可。也可以单独向我发送算法工程包,比如开源包之类的,可以抽出来一份算法函数就可以了。希望能够给业界带来更多更新的思路和解决方案,所以未来稳定版本的大部分组件会进行开源(涉及集群核心部分以及保密性算法的不会开源)。
VSOURCE平台主要开发者及集群管理员:岐山凤鸣(知乎号[岐山凤鸣],542305306@qq.com)