问题描述
我正在构建一个无服务器应用程序以做出一些预测。 下面是简单的架构示例:
RAW Data -> Feature extractor -> Model Prediction -> Many consumers
|
v
Persistence
功能提取器和模型预测都是使用AWS Lambda构建的。 同样,在将数据发送到特征提取器时,原始输入同时在s3中存储在存储桶中。
当我们必须开发新模型时,我们建立以下管道:
RAW Data -> Feature extractor -> Model Prediction -> Many consumers
|
v
Persistence
|
v
New Feature -> Model Training and testing processes -> New Model
Extractor
问题在于,在新模型管道中,我们通常必须从数百万条旧记录中生成特征。 我们希望能够在请求时再现在预测中使用的特征,并测试从原始数据中提取的新特征。
当使用简单的lambda函数时,浪费大量时间来制作一些原始的python脚本,以提取特征,但是当尝试将其重现为100万条存储记录时,这是不可能的。 为此,我们目前有一些Pyspark脚本来处理所有旧功能和新功能,以构建新模型,但是在这种情况下,我们总是有两个代码副本,一个在原始python中,另一个在pyspark中。
我想知道是否可以使用任何技术在两个版本的特征提取器之间保持一定的一致性。 我知道可以进行大量测试以确保两个代码产生相同的效果,但是必须在两个版本中实施每个新功能,这会大大延迟我们的部署过程。
我想我应该为这种问题期望某种设计模式。
1楼
只要确保我了解您的问题,让我总结一下您的问题即可。
有两个管道,第一个用于客户的生产,第二个用于开发人员使用新的特征提取器来构建新模型。 如果新模型的性能优于第一个管道中的生产模型。 然后,可以用第二条管道替换第一条管道的模型和特征提取器。 问题是如何轻松地将新模型和新功能提取部署到生产中。 在您的情况下,很难维护两种不同的编程语言版本,因为
- 将一个版本转换为另一个版本需要付出额外的努力。
- 它还需要付出努力来测试两个版本具有相同的逻辑而没有任何大的副作用。
为了避免这种不利情况,我们最好只为特征提取器保留一个版本(原始python或pyspark)。 这样,我们无需考虑版本转换。 在这里,我选择python作为特征提取器版本。
因此,下一个问题是我们如何使用python lambda处理100万条存储记录。
如果仅使用lambda函数是不可能的,因为我们知道lambda函数的最大执行时间限制为15分钟。 为了消除限制,我们可以引入aws step函数。
AWS Step Functions是一项服务,可让您将多个AWS服务协调到无服务器工作流中。 工作流程由一系列步骤组成,其中一个步骤的输出充当下一个步骤的输入。 这些小步骤可以在AWS Lambda或Amazon ECS中运行。
因此,在第二个管道中,我想用aws step函数替换新的特征提取器。 此标记功能可以分为3个步骤。
步骤1:调用s3列表对象。 在对象上运行新的特征提取器,并使用新特征触发模型训练和测试过程。 并且此步骤的输出是s3列表对象调用中的标记。 它将传递到步骤2。
步骤2:通过检查标记是否为空来检查是否还有更多未处理的对象。 如果标记不为空,请转到步骤1。 否则,请转到步骤3。
第三步:完成。