本文对清华大学李国良教授团队的论文《GaussML: An End-to-End In-Database Machine Learning System》进行解读,文共8011字,预计阅读需要30至40分钟。
随着数据量的激增和对数据安全的日益重视,传统的机器学习方式已难以满足需求。GaussML作为一种新型的数据库内机器学习系统,通过原生SQL接口实现了端到端的机器学习,不仅避免了数据传输带来的安全风险,还借助SIMD和数据预取等技术显著提升了训练效率,在多轮实验中展现出比传统方法更快的训练速度和更高的准确性,为机器学习领域开辟了新的发展方向。
1.1数据驱动时代的核心矛盾
在数字化转型的浪潮中,企业面临数据安全与分析效率的双重挑战:
安全合规压力:金融、医疗、政务等领域的数据需满足GDPR、CCPA等法规,禁止原始数据外流。例如,某欧洲银行因使用第三方AI平台处理客户数据被罚款2300万欧元。
实时性需求:传统ETL(抽取-转换-加载)流程导致数据延迟,无法支持实时决策。如电商大促期间,用户行为数据需在秒级内反馈至推荐模型。
1.2现有技术路径的局限性
UDF方案(如MADlib):
性能瓶颈:PostgreSQL的UDF执行引擎缺乏向量化支持,导致SGD训练速度比原生C++实现慢5-8倍。
功能缺失:无法支持复杂算法(如分布式XGBoost),且迭代控制依赖外部脚本(Python/Shell),破坏事务一致性。
外部系统方案(如Python+Sklearn):
数据迁移成本:1TB数据通过10Gbps网络导出需15分钟,且占用临时存储空间。
计算资源竞争:ML任务与OLTP查询共享数据库连接池,可能引发死锁或响应延迟。
1.3 GaussML的定位与目标
GaussML旨在构建数据库内全栈ML引擎,实现:
零数据移动:训练、推理全流程在数据库事务边界内完成,符合数据主权要求。
原生性能优化:从存储层到执行层的垂直整合,突破UDF的性能天花板。
无缝SQL集成:通过扩展语法与优化器,降低数据分析师的使用门槛。
2.1端到端机器学习
给定一个关系数据库D,包含表{t1, t2, t3, · · · , tn}和一个复杂的数据分析问题P,该问题既包含数据库操作又包含机器学习算法。端到端机器学习管道解决该问题的步骤如下:
特征工程:从数据库D中创建包含与问题P相关的转换特征的训练视图V;
模型训练:从视图V中为问题P的目标训练模型;
模型推理:使用训练好的模型为给定的元组预测标签(类别或数值);
数据分析:根据模型预测结果获取和分析满足某些约束条件的元组。
2.2 GaussML架构
GaussML由五个主要组件构成,它们为关系数据库(本文中为openGauss)提供了全面的机器学习能力。

图1GaussML系统概述
MLSQL解析器:在此层中,GaussML通过将机器学习操作无缝集成到SQL中,扩展了SQL以支持MLSQL。GaussML支持PBE(即解析器-绑定-执行)协议,这是一种延迟参数绑定的方法来执行查询,具有相同模板的SQL语句仅解析一次。
MLSQL优化器:在此层中,GaussML支持对MLSQL的优化,以处理场景1和场景2。GaussML优化器不仅可以使用模型感知成本估算器来查找最优的数据访问路径和模型预测顺序,还可以在数据访问操作符和模型训练操作符之间进行交错优化。
MLSQL执行器:在此层中,定义了一组ML操作符以支持高性能的ML执行。GaussML支持超过20种流行的机器学习算法,这些算法的训练执行器由4个基本操作符组成,包括矩阵计算操作符、统计操作符、梯度下降操作符和距离计算操作符。GaussML还设计了一组数据预处理操作符,这些操作符通过利用数据库中的原生统计信息,优化了数据归一化和缺失数据填充过程。
训练数据管理:在此层中,开发了两个新组件以支持ML执行。首先,在GaussML中添加了数据重分布操作符,以在执行节点之间对数据进行混洗,从而平衡数据标签并加速模型收敛。其次,设计了一种新的数据结构RVD,作为每个模型的训练数据,通过物化视图或懒加载计算得到,以便用户可以追溯当前模型所使用的训练数据。
2.3 GaussML SQL
在此部分中,正式介绍GaussML的扩展MLSQL,如表1所示。对于训练操作,`model name`设置模型在数据库中训练后的名称,`model type`设置模型的算法(例如线性模型、SVM),子查询与属性列表可以从数据中选择特征和标签。训练数据可以是物化视图、子查询或基表。用户还可以提供一组超参数并使用`AUTOML on`旋钮,GaussML将使用超参数优化(HPO)技术自动选择最优超参数。对于预测操作,表达式中的`model name`指定训练好的模型,投影转换预测数据。

表1:MLSQL的语法
查询规划器是端到端机器学习的重要组件,因为它可以有效调度机器学习和传统操作。然而,传统数据库中的优化器无法处理端到端机器学习场景,原因如下:
在模型创建阶段,查询规划器应能够将机器学习操作符挂载到计划树上,并使模型训练性能最优;
传统查询规划器不会根据成本重新排序单个关系上的传统谓词执行顺序,因为性能提升很小;
传统基数估算器无法估算同时包含普通条件和模型预测的复合谓词,因为数据库无法捕获模型标签与其他列之间的相关性;
数据库没有模型预测表达式的成本模型。例如,传统优化器无法区分XGBoost和决策树之间的预测成本差异。
3.1 ML-DB混合DDL(创建)查询规划
在表2中,总结了GaussML中支持的四种类型的ML模型。
首先,随机梯度下降是一种通用的模型训练方法,可以支持大量数据和任何可导的模型和损失函数。
在GaussML中,如果数据大小小于最大处理内存,则将所有数据物化到内存中,然后进行混洗和迭代训练。否则,先在磁盘上混洗数据块,然后读取并物化每个块,分批进行训练。
基于统计的模型通常只需要一小部分数据样本,并多次遍历以优化预测准确性。样本数据可以放在内存中,这种训练不需要物化。
基于距离的模型在训练时需要迭代计算输入数据的距离,因此创建此类模型的计划由物化和距离操作符组成。

表2:GaussML支持的ML模型详情
3.2 ML-DB混合DML查询规划
将GaussML的查询优化器集成到数据库的传统优化器中。对于每个ML模型,GaussML首先估算输入基数并计算模型预测的成本,然后选择执行成本较低的执行计划。

图2:扫描节点的模型预测顺序

图3:NestLoop节点的内/外表
图2和图3展示了ML计划优化的两个重要场景。在图2中,GaussML能够根据总成本重新排序扫描节点上方的模型预测表达式。在图3中,查询优化问题是要决定哪个表是内表(外表)。此外,GaussML还对模型训练进行查询优化。例如,GaussML在训练节点之前添加一个物化节点,以减少IO开销;当每个分区的数据分布差异较大时,GaussML添加一个重分布节点。
3.3 ML谓词的选择性估算
最困难的部分是在实际执行之前估算每个ML谓词的选择性,因为特征属性通常是高维且相关的,而模型预测结果在表中并未物化。
3.3.1问题定义
选择性是谓词选择的元组数除以表中元组总数,选择性估算对传统数据库中的优化器至关重要。当GaussML中涉及机器学习预测操作符时,复合谓词会变得更加复杂。可以正式定义这个问题如下:

其中,errf是任意误差度量,用于衡量估计基数与真实基数之间的误差。op可以是比较操作符(>, <, =等),fi可以是原生函数或机器学习模型预测操作符。T是一个表。
3.3.2方法论
挑战:对图4中的复合谓词进行选择性估算存在两个挑战:一是模型生成的标签统计信息无法直接读取,二是随机采样难以获得满足谓词条件的数据的条件分布(模型预测结果与其他条件相关)。为了准确估算选择性,GaussML从普通谓词逐步采样值。提出了一种基数估算框架,将模型集成到GaussML中,克服现有缺点。

图4:ML谓词的选择性估计步骤
3.4 ML推理的成本估算
为了选择更好的ML模型预测顺序,需要一个成本模型来估算预测时间。成本公式是模型预测计算时间复杂度的数学表达式,与以下3个指标相关:
ML模型的特征维度(记为D)、前置执行节点的估计基数(记为card)和模型结构。表II显示了在GaussML中支持的典型模型的成本模型。
线性、逻辑、多项式和SVM模型的成本与特征维度和输入基数成正比。带有平方核的SVM将D维特征映射到(D² + D + 1)维,带有高斯核的SVM将D维特征映射到无限维,使用D′ = max(128, 2 * D)个中心点来计算高斯距离,以近似映射。
决策树的成本与树的深度成正比,集成模型(如Xgboost和随机森林)的成本与深度乘以估计器数量成正比。
在贝叶斯模型中,需要从排序列表中找到分布,成本与log(Nd)成正比,其中Nd是不同值的数量。
朴素KNN依赖于数据排序,成本与N²成正比,带有预构建索引(HNSW)的KNN每个查询只需要O(log(N))时间复杂度,其中N是数据行数。在每个成本模型中,α是一个系数,可以手动或自动调整。
GaussML中带有ML模型的查询执行依赖于原生和扩展操作符。扩展操作符包括模型训练和预测以及数据预处理。在这些过程中,GaussML将ML算法与传统执行操作符结合在一起。
4.1模型训练
4.1.1训练流程
GaussML中的训练流程如图5所示。
对于迭代训练模型,超参数优化引擎首先从用户定义的SQL中读取一系列超参数,然后并行训练具有不同超参数的模型。
在每次迭代中,执行器首先从前置执行节点中采样数据,然后根据梯度和学习率更新模型参数。HPO引擎在每次迭代中停止并丢弃具有较大验证误差的模型,直到只剩下一个模型。
最后,执行器再次在完整数据上训练模型,直到收敛,然后将模型存储在系统中。

图5:训练工作流程
4.1.2基本训练操作符
总结了所有机器学习模型的训练模式,并在数据库中实现了一系列通用操作符:
物化操作符:负责将数据从磁盘加载到内存中,这将由训练计划中的上级操作符控制。例如,SGD会告诉物化操作符下一轮需要什么,物化可以触发异步数据预取任务,以加速大规模数据训练。
采样操作符:支持两种类型的采样,基于行数或采样比例。GaussML提供两种方式来采样数据,一种是从文件中采样页面,这更快;另一种是水库采样,这更均匀,但可能访问更多页面。
距离操作符:有两种类型,距离计算操作符和距离合并操作符。距离计算操作符从扫描节点和上级操作符获取两组元组列表,然后使用SIMD计算距离。
SGD操作符:根据数据批次的梯度和函数误差更新模型参数,并控制物化操作符何时获取下一批数据。
混洗操作符:有两个阶段,首先混洗块并为每次调用获取一个随机页面,然后在将结果返回执行计划中的上级节点之前,混洗块中的元组。
矩阵操作符:计算各种矩阵计算,例如矩阵元素逐个相加、矩阵乘法、矩阵求逆等。在GaussML中,也使用SIMD加速矩阵计算,例如同时计算4个浮点数。
4.1.3并行/分布式训练
为了加速大规模数据集上的模型训练,在GaussML中实现了并行和分布式训练操作符。GaussML设计了一种同步集体模型训练框架,其中每个线程在部分训练数据上独立进行每次迭代的训练,并在每次迭代后通过全局共享内存广播参数/梯度。当每个线程收到来自所有其他线程的信息后,本次迭代结束。在开始下一次迭代之前,每个线程根据同步的参数/梯度更新模型。一个典型的并行训练执行计划示例如下:
-> 合并模型 (16路) -> 流式传输 (类型: 本地 dop: 1/16) -> 训练模型 -> 物化 -> 序列扫描 T1
与单节点上的并行执行不同,分布式训练使用流式传输操作符在所有数据节点上交换执行器之间的参数/梯度,每个执行器在其本地数据上训练模型。一个典型的分布式训练执行计划示例如下:
-> 流式传输 (类型: GATHER) 节点/所有数据节点 -> 流式传输 (类型: BROADCAST) 生成于/所有数据节点 -> 递归训练模型 -> 物化 -> 序列扫描 T1
在递归训练操作符中实现了RTMController,以同步每个数据节点的行为。具体来说,每个数据节点在开始新的训练迭代之前,应从所有其他节点接收更新后的模型。GaussML基于GaussDB的架构支持并行/分布式训练。
4.1.4超参数优化
HPO引擎:为了减少模型调优的手动工作,在GaussML的ML执行器中构建了一个HPO引擎,用于寻找最优的模型超参数集(包括学习率、训练批次大小、核类型等),以实现最低的验证误差。
挑战性:HPO问题具有挑战性,因为它通常是一个非凸问题,无法使用凸优化方法。此外,超参数与验证误差之间的映射关系难以建模,因此无法使用基于梯度的优化方法。
一个带有HPO的模型训练计划示例如下:
-> Train Model - logistic_regression CTE t -> Select Model -> Streaming (dop: 1/16) -> Train Model - logistic_regression -> Materialize -> SampleResult -> Seq Scan on T1 -> Seq Scan on T1
4.2模型持久化
将训练好的模型以结构化数据的形式保存在系统表gs model warehouse中,其中包括模型名称、训练时间、超参数、验证指标和模型参数。
为了安全和节省空间,将模型参数存储为二进制序列,其中所有参数按照预定义的结构依次排列。
为每个模型的对象id和名称建立了索引,以加速模型搜索,并在实例级别建立了内存上下文,以缓存反序列化的模型,避免重复加载模型的高成本过程。
4.3模型预测
模型预测的流程分为三个步骤。
首先,ML执行器在共享内存中查找查询模型。
如果找到,则执行器将前置执行节点的结果输入到模型中进行预测。如果模型在内存中未找到,执行器将通过名称在系统表gs model warehouse中查找,并反序列化模型参数进行预测。
最后,将从磁盘加载的模型缓存到内存中。如果指定的模型有后代版本,将使用版本id对它们进行组织,用户可以轻松使用之前的模型。
4.4数据混洗
数据混洗不仅对机器学习优化器(如随机梯度下降)的收敛速度至关重要,还能平衡不同数据分区之间的数据分布。
4.4.1本地混洗操作符
本地混洗旨在改变每次训练迭代的IO顺序。GaussML支持两种类型的本地混洗操作符:元组混洗和块混洗。
4.4.2跨节点混洗操作符
在GaussML中,如果训练标签在所有数据节点上分布不均,分布式训练可能表现不佳。GaussML提供了两种策略来重新分布数据:完全重新分布和微调。
4.5数据预处理
在大多数情况下,模型训练和预测的数据预处理可以通过简单的Select-Projection-Join (SPJ)查询完成。然而,某些数据预处理操作符需要知道聚合子查询中的数据分布。在这种情况下,将两个新的操作符(归一化和缺失值填充)集成到GaussML中。这些操作符可以利用关系数据库中的系统统计表,从而避免在训练模型时进行额外的昂贵聚合子查询。
5.1实验设置
在本节中,首先介绍用于评估GaussML的数据集、方法和硬件环境。
5.1.1数据集
采用了六个数据集来评估不同机器学习平台的效率和性能(如表3所示)。

表3:数据集
RLCP包含几年课程中学生信息的数据对,每对被标记为“匹配”或“不匹配”。
ADULT包含工作人员及其收入信息,分类任务是判断每个人的年收入是否超过50K
ClickStream包含在线商店的点击流信息。
UrbanGB包含城市中位置的坐标,每个位置属于一个分区。
Swarm中的每条记录代表一个boid,包括位置、速度、对齐等信息。
Workload包含查询范围和三种聚合结果,使用协调器和计数来预测平均结果。
YearPredict描述了歌曲及其发布年份。
CCPP包含联合循环发电厂的4个特征,用它们来预测发电厂的能源输出。
Slice从CT图像中获取,被HPO基准测试采用。
5.1.2方法
GaussML:构建在原生openGauss数据库中,为端到端机器学习应用提供MLSQL接口。有三种部署方式,包括单线程、多线程和多节点。它还支持数据库中的自动超参数优化。
MADlib:是一组为关系数据库定制的ML UDFs,被Postgres、GreenPlum等广泛采用。也将其功能集成到openGauss中,以便进行公平评估。
ML-A:使用Python脚本和流行的机器学习库(如sklearn、pandas和openGauss连接器)实现。它们为ML用户提供Python编程接口,用户需要在每次训练迭代中通过数据库连接器从数据库中批量加载数据集。
为了确保评估的公平性,为GaussML、MADlib和ML-A设置了相同的批次大小和迭代次数。
5.1.3硬件环境
在4台机器上进行实验,每台机器配备72个Intel 3.00GHz CPU核心、64GB内存(足以容纳使用的数据集)和2TB磁盘。
5.2总体比较
在表4中,将GaussML与MADlib和ML-A在分类任务上进行了比较,结果表明GaussML显著优于MADlib和ML-A。此外,GaussML使用物化操作符在迭代加载数据时自适应缓存小批次数据。ML-A的训练性能最差,因为它需要通过网络连接到数据库服务器来传输数据。

表4:分类任务的比较训练时间 (ms)/预测时间 (ms)/验证准确性
在ADULT数据集上,GaussML在10次迭代训练中比MADlib快4-9倍,在100次迭代训练中快1-2个数量级。ML-A虽然比MADlib快,但仍然比GaussML慢得多。
实验结果还显示,GaussML和MADlib在模型预测时间上相似,然而,ML-A的预测速度比GaussML。
在准确性方面,GaussML、MADlib和ML-A表现出相似的最终结果,因为它们使用相同的算法。然而,GaussML比MADlib和ML-A收敛更快,因为GaussML使用了先进的在线混洗技术,可以在不同迭代中改变读取数据块的顺序。
5.3回归任务
在三个数据集上测试了不同ML平台的回归任务。从图6可以看出,GaussML在所有三个数据集上的训练时间都优于MADlib和ML-A。结果还显示,MADlib和ML-A的训练时间相似,因为MADlib仅使用UDF将算法放入数据库,而不是使用原生操作符。

图6:回归任务的训练时间比较
5.4聚类任务
图7展示了不同超参数和数据量下K-means的训练时间。可以观察到,GaussML在不同情况下都比MADlib快一个数量级。随着总点数的增加,MADlib的训练时间比GaussML增长得更快。当增加质心数量10倍时,训练时间也增加了大约1-10倍。同样,当增加数据集的维度10倍时,训练时间也增加了1-8倍,因为这增加了距离计算成本。

图7:聚类任务比较
5.5主成分分析(PCA)
由于GaussML和MADlib的PCA方法都采用迭代训练方式以支持大规模数据集,仅在图8a和图8b中对它们进行了比较。可以观察到,随着主成分数量的增加,训练时间急剧增加。GaussML的训练时间始终显著低于MADlib。还观察到,随着数据量的增加,GaussML和MADlib的训练时间都增加,因为计算成本和IO成本增加。

图8:Swarm数据集上的PCA比较
5.6查询规划
在图9中,测试了4个工作负载上的不同查询优化技术。
WL1是一个包含复杂数据预处理管道的SQL工作负载结果表明,使用openGauss的查询优化器会使查询性能显著下降10倍。
WL2是一个包含单个关系和多个带有不同机器学习模型预测的过滤条件的工作负载,由ML感知优化器生成的执行计划比传统优化器快1倍。
WL3和WL4是两个混合工作负载,包含多个关系,并且每个关系上都有带有机器学习约束的约束条件,可以观察到,ML感知优化器比传统优化器快1-2倍,因为它可以优化不同关系的连接顺序和模型预测谓词。

图9:查询优化的比较
5.7查询执行
5.7.1超参数优化引擎
使用HPOBenchmark在Slice数据集上测试了GaussML的HPO引擎。图10显示,GaussML中实现的HPO策略与HPOBenchmark生成的训练损失曲线相似。还可以观察到,Hyperband策略的训练效率比随机搜索高一个数量级。

图10:超参数比较训练时间
5.7.2分布式训练
在多个节点上部署了GaussML,如果数据节点数量超过4个,通过使用不同的进程和数据目录来模拟多个节点。从图11中可以看出,随着数据节点数量的增加,训练时间显著减少。
然而,在8个数据节点之后,训练时间趋于稳定,原因有两个:
首先,广播参数会增加通信成本;其次,数据节点之间分布差异会导致每个节点内过拟合,需要更多迭代进行分布式共识。
在图11b中,观察到,当数据量和并行度同时增加时,MADlib的训练时间比GaussML增加得更多,因为GaussML具有更好的可扩展性。

图11:分布式训练
5.7.3混洗方法的影响
比较了不同混洗方法对并行训练曲线的影响。从图12中可以看出,不进行混洗的训练只能在SVM上达到77%的准确率,在逻辑模型上达到80%的准确率,而带有全局混洗的训练可以达到99%的准确率。
值得注意的是,单节点上的元组混洗和块混洗速度较快,而全局范围内的数据重分布由于数据传输需要更多时间。因此,除非不同节点上的标签分布非常偏斜,否则推荐的混洗方法是块混洗。
此文设计了框架,以高效地将这些操作符集成到GaussML中,这些操作符进一步提高了并行和分布式环境中模型训练的性能。
5.7.4优化效果
图12显示了在添加各个优化方法后训练时间的减少情况。观察到,混洗技术使训练时间减少了15-45%,数据物化使训练时间进一步减少了40-70%,SIMD/并行技术使训练时间减半。

图12:训练时间与优化的比较
6.1数据库中的机器学习
最近,数据库内机器学习得到了广泛研究。MADlib由一系列UDF组成,其性能较低,因为函数无法被数据库优化。SQLFlow在数据库和外部机器学习平台之上构建了一个SQL引擎,它将SQL解释为Python程序语言,从数据库获取数据,并在现有平台上训练模型。SQLFlow缺乏与数据库的整体优化,且数据传输非常耗时。
6.2超参数优化
为了降低使用机器学习的门槛,超参数优化(HPO)正在成为机器学习平台中不可或缺的技术。为了加速HPO,在GaussML中实现了Hyperband,并且GaussML存储了每个配置的历史性能,以便进行热启动。
6.3数据混洗
像SGD这样的模型训练方法依赖于数据混洗以实现快速收敛,研究人员提出了一些部分混洗方法以减少IO。GaussML支持跨数据节点的完全混洗和本地混洗,通过将混洗方法集成到openGauss中。
6.4分布式训练
分布式模型训练可以分为数据并行和模型并行。在大规模数据上,数据并行是加速训练的最有效方法。许多技术已被应用于机器学习产品,但它们并非为分布式关系数据库设计,大多依赖于参数服务器。为了避免openGauss中的协调节点成为瓶颈,GaussML使数据节点直接交换参数。
总结:本文提出了一个端到端的数据库内机器学习系统GaussML。GaussML与openGauss数据库无缝集成。在真实数据集上的广泛结果表明,GaussML在典型的机器学习查询上显著优于其他系统。
展望:可以在未来的工作中扩展GaussML以支持GPU使用,因为GaussML已经将各种算法的ML计算抽象为典型的ML操作符,如表2所示的SGD操作符、统计操作符、距离操作符等。GaussML可以比基于Python的ML系统更自适应地支持GPU使用。
论文解读联系人:
刘思源
13691032906(微信同号)
liusiyuan@caict.ac.cn
关键词:#论文解读#GaussML#机器学习#查询规划执行









