繁体   English   中英

机器学习模型的API设计

[英]API design for machine learning models

使用Django rest框架构建包含许多已经训练有素的机器学习模型的API网络服务。 某些模型一次可以预测batch_size为1或一张图像。 其他人则需要数据的历史记录(时间轴)才能进行预测/预测。 通常,这些时间线几乎不适合作为参数传递。 因此,我们希望使请求者能够通过以下任一方式进行请求:

  • 发送数据(小批量)以作为参数进行预测。
  • 传递数据库ID /参考作为参数,则API将查询数据库并进行预测。

因此,问题是,用于识别请求者选择哪种方法的最佳API设计是什么? 一些考虑的方法:

  • /db添加到端点的路径,例如: POST models/<X>/db 这种方法的问题是为每个模型生成了(2x)个端点。
  • 将参数db作为布尔值添加到每个请求。 这种方法的问题在于,它只是为检查哪种方法而增加了每个请求的额外开销。 另外,使代码的可读性降低。
  • 为API令牌签名时为每个请求者设置的全局变量。 问题是您将请求者限制为一种不方便的模式。

在这种情况下最好的方法是什么

您当前拥有多个来源的事实将使我认真考虑尝试尽可能多地抽象“来源”组件,以允许所有形式的来源。 例如,假设将来的用户想从mongodb中提取数据,而不是从当前使用的任何数据库中提取数据? 还是来自其他存储结构? 还是从第三方那里拉? 或或或....

无论如何,现在的问题是“它们共有多少共同点,它们都应该实现什么?”

class Source(object):
    def __get_batch__(self, batch_size=1):
        raise NotImplementedError() #each source needs to implement this on its own

@http_library.POST_endpoint("/db")
class DBSource(Source):
    def __init__(self, post_data):
        if post_data["table"] in ["data1", "data2"]:
            self.table = table
        else:
            raise Exception("Must use predefined table to prevent SQL injection")
    def __get_batch__(self, batch_size=1):
        return sql_library.query("SELECT * FROM {} LIMIT ?".format(self.table), batch_size)

@http_library.POST_endpoint("/local")
class LocalSource(Source):
    def __init__(self, post_data):
        self.data = post_data["data"]
    def __get_batch__(self, batch_size=1):
        data = self.data[self.i, self.i+batch_size]
        i += batch_size
        return data

这只是一个例子。 但是,如果路径的固定部分指定“源”,那么您将无限期地自由扩展。

  1. 将/ db添加到端点的路径,例如:POST模型// db。 这种方法的问题是为每个模型生成了(2x)个端点。

必然。 将通用代码干燥到子方法。

  1. 将参数db作为布尔值添加到每个请求。 这种方法的问题在于,它只是为检查哪种方法而增加了每个请求的额外开销。 另外,使代码的可读性降低。

不会有任何额外的开销(这就是您的基础框架将URL匹配到函数/方法的工作)。 但是,这些是2个单独的功能,我会将它们分开,所以我更喜欢第一种方法。

  1. 为API令牌签名时为每个请求者设置的全局变量。 问题是您将请求者限制为一种不方便的模式。

哎呀! 除非您提供一个让用户选择自己的偏好并在全球范围内应用它的UI(我认为任何UX都不会同意)

话虽如此,api设计应通过质疑谁在掌握(或拥有)数据来驱动。 如果是应用程序,并且用户已经知道该实体的ID,那么您不应该向用户询问数据。

如果是用户,然后如果它不适合POST正文,那么我想说,实时API可能不是正确的解决方案,请考虑基于消息队列/发布-订阅的系统。

如果您需要按照问题中的要求使用混合解决方案,那么,我将首选第一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM