GaussDB高智能--库内AI引擎:机器学习算法的训练和推理
书接上文GaussDB高智能–自治运维技术,从索引推荐、分布键推荐、参数调优等三方面介绍了GaussDB的自治运维技术,本篇将从机器学习算法的训练和推理方面对GaussDB的库内AI引擎进行详细解读。
3 库内AI引擎
当前业界商业数据库越来越多将机器学习算法与数据库结合,共同为用户提供简易快捷的科学计算服务。在数据库中,利用机器学习模型,为库内存储的数据提供无需数据搬迁、安全可信、实时高效、可解释的分析能力,已成为各商业数据库的必备能力。
业界主流数据库厂商宣传支持数据库上可以实现AI算法调用,在使用形式和实现上不同。主要流派有两类:1. 通过SQL UDF方式,让调用者直接调用函数来实现AI算法训练和推理;2. 通过扩展SQL语句结合python语言方式,实现机器学习算法的训练和推理。其中MADlib通过Python UDF对外提供接口,SQL语句结构简单,但是UDF的参数过多,且不同算法差异可能会比较大,必须通过查询使用手册才能保证使用正确;同时Python语言执行较慢,无法满足用户对实时分析的诉求。而SQLFlow是基于扩展SQL语句结合python语法方式实现,该组件作为连接数据库与机器学习训练平台之间的桥梁,将需要训练的数据从库中抽取转发只机器学习平台进行训练和推理,将结果返回给用户。这种方法实现快捷,不依赖数据库本身能力,但数据传输涉及数据安全问题,且端到端时间长,在执行效率和安全上均没有优势。
GaussDB提出一种高效库内训练和推理的方案,即在数据库内置机器学习算子,利用数据库资源管理及并发扩展能力,以及结合新硬件相关技术,实现全流程机器学习能力。库内AI引擎的架构思路如下图所示:

在用户接口层,实现SQL-like语法,提供Create Model、Predict等关键字,支持AI算法训练和预测。可支持的AI算法包括:GD(梯度下降法)、KMeans(聚类)、XGBoost、PCA等。
查询优化层提供AI训练执行计划和AI预测执行计划,该计划依据内部统计信息和AI算子调用关系,生成相应执行计划。可以把AI算子看做执行器中的计算单元,例如Join、AGG等,AI算子执行代价基于执行逻辑、获取的数据行数、算法复杂度共同决定。同时在执行计划生成后,可通过Explain语句查看详细的执行开销,分析路径选型的正确性。
在AI底座中,提供超参优化能力,即用户不指定超参数或者指定超参数的范围,自动选择适合的参数,该功能极大提升用户使用的效率,同时达到最佳的训练性能。在执行器中,提供多种AI算子,例如GD算子可支持逻辑回归、分类;KMeans算子支持聚类。在每个算子实现过程中,遵循执行器算子实现逻辑,下层对接Scan算子,上次提供AI算子的训练或推理结果。在训练完成后,训练模型将实时保存到系统表中,用户可以查询模型系统表来获取模型信息。
在存储层,DB4AI提供数据集管理功能,即用户可以抽取某个表或多个表中的列信息,组成一个数据集,用于后续模型训练。数据集管理功能类似git模式提供多版本管理,目的是保障训练数据的一致性。同时在这过程中,可通过特征处理和数据清洗保障数据的可用性。同时对已生成的模型进行管理,包括模型评估、定期模型验证、模型导入、模型导出等能力,在验证模型失效后,模型漂移功能可以进行模型刷新,保障模型可用。
库内AI引擎支持异构计算层,实现CPU和AI算力的统一调度,满足数据库语句执行和AI训练的完美结合。在实现方面,CPU算力,特指ARM及X86芯片,可用于基础机器学习算子调用及并行计算执行;AI算子,例如昇腾及GPU芯片,可用于重度分析算子(Join、AGG)及深度学习算子使用,加速大数据及多层网络场景下的计算需求。
在GaussDB内完成机器学习算法的训练和推理的设计流程图如下:

1)使用Create Model语法实现数据库内AI训练和模型存储:
-
通过数据库并行训练算法,实现库内训练加速;
-
通过执行代价估计及资源管控,实现迭代轮次和模型参数最优化;
-
提供可视化执行计划,实现AI可查、可解释性。
举例:
Create Model price_model using logistic_regression Features size, lot Target price < 1000 from Houses;
AI助手
2)使用Predict By语法实现数据库内AI模型推理:
-
基于数据集和查询特征进行模型归类;
-
优化器通过同类模型的精准度,自适应选择算法,实现最优化模型推理;
-
AI推理算子结合其他执行算子,实现关联分析。
举例:
Select address, Predict By price_model(Features size, lot), size from houses;
AI助手
1. SGD算子的训练和推理设计
(1)训练接口
SGD执行算子使用梯度下降技术训练ML模型,梯度下降技术是一种一阶迭代优化算法,用于寻找重复步骤中可微函数的局部极值。从未知的模型系数(或权重)开始,在每个步骤(或迭代或周期)扫描一次数据以计算新的梯度,然后再次扫描数据以基于更新的权重计算损失函数。当已执行了最大迭代次数或当迭代之间的损失函数增量小于某个阈值或容差值时,迭代过程结束。
SGD的首字母缩写代表随机梯度下降,数据可以在每次迭代中进行洗牌,但是在我们的实现中,洗牌被委托给未来的一个新的洗牌执行算子。此外,纯SGD算法计算梯度并更新每个元组的权重,但我们的SGD实现是基于批次或数据块的,并且批次的大小被定义为超参数。因此,当批大小足够大,足以容纳输入数据集的所有元组时,SGD就成为批梯度下降求解器,而它只能容纳数据的一个分区,那么它是一个迷你批量梯度下降求解器(仍然随机)。
目前SGD算子可以批量训练三种不同的学习算法:
-
Binary logistic regression
-
Binary SVM linear classifier (Support Vector Machine)
-
Linear regression of continuous targets
以批处理的方式管理传入的元组具有以下优点:行和列可以存储在内存对齐的矩阵中,并且SGD算法可以使用线性代数运算实现。这种方法具有许多优点:抽象、跨操作将数据保存在CPU缓存中、在专用处理器中向量化或执行的可能性、易于维护等。第一个原型包含内联线性代数运算的基本库(例如基于循环的矩阵乘法、减法、变换等)。源代码是全新的,它没有使用任何第三方库。将来,有可能以透明的方式将这些操作执行到GPU或Tensor处理器中。
针对4字节浮点数优化矩阵,为基于梯度下降的ML算法提供足够的数值表示。在任何情况下,建议在训练模型前对输入数据进行归一化或标准化,否则可能出现溢出。Matrix结构包括:
-
typedef struct Matrix {
-
size_t rows;
-
size_t
columns;
-
bool transposed;
-
size_t allocated;
-
float
*
data;
/
/ consecutive rows, each
as a
sequence
of
values (one
for each
column)
-
float cache[MATRIX_CACHE];
/
/
default
is
64 entries
-
} Matrix;
AI助手
小矩阵直接分配到堆中,而大矩阵则分配到当前的MemoryContext中。请注意,许多操作都是使用向量执行的,向量取决于特征的数量。因此,多达64个特征的所有训练不需要为SGD计算密集使用的梯度或权重分配动态内存。在Matrix上实现的一些线性代数运算有:
-
构造函数:二维矩阵、一维向量、克隆和虚拟转置。
-
修饰符:用零填充,调整大小。
-
矩阵之间的运算:矩阵乘法、入口乘法(Hadamard积)、加法、减法、变换、点积、相关性。
-
标量系数运算:乘除
-
修改所有系数的操作:平方、平方根、sigmoid、log、log1p、取反、补、正、二值化。
-
聚集: 求和。
请注意, SGD仅训练模型,并且将输入数据的任何其他预处理,如抽样、洗牌、规范化、过滤、标记等,委托给其他Executor操作符进入查询外部子计划。
SGD算子的输入指定到SGD节点中,SGD节点包含:
-
typedef struct SGD {
-
Plan plan;
-
AlgorithmML algorithm;
-
int targetcol;
/
/
0-
index
into the current projection
-
int max_seconds;
/
/ maximum execution
time
-
/
/ hyperparameters
-
int max_iterations;
/
/ maximum
number
of iterations
-
int batch_
size;
-
double learning_rate;
-
double decay;
/
/ (
0:
1], learning rate decay
-

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



