4.7 KiB
| title | sidebar_label |
|---|---|
| 算法开发者指南 | 算法开发者指南 |
TDgpt 是一个可扩展的时序数据高级分析平台,用户遵循简易的步骤就能将自己开发的分析算法添加到分析平台并通过SQL语句直接调用。目前 TDpgt 平台只支持使用 Python 语言开发的分析算法。 Anode 采用类动态加载模式,在启动的时候扫描特定目录内满足约定条件的所有代码文件,并将其加载到系统中。因此,开发者只需要遵循以下几步就能完成新算法的添加工作:
- 开发完成符合要求的分析算法类
- 将代码文件放入对应目录,然后重启 Anode
- 使用SQL命令,向 Mnode 同步新的算法列表
此时就完成了新算法的添加工作,之后就可以直接使用SQL语句调用新算法。得益于 TDgpt 与 TDengine主进程 taosd 的松散耦合,Anode算法升级对 taosd 完全没有影响。应用系统只需要调整对应的SQL语句调用新(升级的)算法,就能够快速完成分析功能和分析算法的升级。
这种方式能够按需扩展分析算法,极大地拓展 TDgpt 的适应范围,用户可以按需将更契合业务场景的、更准确的(预测、异常检测)分析算法动态嵌入到 TDgpt,并通过 SQL 语句进行调用。在基本不用更改应用系统代码的前提下,就能够快速完成分析功能的平滑升级。
以下内容将说明如何将分析算法添加到 Anode 中并能够通过SQL语句进行调用。
目录结构
Anode的主要目录结构如下图所示
.
├── cfg
├── model
│ └── ac_detection
├── release
├── script
└── taosanalytics
├── algo
│ ├── ad
│ └── fc
├── misc
└── test
| 目录 | 说明 |
|---|---|
| taosanalytics | 源代码目录,其下包含了算法具体保存目录 algo,放置杂项目录 misc,单元测试和集成测试目录 test。 algo 目录下 ad 保存异常检测算法代码,fc 目录保存预测算法代码 |
| script | 是安装脚本和发布脚本放置目录 |
| model | 放置针对数据集完成的训练模型 |
| cfg | 配置文件目录 |
约定与限制
- 异常检测算法的 Python 代码文件需放在
./taos/algo/ad目录中 - 预测算法 Python 代码文件需要放在
./taos/algo/fc目录中
类命名规范
Anode采用算法自动加载模式,因此只识别符合命名约定的 Python 类。需要加载的算法类名称需要以下划线 _ 开始并以 Service 结尾。例如:_KsigmaService 是 KSigma 异常检测算法类。
类继承约定
- 异常检测算法需要从
AbstractAnomalyDetectionService继承,并实现其核心抽象方法execute - 预测算法需要从
AbstractForecastService继承,同样需要实现其核心抽象方法execute
类属性初始化
实现的类需要初始化以下两个类属性:
name:识别该算法的关键词,全小写英文字母。通过SHOW命令查看可用算法显示的名称即为该名称。desc:算法的基础描述信息
--- algo 后面的参数 name 即为类属性 `name`
SELECT COUNT(*) FROM foo ANOMALY_DETECTION(col_name, 'algo=name')
添加具有模型的分析算法
基于统计学的分析算法可以直接针对输入时间序列数据进行分析,整体分析流程比较快捷,但是某些深度学习算法对于输入数据的训练需要较长的时间,并且形成相应的模型。这种情况下,同一个分析算法对应不同的输入数据集有不同的分析模型。
将具有模型的分析算法添加到 Anode 中,首先需要在 model 目录中建立该算法对应的目录(目录名称可自拟),将采用该算法针对不同的输入时间序列数据生成的训练模型均需要保存在该目录下,同时目录结构要在分析算法中确定,以便能够固定加载该目录下的分析模型。如下图所示,针对不同的数据集,采用自编码器(Autoencoder)训练的数据异常检测算法模型均保存在该目录下。为了确保模型能够正常读取加载,要求存储的模型使用joblib库进行序列化保存。
调用已经保存的模型,需要首先调用set_params方法,并在参数中指定调用模型的名称 {"model": "ad_encoder_keras"} 即可调用该模型进行计算。调用方式如下:
def test_autoencoder_ad(self):
# 获取特定的算法对象
# ...
# 指定调用的模型,该模型是之前针对该数据集进行训练获得
s.set_params({"model": "ad_encoder_keras"})
# 执行检查动作,并返回结果
r = s.execute()