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 云。 这个教程也兼容 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 设备上。它还生成了自己的服务用户(这将在以后变得很重要)。现在,我们将不会启动该服务。

执行插件和 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"]

在这个插件中,我们定义以下内容

  • 命令:为Telegraf用户运行的终端命令。在这种情况下,我们调用我们的Python脚本。注意:我已经将我的Python脚本移动到/usr/local/bin
  • 超时:默认超时即可。
  • 名称后缀:这允许我们在测量值(在InfluxDB中默认为Exec)后附加一个描述性名称。
  • 数据格式:在这种情况下,我使用了我们原始的JSON数据格式类型。这纯粹是个人选择,因为JSON结构简单。
  • Json_string_fields:最后,由于我们的一些数据点是字符串类型,我们必须明确定义这些。否则,它们在形成测量值时将被丢弃。

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

$ sudo sudo usermod -aG jetson_stats telegraf

InfluxDB Cloud

注意:本教程的这一部分假设你已经设置了一个免费的InfluxDB Cloud账户。你可以在这里完成此操作。

现在你已经有了一个免费的InfluxDB Cloud账户,让我们加载一个模板。模板为构建InfluxDB资产(如Bucket和Dashboard)提供了一个蓝图。如果你想了解更多关于模板的信息,请查看这篇优秀的博客文章

  • 在导航栏的设置部分选择模板InfluxDB导航设置-模板
  • 选择安装模板

这将自动创建“Jetson”Bucket和“Jetson Stats”Dashboard。我们现在准备好将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将取决于你决定托管实例的位置。我的实例托管在AWS。
  • Token:为了创建Jetson bucket的token,请参阅这里的文档。
  • 组织:这将是你注册InfluxDB Cloud时使用的电子邮件地址。
  • Bucket:保留为Jetson。除非你打算将Jetson数据存储在不同的bucket中。

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

$ sudo systemctl start telegraf
$ sudo systemctl enable telegraf

第一部分结束……

现在您可以使用预先创建的仪表板查看您的Jetson统计信息。

Jetson Stats dashboard - InfluxDB

以下是本系列第一部分我们取得的成果:

  • 使用Jetson Stats监控NVIDIA Jetson设备的核心系统指标。
  • 配置Telegraf以从InfluxDB Cloud接收和发送这些指标。
  • 使用Jetson InfluxDB模板预先配置我们的InfluxDB实例,以便正确设置数据存储桶和仪表板。

您可能会问自己:这很好,但那又如何?所有内容将在本系列的第二部分和第三部分中揭晓,我们将构建和测试我们的视觉AI管道。

一旦您开始运行,请通过InfluxData Slack和社区论坛联系我(确保给我@Jay Clifford发消息)。让我知道

  1. 如果您目前正在开发视觉解决方案,并正在使用或希望使用Telegraf和/或InfluxDB。这可能是一个可以共同工作的绝佳项目!
  2. 如果在教程的任何部分遇到困难。
  3. 任何评论或建议。我的仓库可以在这里找到,我总是乐意查看任何拉取请求。