park两者结合起来使用时,会产生出什么样神奇的效果呢?
上图是Spark + TigerGraph解决方案的数据流,批数据与流数据进入Spark后,Spark对数据进行清洗,然后将结果数据导入到TigerGraph中。
接着,在TigerGraph中提取图特征,将特征实时地返回给Spark。Spark再基于TigerGraph返回的图特征以及其他的一般特征(如基于统计的特征),进行机器学习的训练,训练结果再写回到TigerGraph中。
AI 大致可以分为数据预处理(也称数据准备/特征工程等),模型训练和推理预测三个主要阶段。
数据预处理(数据准备/特征工程)
数据预处理阶段是模型训练和推理预测的前置环节,很多时候它更多的是一个大数据问题。根据数据预处理后的下游不同,数据预处理可能是批计算也可能是流计算,计算类型和下游一致。在一个典型的离线训练(批计算)和在线预测(流计算)场景下,训练和预测时要求产生输入数据的预处理逻辑是一致的(比如相同的样本拼接逻辑),这里的需求和 Lambda 架构中的需求一样,因此一个流批统一的引擎会格外有优势。这样可以避免批作业和流作业使用两个不同的引擎,省去了维护逻辑一致的两套代码的麻烦。
目前而言 AI 训练阶段基本上是批计算(离线训练)产生静态模型(Static Model)的过程。这是因为目前绝大多数的模型是基于独立同分布(IID)的统计规律实现的,也就是从大量的训练样本中找到特征和标签之间的统计相关性(Correlation),这些统计相关性通常不会突然变化,因此在一批样本上训练出的数据在另一批具有相同的特征分布的样本上依然适用。然而这样的离线模型训练产生的静态模型依然可能存在一些问题。
首先样本数据可能随着时间推移会发生分布变化,这种情况下,在线预测的样本分布和训练样本的分布会产生偏移,从而使模型预测的效果变差。因此静态模型通常需要重新训练,这可以是一个定期过程或者通过对样本和模型的预测效果进行监控来实现(注意这里的监控本身其实是一个典型的流计算需求)。
另外,在有些场景下,预测阶段的样本分布可能无法在训练阶段就知晓。举例来说,在阿里双十一,微博热搜,高频交易等这类样本分布可能发生无法预测的分布改变的场景下,如何迅速更新模型来得到更好的预测结果是十分有价值的。
因此一个理想的 AI 计算架构中,应该把如何及时更新模型纳入考虑。

