麦斯科技 · 2021年11月09日

Arm的Edge Delta

https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/edge-delta-on-arm

Julio Suarez 2021年11月3日

Edge-Delta-on-Arm-webimage_2D00_820B50F7_2D00_7B61_2D00_4624_2D00_8218D528827C5F1E.jpg_2D00_600x338x2.jpg

在这篇文章中,我们将探讨在基于Arm的Jetson Xavier NX上运行Edge Delta。我们演示了如何使用Edge Delta分析边缘设备上的数据,以最大限度地减少发送到云的数据量。我们还演示了如何从边缘设备提取度量,并将其发送到边缘增量管理GUI进行可视化。

关于Edge Delta

Edge Delta为企业提供了分布式流处理、联合机器学习和自动可观测性数据管道功能。这使DevOps、Security和SRE团队能够使用并自动路由所有形式的优化机器数据输出(日志、度量、跟踪)。它为他们提供了可扩展性和效率,以消除技术和财务限制。这使得组织能够比以前使用传统集中式系统更准确、更快、更安全地识别和纠正操作和安全事件。

用例描述

Setup.jpg-743x509.jpg

边侧描述

在这个演示的边缘,我们有Jetson board ,它运行一个安装了Jetpack SDK的Ubuntu18.04映像。Jetpack SDK允许更轻松地使用Jetson GPU中的CUDA和Tensor内核。我们使用这些GPU来加速机器学习(ML)推理。为了进行推断,我们在Jethon上安装了英伟达Triton推理服务器。Triton 是一种托管ML模型供客户端使用的工具。客户端(本地或远程)可以使用HTTP或gRPC(我们使用gRPC)向Triton 提交推断请求。该请求包括要使用的ML模型以及所需的输入张量等数据。Triton 使用GPU加速处理请求,并将结果发送回客户端。在我们的例子中,我们使用Triton对从连接的摄像机捕获的视频帧运行对象检测模型。我们使用的模型是可以在Tensor Flow Hub上找到的ssd_mobilenet_v2_2模型(https://tfhub.dev/tensorflow/ssd_mobilenet_v2/2)。该模型可以检测视频帧中的许多日常物体。为了保持这篇文章的简单性,我们的目标检测客户端代码将其报告限制为相机在其视野内看到的人数。除了相机,我们还有一个集成的温度/压力/湿度传感器连接到Jetson。为了使这篇文章简单,我们只使用这个传感器的温度数据。

关于本演示的ML部分

我们使用Arm研究小组在SMARTER项目上的工作作为本演示中目标检测代码的基础。更具体地说,我们借用并修改了SMARTER项目repo中的图像检测器代码。没有必要修改此代码以使其与Edge Delta一起工作,但我们修改了它,因为我们在其他实验中使用了此代码。这段代码版本的主要区别在于删除了一些不需要的特性和重构。如前所述,我们用ssd_mobilenet_v2_2模型替换了对象检测ML模型。我们鼓励读者探索更智能的项目,因为它是边缘/云用例的一个非常完整的示例。

云端描述

用例的云端是直接的。Edge Delta是一种托管服务,因此所需的只是一个帐户。提供免费试验,这有助于实验和探索目的。创建帐户后,您可以登录到管理GUI。通过此GUI,您可以获得有关在边缘设备上安装边缘增量代理的说明/命令。在我们的例子中,我们只需要一个命令就可以在Jetson上安装代理。此时,我们已准备好配置Edge Delta代理,但首先必须了解要分析的数据

边缘增量的数据源

Edge Delta支持各种类型的输入数据源。在这个演示中,我们使用两种类型的输入数据源,文件和执行(脚本)。总的来说,演示总共使用了四个数据源。

  • 摄像机目标检测数据(输入类型:文件)

    • 写入Jetson上的/var/log/object_数据。
    • 图像客户端代码将相机在其视野中看到的人数写入此文件。
    • Jetson可以进行人员分析的帧速率约为每1到2秒一帧。
  • 环境传感器数据(输入类型:文件)

    • 写入Jetson上的/var/log/sensor_数据。
    • 传感器客户端代码将Jetson所在环境的环境温度写入该文件。
    • 温度采样率约为每秒一次。
  • 授权日志(输入类型:文件)

    • 由Ubuntu服务写入/var/log/auth.log。
    • 这是一个报告授权尝试信息的日志文件。例如,当用户尝试使用SSH连接到设备时,此文件会记录日志。
  • Triton 服务器指标(输入类型:execs)

    • Triton公开了Prometheus 式的推断指标。默认情况下,Triton会在端口8002上显示此信息。

管理GUI还提供了有关在边缘分析了多少数据以及流式传输到其他服务的信息。在我们的案例中,我们没有将Edge Delta与其他服务/工具集成以保持简单(下图中没有数据流目的地)。我们建议查看有关集成的文档(https://docs.edgedelta.com/configuration/outputs/),以了解有关此功能的更多信息。

DataFlow.jpg

边缘增量配置

我们不会详细介绍所有Edge Delta配置选项,只是了解如何部署此演示所需的内容。有关配置边缘增量代理的更多信息,我们建议查看他们的文档。https://docs.edgedelta.com/

在配置文件中,我们定义输入数据源和处理器。处理器可用于操作和/或从输入中提取数据。此外,处理器可以搜索数据中的模式和异常,并在发现异常时向管理员发出警报。Edge Delta能够在本地处理和分析数据,而无需在云中发送和存储数据,这是其关键优势之一。我们使用的完整配置如下所示;它被分成逻辑组件,以便更容易描述配置。

代理设置

代理设置适用于Jetson上运行的代理。

version: v2

agent_settings:
  tag: arm_jetson_demo
  log:
    level: info
  anomaly_capture_size: 1000
  anomaly_confidence_period: 30m

这通常是默认的;我们刚把标签改成arm_jetson_demo。

过滤器配置

Edge Delta允许定义过滤器。过滤器的用途之一是从输入数据中删除无关信息,以简化处理器的工作。下面的代码过滤器将删除以hashtag开头的输入数据行。过滤器的名称为clean_triton_log。我们在配置中进一步引用这个过滤器。

filters:
  - name: clean_triton_log
    type: regex
    pattern: "^#.*"
    negate: true

数据输入配置

下面我们选择输入数据源。

inputs:

  execs:
    - labels: "triton_metrics"
      command: "curl localhost:8002/metrics"
      interval: 1m
      filters: 
        - clean_triton_log

  files:
    - labels: "system_logs, auth"
      path: "/var/log/auth.log"
    - labels: "env_sensors"
      path: "/var/log/sensor_data"
    - labels: "obj_detections"
      path: "/var/log/object_data"

我们看到的第一个数据源是triton_metrics。为了获得Triton metrics 指标,我们使用了可执行(execs)输入类型。这允许我们在本地主机端口8002上运行curl命令。我们使用localhost,因为此配置用于Jetson上与Triton server一起在本地运行的代理。请注意,对于exec,我们应用了前面描述的名为clean_triton_log的过滤器。这将删除以hashtag开头的行,我们知道它不包含任何有用的数据。最后一个输入源是我们前面描述的日志文件。请注意,env_sensors是温度传感器输入数据的标签,我们将在配置中进一步引用它。

处理器配置

下面是我们的处理器配置。这些处理器告诉Edge Delta如何处理输入数据。


processors:

  cluster:
    name: clustering
    num_of_clusters: 25
    samples_per_cluster: 2
    reporting_frequency: 1m

  regexes:
    - name: "temperature"
      pattern: "\\s+temperature=(?P<F>\\d*\\W?\\d+)"
      trigger_thresholds:
        anomaly_probability_percentage: 95

    - name: "cam"
      pattern: ",\\s+(?P<detected>person)=(?P<count>\\d+)"
      dimensions: ["detected"]
      trigger_thresholds:
        anomaly_probability_percentage: 95

    - name: "ssd_mobilenet_v2_2"
      pattern: "^nv_inference_(?P<metric>.*){model=\"ssd_mobilenet_v2_2\",version=\"1\"}\\W+(?P<value>\\d*\\.?\\d+)"
      dimensions: ["metric"]
      trigger_thresholds:
        anomaly_probability_percentage: 90

    - name: "auth_failed"
      pattern: "\\b(?:[Aa]uthentication failure|FAILED SU|input_userauth_request: invalid user|Invalid user|Failed publickey|Failed password)\\b"
      trigger_thresholds:
        anomaly_probability_percentage: 95

    - name: "auth_success"
      pattern: "\\b(?:su:|sudo:|sshd:|sshd\\[|pam_unix).*(?:\\b[Aa]ccepted|session opened|to\\b.*\\bon)\\b"
      trigger_thresholds:
        anomaly_probability_percentage: 95

    - name: "auth_root"
      pattern: "\\b(?:sudo|root|su)\\b"
      trigger_thresholds:
        anomaly_probability_percentage: 95

    - name: "auth_su_attempt"
      pattern: "\\b(?:su:|su\\[).*(?:[Aa]uthentication failure|FAILED SU|input_userauth_request: invalid user|Invalid user|Failed publickey|Failed password)\\b"
      trigger_thresholds:
        anomaly_probability_percentage: 95

在顶部,我们看到定义了一个集群处理器。它们用于在输入数据中查找模式并将它们聚集在一起。在这里定义这一点并不意味着会发生集群。它仍然必须在工作流中“调用”,我们将在下一节中看到。在集群部分下面,我们看到各种正则表达式处理器。这些告诉Edge Delta如何提取我们关心的度量。我们可以看到与ssd_mobilenet_v2_2模型相关的用于提取温度、摄像机(称为cam)人员计数和Triton metrics (称为ssd_mobilenet_v2_2)的正则表达式。与集群处理器一样,在这里定义这些正则表达式并不意味着正在使用它们。我们必须在工作流中“调用”它们。

使用工作流连接输入和处理器

必须定义工作流以将各种输入和处理器连接在一起。下面是我们演示的这些工作流的外观。

workflows:

  edge_env_sensors_workflow:
    input_labels:
      - env_sensors
    processors:
      - clustering
      - temperature

  edge_camera_workflow:
    input_labels:
      - obj_detections
    processors:
      - clustering
      - cam

  edge_triton_workflow:
    input_labels:
      - triton_metrics
    processors:

这里我们看到定义了几个不同的工作流。第一个是edge_env_sensors_工作流。标签env_sensors告诉代理/var/log/sensor_数据用作此工作流的数据输入。就在input_labels部分下面,我们可以看到处理器。这里我们称之为集群和温度处理器。这将告诉Edge Delta使用群集处理器搜索/var/log/sensor_数据文件中的模式和异常,并使用温度处理器提取温度读数。我们将其他工作流留给读者研究。

Edge Delta 仪表板

接下来,我们将在部署演示时探索一些Edge Delta管理GUI。我们发现,模式和异常检测是边缘增量的一个关键和有用的特征。

Patterns 块

下面是管理GUI中模式部分的图像。这是为使用群集处理器的工作流生成的

NegativePatterns.jpg

负面模式图向我们展示了两件有趣的事情。首先,它注意到13:43有多个SSH登录Jetson失败。这是一条有用的信息,因为它可能表明存在安全问题。当这些失败的尝试发生时,我们还收到一封电子邮件,提醒我们这些失败的登录尝试。这就是说,我们知道这不是一个问题,因为我们在尝试SSH进入Jetson时故意多次输入无效密码,从而产生了这个问题。从图中我们注意到的第二件事是,我们始终看到Triton server日志(以nv_推断_请求开始的日志)中的推断请求失败。有趣的是,它在加载到Triton 服务器但未实际使用的模型上检测到这些故障。例如,vggish是一个已加载的模型,但不作为演示的一部分使用。如果我们没有将Edge Delta配置为使用集群处理器检查Triton 服务器的模式,这一点就不会被注意到。现在我们知道,可能存在必须调查的Triton服务器配置问题。在管理GUI的模式部分还有其他的图形和日志,但我们将此留给读者进一步研究。

异常段

异常部分包含几个不同的图表。为了简洁起见,我们只展示其中一个

Anomolies.jpg-805x750.jpg

在上图中,外圈是代理分析的各种事件和度量。在左边,我们看到其中一个事件以红色突出显示。这很难理解,但是上面写着“auth_failed”,这是我们在否定模式部分看到的失败的SSH连接尝试。Edge Delta(正确地)将这些失败的登录尝试标记为应该调查的异常。

Metrics 部分

Metrics部分是直截了当的。这里显示的度量是使用配置文件中的正则表达式处理器提取的。以下是温度和人数统计图。

Temperature.jpg

PersonCount.jpg

正如我们所看到的,Jetson所在的温度是稳定和一致的。至于人物检测图,我们看到摄像机看到的人物数量从0开始,最终上升到3。

结论

总的来说,使用Edge Delta很容易启动和运行。事实上,我们花在开发摄像头/传感器接口代码上的时间比设置Edge Delta本身要多。我们鼓励读者尝试使用基于Arm的Edge设备。特别是对于边缘带宽可能有限或在云中存储和搜索数据具有成本/性能敏感性的情况。

https://edgedelta.com/

推荐阅读
关注数
5822
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息