NVIDIA Jetson 系列 - 第 1 部分 (Jetson-Stats)

导航至

NVIDIA — 如果您像我一样是一位狂热的 PC 游戏玩家,那么这个名字对您来说应该很熟悉。 NVIDIA 是图形处理器 (GPU) 设计和生产领域的全球领导者。近年来,NVIDIA 大举进军视觉人工智能领域,发布了名为 Jetson 系列的嵌入式入门板。

在本博客系列文章中,我们将创建我们自己的视觉人工智能管道,并利用 Telegraf 和 InfluxDB 来摄取、存储和监控我们的 Jetson 硬件和视觉人工智能管道。

监控 Jetson (规划)

在我们构建视觉管道之前,让我们首先监控我们的 Jetson 设备。

为什么?

当使用 Jetson 系列等嵌入式系统时,资源非常稀缺。通过监控硬件温度、GPU 利用率和功耗,我们可以评估我们的视觉人工智能管道对设备造成的压力有多大。

您可能已经知道,Telegraf 已经准备好与 NVIDIA SMI (系统管理界面) 插件一起使用。 这对于监控您的标准独立 GPU 非常有用,但不幸的是,SMI 不适用于 Jetson 设备。

这意味着什么?

这意味着我们必须发挥一点创意。在构建任何软件架构时,我个人喜欢使用业务流程模型和符号 (BPMN) 来传达我的想法。

Business Process Model- NVIDIA InfluxDB

让我们构建它

如果您想跳过,我已将我的代码放在这里 本教程将使用 InfluxDB Cloud。 本教程也兼容 InfluxDB OSS。

让我们首先下载并安装所需的先决条件

  1. Jetson Stats
$ sudo apt-get update
$ sudo apt-get install python3-pip
$ sudo -H python3 -m pip install -U jetson-stats

注意:我选择使用 Python3 安装 Jetson-Stats 库,因为我更喜欢在 3.X 中工作。您也可以选择使用 Python 2.X 安装 Jetson-Stats。

  1. Telegraf
$ sudo apt-get install wget
$ wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
$ source /etc/lsb-release
$ echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
$ sudo apt-get update && sudo apt-get install telegraf

注意:Telegraf 现在作为服务安装在您的 Jetson 设备上。它还会生成自己的服务用户 (这稍后会很重要)。现在,我们不会启动该服务。

Exec 插件和 Python 脚本

正如我们的 BPMN 中所示,我们将使用 Telegraf Exec 输入插件来触发 Python 脚本。 让我们从编写我们的 Python 脚本开始

# Import jtop python library. We will use this to access the Jetson_Stats service.
from jtop import jtop
import json, datetime

if __name__ == "__main__":

    with jtop() as jetson:
            # jetson.stats provides our system measurements as type dict.
            tmp = jetson.stats  
            # time and uptime are proved as time objects. These needed to be converted before passing as a JSON string,
            tmp["time"] = str(tmp["time"].strftime('%m/%d/%Y'))
            tmp["uptime"] = str(tmp["uptime"])
            # We then convert our dict -> Json string
            influx_json= {"jetson": tmp}
            print(json.dumps(influx_json))

正如您所看到的,我们的 Python 脚本非常简单。我们基本上

  1. 打开 jtop (Jetson Stats) 的实例以从中读取。这将返回一个 Python 字典结构。
  2. timeuptime 字段转换为字符串值。 这使我们能够使字典可解析为 JSON 结构。
  3. 转换为 JSON 字符串并打印到 stdout。

如果我们手动运行脚本,您将看到与此类似的输出

{"jetson": {"time": "09/21/2021", "uptime": "6:01:06.430000", "jetson_clocks": "OFF", "nvp model": "MAXN", "CPU1": 28, "CPU2": 20, "CPU3": 14, "CPU4": 14, "GPU": 0, "RAM": 2164788, "EMC": 2164788, "IRAM": 2164788, "SWAP": 1, "APE": 25, "NVENC": "OFF", "NVDEC": "OFF", "NVJPG": "OFF", "fan": 0.0, "Temp AO": 35.5, "Temp CPU": 26.0, "Temp GPU": 24.5, "Temp PLL": 25.5, "Temp thermal": 25.0, "power cur": 1442, "power avg": 1777}}

接下来,我们将配置 Exec 插件以定期运行此脚本并摄取 JSON 字符串

注意:我将仅介绍 Exec 插件配置 (完整的 Telegraf.conf 在这里)。

[[inputs.exec]]
  ## Commands array
  commands = [
    "python3 /usr/local/bin/jetson_stats.py"
  ]

  ## Timeout for each command to complete.
  timeout = "5s"

  ## measurement name suffix (for separating different commands)
  name_suffix = "_jetson_stats"

  ## Data format to consume.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
  data_format = "json"
  ## Array of glob pattern strings or booleans keys that should be added as string fields.
  json_string_fields = ["jetson_uptime", "jetson_nvp model", "jetson_NVENC",  "jetson_NVDEC",  "jetson_NVJPG"]

在此插件中,我们定义了以下内容

  • Command(命令):供 Telegraf 用户运行的终端命令。在本例中,我们调用我们的 Python 脚本。 注意:我将我的 python 脚本移动到 /usr/local/bin
  • Timeout(超时):默认超时时间即可。
  • Name_suffix(名称后缀):这允许我们在我们的指标 (默认为 InfluxDB 中的 Exec) 上附加一个描述性名称。
  • Data_format(数据格式):在本例中,我使用了我们原始的 JSON 数据格式类型。 这纯粹是个人选择,因为 JSON 结构非常简单。
  • Json_string_fields(Json 字符串字段):最后,由于我们的一些数据点是字符串类型,因此我们必须显式定义这些字段。 否则,在形成我们的指标时,它们将被丢弃。

在我们的 Exec 插件可以运行我们的 Python 脚本之前,我们还需要执行一个步骤。 由于 Jetson_Stats 以提升的权限运行,我们必须授予我们的 Telegraf 用户对其权限组的访问权限

$ sudo sudo usermod -aG jetson_stats telegraf

InfluxDB Cloud

注意:本教程的这一部分假设您已经设置了一个免费的 InfluxDB Cloud 帐户。 您可以在此处进行设置。

现在您有了一个免费的 InfluxDB Cloud 帐户,让我们加载一个 模板。 模板为构建 InfluxDB 资产 (如 Bucket 和仪表板) 提供了蓝图。 如果您想了解有关模板的更多信息,请查看这篇精彩的博客文章

  • 在导航栏的设置部分中选择 Templates(模板)InfluxDB 导航设置 - 模板
  • 选择 Install Template(安装模板)

这将自动创建 Bucket “Jetson” 和仪表板 “Jetson Stats”。 我们现在已准备好将我们的 Jetson 数据流式传输到 InfluxDB Cloud。

InfluxDB_v2 插件

我们现在将配置 Telegraf 以将我们的 Jetson Stats 指标输出到云端

[[outputs.influxdb_v2]]
  ## The URLs of the InfluxDB cluster nodes.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  ##   ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"]
  urls = ["https://us-east-1-1.aws.cloud2.influxdata.com/"]

  ## Token for authentication.
  token = "<INSERT_TOKEN>"

  ## Organization is the name of the organization you wish to write to.
  organization = "<CLOUD_ORG>"

  ## Destination bucket to write into.
  bucket = "Jetson"

在此插件中,我们定义了以下内容

  • Urls(URL):由于我们使用的是云实例,因此此 URL 将取决于您决定在哪里托管您的实例。 我的实例托管在 AWS 中。
  • Token(令牌):要为您的 Jetson bucket 创建令牌,请查阅此处找到的文档。
  • Organization(组织):这将是您注册 InfluxDB Cloud 时使用的电子邮件地址。
  • Bucket(Bucket):将其保留为 Jetson。 除非您计划将您的 Jetson 数据存储在不同的 bucket 中。

最后,我们可以启动我们的 Telegraf 实例

$ sudo systemctl start telegraf
$ sudo systemctl enable telegraf

第 1 部分结束...

您现在可以使用预先创建的仪表板查看您的 Jetson Stats

Jetson Stats dashboard - InfluxDB

以下是我们在本系列第 1 部分中实现的目标

  • 使用 Jetson Stats 监控 NVIDIA Jetson 设备的核心系统指标
  • 配置 Telegraf 以摄取这些指标并将它们发送到 InfluxDB Cloud
  • 使用 Jetson InfluxDB 模板使用正确的数据 bucket 和仪表板预配置我们的 InfluxDB 实例。

您可能会问自己:这很棒,但是那又怎样? 所有内容将在本系列的第 2 部分和第 3 部分中揭晓,我们将在其中构建和测试我们的视觉人工智能管道。

一旦您启动并运行,请在 InfluxData Slack 和社区论坛上联系我 (只需确保标记我 @Jay Clifford)。 让我知道

  1. 如果您目前正在开发视觉解决方案,并且正在使用或想要使用 Telegraf 和/或 InfluxDB。 这可能是一个很棒的合作项目!
  2. 如果您在教程的任何部分遇到困难。
  3. 任何意见或建议。 我的 repo 可以在这里找到,我总是很乐意查看任何 pull request。