自动调参是当前数据库领域的热门话题之一。在不同环境和 Workload 下,为数据库设置不同参数组合会使其有不同性能表现。部署数据库到新环境时,往往需要 DBA 根据经验手动调参,以让数据库有最佳性能。由于现代数据库复杂度越来越高,DBA 手动调参难度越来越大,因此需要自动调参算法接入。
按照 ML Model 划分,当前自动调参算法主要可以分为三大类
- 基于高斯过程回归的(以 OtterTune 为代表)
- 基于深度神经网络的
- 基于深度强化学习的(以 CDBTune 的 DDPG 算法为代表)
目前已有的实验证明,在真实 workload 上,这三类算法均能找到效果接近的最优解,效果比传统 DBA 调参更好,主要是算法收敛速度不太一样。
本文主要着重于讨论三类 ML Model 异同。
Overview of AutoTune
OtterTune 总结现在调参工具迭代的步骤为:
- 执行目标 workload
- controller 在执行完成后收集 runtime metrics and configuration knobs
- 上传到 tuning manager
- tuning manager 从 controller 中收集最新执行结果并存储
- tuning manager 基于 ML Model 生成新一轮 knobs
- 在目标 workload 上执行新的 knobs
ML Model
高斯过程回归
更准确的说,这一类优化模型指的是以高斯过程(GP)为代理模型的贝叶斯优化模型。最经典的工作就是 CMU 提出的 OtterTune,主要分为以下步骤
数据预处理(OtterTune 专属)
GPR 的特点是处理不了太高维度的数据,因此需要先识别出最重要的 knobs。首先确定 DBMS 度量的子集,算法使用因子分析(factor analysis)的降维技术,能够将度量减少到更小的因子集合。将度量降维后,继续计算对目标函数影响最大的旋钮的排序列表。OtterTune 使用了 Lasso 的特征选择方法,其中 knob 数据作为输入 X,输出的是结合已经修剪过的度量的目标数据。Lasso 在 X 和 y 之间的回归过程中确定了重要的 knob 顺序。
Knob 推荐
确定完 knob 后剩下的都是高斯过程回归的基本操作。GPR 对输入的采样数据 x 输出各个采样点的目标值 y 和不确定性值 u,通过 Acquisition Function 根据这两个值推出一个 acq value。acq value 可以理解为在探索和最优值间的一个 trade off。
深度神经网络
由于 GPR 在高维上效果不佳,因此也有人考虑直接用 DNN 去找最佳参数。
OtterTune 在对比实验中用了两个有 64 个神经元的隐藏层,使用 ReLU 函数激活,另外使用 dropout(rate=0.5) 避免过拟合。在推荐参数阶段,OtterTune 还给 DNN 的参数加了高斯噪声,以在探索和最优值中找到一个 trade off,类似于 GPR 的 Acquisition Function。
DNN 的调参流程和 GPR 完全一致。
深度强化学习(DDPG/DDPG++)
DDPG 基于深度强化学习中的 Actor-Critic 算法(演员-评论家 算法),是目前针对连续动作空间情况比较好的深度强化学习算法。华中科大的 CDBTune 及其后续一系列工作提出将 DDPG 算法应用在自动调参中。DDPG 核心组件有 (1) Actor (2) Critic (3) Replay Memory
Actor 和 Critic 都是一个 MLP 结构。Actor 根据给定状态选择动作(即 Knob 取值),Critic 根据当前状态对选定动作进行评估,并提供反馈来指导 Actor。Actor 输入是 workload 执行度量(即执行的性能指标?),输出推荐的 Knob 值,Critic 将度量和推荐的 Knob 作为输入,输出一个 Q-Value,DDPG 的 Critic 的输出为未来所有预期奖励的叠加。Replay Memroy 存储按预测误差赋予权重的训练数据。
对于每个 Knob K,DDPG 构造一个 tuple,包含 (1) 先前的度量 m_prev (2) 当前度量 m (3) 当前奖励 r
收到新数据时 CDBTune 通过比较度量值计算奖励,按权重从 Replay Memory 中采样训练数据训练 Actor-Critic。通过当前度量 m 获得新 Knob 推荐值。
DDPG++ 则简化了 DDPG 的一些实现,以提高收敛速度。(1) DDPG++ 使用即时奖励而不是累计未来奖励(累计未来奖励在黑盒优化中好像没什么必要?而且还会显著提高奖励的误差)(2) DDPG++ 使用了一个更简单的奖励函数,不考虑之前的或基础目标值。(3) DDPG++ 在得到一个新的结果时,从 Replay Memory 中获取多个小批量值,加速训练过程。
评估
实验结果摘自: An Inquiry into Machine Learning-based Automatic Configuration,是 OtterTune&CMU 做的一个调研类的自动调参工作,实验在 Oracle 上进行,原始可调参数超过 400 个。
基准线是默认参数执行结果,纵轴是调参后的性能提升幅度。
实验一中调优 knob 完全由 DBA 选出。可以看出几种算法性能差不算太多,在不同 Workload 上各有一点比较小的性能差别。比较令人惊奇的是低维度下 DNN 效果是最好的?较高维度下 GPR 也表现得不错,和很多 survey 说的似乎不太一样。作者研究参数含义后发现,GPR/DDPG 在优化器选项上开启了一个次优版本,导致其在低维下效果不如 DNN。
作者指出按执行的总时间来算,收敛速度最快的还是 GPR 方法(此处不知道为啥没图)