将机器学习模型应用于 InfluxDB,结合 Loud ML 和 Docker 进行时间序列预测

导航至

我喜欢学习数据科学。我喜欢尝试各种机器学习模型,以了解何时使用它们、它们如何工作以及如何评估它们。然而,直接深入研究机器学习是令人生畏的。我想创建本教程,向数据科学爱好者展示如何使用 Loud ML 和 InfluxDB 将高性能机器学习模型快速应用于您的时间序列数据。

本教程将涵盖以下主题

  • 如何在桥接网络上创建和配置 InfluxDB、Loud ML 和 Chronograf Docker 容器
  • 如何使用 Loud ML 在 InfluxDB 数据库上训练机器学习模型以预测值
  • 如何使用 Chronograf 查看这些预测
  • 1 键机器学习预览

此项目的代码仓库可以在这里找到。对于本项目,我选择对来自默认 telegraf 数据库的  average_usage_system 字段进行离线预测。请记住,我没有保持 InfluxDB 运行,因此数据非常稀疏。对于良好的机器学习 (ML) 预测来说,这是一个糟糕的选择。但是,我选择使用这些数据是因为它易于访问,并且可以让您更轻松地入门。虽然本教程仅涵盖离线 ML,但请注意,Loud ML 也提供在线 ML 功能。如果您是 Docker 的新手,您可能需要查看 Docker 新手提示。在那篇文章中,我回顾了作为 Docker 新手所犯的错误,以及如何避免这些错误的一些技巧。

1. 如何在桥接网络上创建和配置 InfluxDB、Loud ML 和 Chronograf Docker 容器

一图胜千言。这是我们希望 Docker 网络的样子。我们将 172.18.0.0 细分为三个子网(172.18.0.77、172.18.0.88、172.18.0.86),每个子网根据 IPv4 协议有 24 位。这些子网中的每一个都分配给一个端口,以便定义特定系统上特定服务的地址。

  • 创建一个名为 "loudml2" 的网络,并使用 --subnet 选项直接指定子网值。
docker network create --subnet=172.18.0.0/24 loudml2
  • 找到 InfluxDB 存储数据的位置。在本教程中,我使用的是默认的 telegraf 数据库。
$INFLUXDB="/usr/local/var/influxdb"
  • 设置本地存储以与容器共享,并创建 config 和模型文件 ($LOUDMLTEL="/Users/anaisdotis-georgiou/ContainerData/LoudML2")。
mkdir $LOUDMLTEL/chronograf
cd $LOUDMLTEL
touch config.yml
touch influxdb.conf
touch model.json
  • 修改 config.yml
datasources:
  - name: telegraf
    type: influxdb
    addr: 172.18.0.86:8086
    database: telegraf

storage:
  path: /var/lib/loudml

server:
  listen: 0.0.0.0:8077
  • 修改 influxdb.conf。确保您的数据位置与您的 $INFLUXDB 匹配
[meta]
  # Where the metadata/raft database is stored
  dir = "/usr/local/var/influxdb/meta"

[data]
  # The directory where the TSM storage engine stores TSM files.
  dir = "/usr/local/var/influxdb/data"

  # The directory where the TSM storage engine stores WAL files.
  wal-dir = "/usr/local/var/influxdb/wal"
  • 修改 model.json
{
        "offset": "30s",
        "features": {
            "io": [
                {
                    "metric": "avg",
                    "field": "usage_system",
                    "name": "mean_usage_system",
                    "default": 0,
                    "measurement": "cpu",
                    "anomaly_type": "low_high"
                }
            ]
        },
        "bucket_interval": "5m",
        "min_threshold": 75,
        "max_threshold": 95,
        "name": "telegraf",
        "default_datasource": "telegraf",
        "interval": "1m",
        "max_evals": 5,
        "type": "timeseries",
        "span": 10,
        "forecast": 5,
        "seasonality": {
            "daytime": true,
            "weekday": true
        }
}

"anomaly_type":"low-high" 指定过“低”或过“高”的值都将包含在异常检测中。

"min_threshold": 75 & "max_threshold": 95 指定异常检测的阈值。这些值是随机选择的,因为我的数据集非常稀疏,我不期望能够执行准确的异常检测。

"bucket_interval": "30m" 找到合适的 bucket 聚合间隔非常重要。数据在 bucket 间隔内取平均值。如果 bucket 间隔值太低,训练将花费很长时间,并且您有过度拟合的风险。选择过长的 bucket 间隔可能会导致模型不太敏感并平滑掉有趣的异常。通常,bucket 跨度倾向于在 10 分钟到 1 小时之间,或类似于异常之间的平均持续时间。跨度 (10*5m=50m) 确定将用于预测下一个值的 bucket 间隔的数量。

"interval": "1m" 指定运行实时异常检测的间隔。

"forecast": 5 最佳实践是将 forecast 设置为 ½span。

"seasonality": {"daytime": true, "weekday": true} 指定 `"seasonality": {"daytime": true, "weekday": true}` 是因为我倾向于在工作日的白天使用我的机器。

  • 创建 InfluxDB 容器并绑定相应的目录和修改后的 influxdb.conf。
docker run -p 8086:8086 --net loudml2 --ip 172.18.0.86  --name influxdb2 -v $INFLUXDB:/var/lib/influxdb -v $LOUDMLTEL/influxdb.conf:/etc/influxdb/influxdb.conf:ro influxdb -config /etc/influxdb/influxdb.conf
  • 创建 Chronograf 容器并绑定相应的目录和配置文件。
docker run -p 8888:8888 --net loudml2 --ip 172.18.0.77 --name chrono2 -v $LOUDMLTEL/chronograf:/var/lib/chronograf chronograf
  • 创建 Loud ML 容器并绑定相应的目录和配置文件。
docker run -ti -p 8077:8077 --net loudml2 --ip 172.18.0.88 --name loudml2 -v $LOUDMLTEL:/var/lib/loudml:rw -v $LOUDMLTEL/config.yml:/etc/loudml/config.yml:ro -v $LOUDMLTEL/model.json:/etc/loudml/model.json:ro loudml/community

2. 如何使用 Loud ML 在 InfluxDB 数据库上训练机器学习模型并预测值

  • loudml2 容器内启动 bash shell

docker exec -ti loudml2 bash 以

  • 导航到我们的 model.json 绑定的目录。

cd /etc/loudml

  • 创建模型

loudml create-model model.json

  • 训练模型

loudml train telegraf -f 2018-07-10 -t 2018-07-20 -m 5

  • 预测值。使用 -s 将输出保存在 InfluxDB 中,以便您可以使用您喜欢的可视化工具。

loudml predict telegraf -f 2018-07-20 -t now -s

3. 如何使用 Chronograf 查看这些预测

  • 查看您的预测。

4. 1 键机器学习预览

我喜欢 InfluxData 的一点是我们的开源产品。我们的社区发展迅速,因为 TICK Stack 的 OSS 版本功能强大且用途广泛。Telegraf 有超过 160 个插件,其中 153 个是由社区成员编写的。CERN 的研究人员使用 OSS 版本来帮助他们 “确定宇宙的基本结构”。Loud ML 是另一个典型的社区成功案例。Loud ML fork 了 InfluxData 的代码仓库,并在 Chronograf 中添加了 1 键机器学习,以支持其机器学习模型的配置和部署。Loud ML 使将 ML 模型应用于您的时间序列数据变得异常容易。相比之下,如果我决定单独使用 TensorFlow,我将不得不选择一个模型、评估它并调整它。这是一项繁重的工作,需要对时间序列数据的 ML 有深入的了解。幸运的是,我无需了解任何关于 ML 的知识即可使用 Loud ML 创建高性能模型并对其进行评估。使用 1 键机器学习,您只需单击一个按钮即可创建和训练模型。您只需查询您的数据,应用一个特征和聚合间隔,然后单击即可进行预测。

<figcaption> 标准 Chronograf 实例被替换为来自 LoudML 的 fork 版本,其中包含 1 键机器学习</figcaption>

训练完成后,您可以选择一个预测时间间隔来输出预测。

<figcaption> 来自 LoudML 的 Chronograf fork 版本,其中包含 1 键机器学习</figcaption>

观看此预览,了解 Loud ML 的 1 键机器学习,该功能将于 8 月底推出。

我希望本教程能帮助您开始您的时间序列 ML 之旅。如果您有任何问题,请在社区站点上发布或在 Twitter 上 @InfluxDB 告诉我们。特别感谢并祝贺 Sébastien Léger 和整个 Loud ML 团队。