使用Loud ML & Docker将机器学习模型应用于InfluxDB进行时序预测

导航至

我喜欢学习数据科学。我喜欢尝试各种机器学习模型,以了解何时使用它们,它们是如何工作的,以及如何评估它们。然而,一头扎进机器学习可能会感到害怕。我想创建这个教程,向数据科学爱好者展示您如何快速使用Loud ML和InfluxDB将高性能机器学习模型应用于您的时序数据。

本教程将涵盖以下主题

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

该项目仓库可以在这里找到。对于这个项目,我选择对默认的telegraf数据库中的average_usage_system字段进行离线预测。请记住,我没有运行InfluxDB,因此数据非常稀疏。这并不是一个好的机器学习(ML)预测选择。然而,我选择使用这些数据,因为它们容易访问,并且更容易让您开始。虽然这个教程只覆盖离线ML,但请知道Loud ML还提供了在线ML功能。如果您是Docker新手,可能需要查看新Docker用户提示。在那篇文章中,我回顾了自己作为新Docker用户所犯的错误,以及如何避免这些错误的建议。

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

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

  • 创建一个名为"loudml2"的网络,并直接使用--subnet选项指定子网值。
docker network create --subnet=172.18.0.0/24 loudml2
  • 找到InfluxDB存储数据的位置。对于本教程,我使用的是默认的telegraf数据库。
$INFLUXDB="/usr/local/var/influxdb"
  • 设置本地存储以与容器共享,并创建配置和模型文件($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" 选择合适的桶聚合间隔非常重要。数据将在这个桶间隔内进行平均。如果桶间隔值过低,训练将花费很长时间,并且存在过拟合的风险。选择过长的桶间隔可能导致模型对异常不敏感,并平滑掉有趣的异常。通常桶跨度介于10分钟到1小时之间,或者与异常之间的平均持续时间相似。跨度(10*5m=50m)决定了用于预测下一个值的桶间隔数量。

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

"forecast": 5 最佳实践是将 forecast 设置为 span 的一半。

"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-Click Machine Learning 的预览

我喜欢 InfluxData 的一个原因是我们的开源产品。由于 TICK Stack 的 OSS 版本功能强大且用途广泛,我们的社区已经取得了巨大的增长。Telegraf 有超过 160 个插件,其中153个是由社区成员编写的。CERN 的研究人员使用 OSS 版本来帮助他们“确定宇宙的基本结构”。Loud ML 是另一个典型的社区成功故事。Loud ML 从 InfluxData 的仓库中分叉出来,并将 1-Click Machine Learning 添加到 Chronograf 中,以支持机器学习模型的配置和部署。Loud ML 使将 ML 模型应用于时间序列数据变得非常简单。相比之下,如果我要单独使用 TensorFlow,我必须选择一个模型,评估它,并调整它。这是一项大量工作,需要对时间序列数据有深入的理解。幸运的是,我无需了解任何关于 ML 的知识,就可以使用 Loud ML 创建高性能模型并对其进行评估。通过 1-Click Machine Learning,您只需单击按钮即可创建和训练模型。您只需查询数据,应用特征和聚合间隔,然后点击预测。

<figcaption> 标准的 Chronograf 实例被替换为来自 LoudML 的分叉版本,该版本包括 1-Click ML</figcaption>

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

<figcaption> 来自 LoudML 的 Chronograf 的分叉版本,包括 1-Click ML</figcaption>

看看这个预览,体验Loud ML的1-Click机器学习,将于8月底上线。

希望这篇教程能帮助您开始时间序列机器学习的旅程。如果您有任何问题,请到社区网站提问或通过@InfluxDB发推文。特别感谢和祝贺Sébastien Léger以及整个Loud ML团队。