3.1 说明

VSOURCE是远程算法调用平台,每一位用户都可以将自己的算法在平台发布。

需要注意的是,发布用户可以选择是否提交源代码,如果用户提交源代码的话,用户只需要提交源代码和说明给集群管理员即可,后续发布的流程、以及部署的机器可以由平台管理员进行调度。

发布用户如果选择不提交源代码,可以自行在机器上进行部署,可以采用vsource提供的自动化脚本来连接集群的核心服务(比如集群的消息队列和缓存),并生成一个容器持续挂载在一个带有公网IP且联网的机器上,再向集群管理员发送一个注册请求,即完成了发布流程,这个过程中源代码始终是保密的,自动化脚本生成的相关代码对用户都是可见可变动的。

下述的内容会讲述整个发布流程的原理,帮助发布用户更好的理解vsource运作的机制。


3.2 用户算法部署流程

第一步:用户整合算法工程文件夹。

用户整合算法工程文件夹,提取出该算法的核心函数,调用vsource.face_recognition(face_path1, face_path2)进行服务调用。例如对于人脸相似度对比的算法,可以在算法工程文件夹中,做一个下述的Python文件:

  1. import 依赖库
  2. model = 依赖库.get_model()
  3. def face_similarity(face_path1, face_path2):
  4. score = 计算逻辑
  5. return score

整合完成后,用户可以自行测试一下算法是否可以无问题的跑通。

第二步:用户编写 算法注册配置。

在算法整合之后,用户需要编写一个下述形式的算法配置,以Python的字典的形式。

algorithm_config = {
        # 算法定义的名字
        'algorithm-name': 'new_algorithm',
        # 算法的版本号
        'version': '1.0.1',
        # 算法的作者
        'author': 'xcy',
        # 算法工程文件夹的路径
        'service-dir': '/Users/ecohnoch/Desktop/VSOURCE_PLATFORM/algorithm_api/new_algorithm',
        # 算法函数的所处的Python文件名
        'service-filename': 'test_function.py',
        # 算法的函数的标识符
        'service-interface': 'random_number',
        # 算法所依赖的Python库及版本
        'requirements': [
            'numpy==1.19.0',
            'opencv-python',
            'requests'
        ],
        # 算法所依赖的非Python的软件,以Ubuntu的安装方式为标准
        'pre-command': [
            'apt install -y libgl1-mesa-glx'
        ],
        'input-params': {
            'lower': {
                'type': 'float',
                'describe': 'lower limit for thin function'
            },
            'upper': {
                'type': 'float',
                'describe': 'upper limit for thin function'
            },
        },
        'output-params': {
            'result': {
                'type': 'float',
                'describe': 'calculated  result'
            }
        }
    }

3.3 算法部署架构

VSOURCE部署的算法以【函数】作为中心点 ,每一个算法都可以抽象定义成一个函数的形式存在,对上述的算法工程文件夹+一个算法接口,通过VSOURCE提供的接口,可以自动化生成一个容器生成脚本和相应的一系列配置,这个容器的核心逻辑是连接VSOURCE集群核心服务中的消息队列和缓存,并且监听消息队列中的请求消息,消息队列中存在消息后,会将消息(JSON格式)拉取,并且从中解析出【算法函数】的入参,并运行上述【算法函数】流程,将结果也做成一个JSON格式的消息,写入集群核心服务中的缓存中,一次计算的流程就结束了。所以这个算法运行容器的逻辑如下图所示。

从发布用户的角度来说,将这个算法运行容器持续的部署起来就可以了。然后向集群的管理员发送一个注册请求,集群管理员会将该算法的【消息入口】和【缓存出口】注册在集群中,并升级vsource函数库,提供该算法的Python接口,远程算法调用便可以正常的使用了。

3.4 远程算法调用的全流程

以vsource.face_recognition(face_path1, face_path2)为例,下面介绍整个调用过程以及原理。

第一步:API用户进行接口的调用。

用户调用vsource.face_recognition(face_path1, face_path2)进行服务调用。

第二步:接口向集群发送请求。

vsourrce库会先检测用户是否登录,确认用户登陆后,会检测到算法函数接受的两个入参类型是文件,会连接vsource集群核心服务的文件存储节点将两个文件进行上传,并返回两个文件的远程路径,然后结合两个远程路径作为参数,向集群的已注册算法服务发送请求。

第三步:集群向消息队列中推送消息。

集群的已注册算法服务收到请求后,将请求制作为JSON格式的消息,根据算法注册的KEY信息,向对应KEY的消息队列推送消息。

在示例中,集群的已注册算法服务中存在已经注册过的人脸相似算法服务,会找到该服务的消息队列和缓存的KEY,结合两个远程路径会作为入参被制作为JSON格式的消息的一部分。

第四步:用户算法运行容器收到消息,并触发算法调用逻辑,将结果写回缓存。

用户部署的算法运行容器,由于一直监听消息队列,在集群推送消息后,会拿到该消息,并解析出算法函数的入参,触发算法调用的逻辑。算法调用后,将结果制作为JSON格式的消息,写回集群缓存。

在示例中,用户算法运行容器解析入参后,得到两个文件的入参类型,会通过远程路径将文件进行下载到本地tmp文件夹中,并标记本地的路径,然后传入face_similarity(face_path1, face_path2)的算法逻辑中,并得到分数结果,将结果制作为消息返回到缓存。

第五步:集群从缓存收集结果,并写入数据库。

集群的已注册算法服务会持续的监听缓存,得到缓存结果后,会拿到结果写入数据库。

在示例中,集群的已注册算法服务(人脸相似算法服务)会推出缓存写入的结果,并记录进该算法服务的数据库。

第六步:API接口轮询监听集群已注册算法的结果,推送回用户。

用户调用的API接口会轮询监听集群已注册算法的结果,集群会查询数据库,数据库中存在结果后,会返回给用户。

在示例中,用户调用vsource.face_recognition(face_path1, face_path2),在没有超时时,会等待集群服务的结果,存在结果后,则会返回该结果,整个流程结束。如果不存在结果,会持续的等待,直到返回超时错误,如果算法计算时间较长,用户可以设置max_interval参数来增大轮询的时间。

总结来说,远程算法调用的全流程如下图所示