NVIDIA Jetson 系列第 1 部分(Jetson-Stats)
作者:Jay Clifford / 产品,用例,开发者
2021 年 10 月 06 日
导航至
NVIDIA——如果您像我一样是一位热衷的 PC 游戏玩家,那么这个名字应该对您来说很熟悉。NVIDIA 是设计和生产图形处理单元(GPU)的全球领导者。近年来,NVIDIA 在视觉人工智能领域投入巨大,发布了名为 Jetson 系列 的嵌入式启动板。
通过这篇博客系列,我们将创建自己的视觉人工智能管道,并利用 Telegraf 和 InfluxDB 来摄入、存储和监控我们的 Jetson 硬件和视觉人工智能管道。
监控 Jetson(规划)
在我们构建视觉管道之前,让我们先从监控我们的 Jetson 设备开始。
为什么?
在处理嵌入式系统,如 Jetson 系列时,资源稀缺。通过监控硬件温度、GPU 利用率和功耗,我们可以评估我们的视觉人工智能管道对设备造成的压力有多大。
如您所知,Telegraf 配套了 NVIDIA SMI(系统管理接口)插件。这对于监控您的标准独立 GPU 来说非常好,但遗憾的是,SMI 对 Jetson 设备不可用。
这意味着什么?
这意味着我们必须有点创造性。在构建任何软件架构时,我个人喜欢使用业务流程模型和符号(BPMN)来传达我的想法。
让我们开始构建
如果您想跳过前面的内容,我已将我的代码放在这里。 我将在这个教程中使用 InfluxDB 云。 这个教程也兼容 InfluxDB OSS。
让我们先下载和安装所需的先决条件
- 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。
- 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脚本相当简单。我们本质上
- 打开一个jtop(Jetson Stats)实例以读取。这将返回一个Python字典结构。
- 将字段time和uptime转换为字符串值。这使得字典可被解析为JSON结构。
- 转换为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)提供了一个蓝图。如果你想了解更多关于模板的信息,请查看这篇优秀的博客文章
- 在导航栏的设置部分选择模板。
- 将我的Jetson InfluxDB模板复制并粘贴到URL字段:https://github.com/Jayclifford345/demo_telegraf_jetson_stats/blob/master/Jetson-InfluxDB-Template.yml
- 选择查找模板。
- 选择安装模板。
这将自动创建“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监控NVIDIA Jetson设备的核心系统指标。
- 配置Telegraf以从InfluxDB Cloud接收和发送这些指标。
- 使用Jetson InfluxDB模板预先配置我们的InfluxDB实例,以便正确设置数据存储桶和仪表板。
您可能会问自己:这很好,但那又如何?所有内容将在本系列的第二部分和第三部分中揭晓,我们将构建和测试我们的视觉AI管道。
一旦您开始运行,请通过InfluxData Slack和社区论坛联系我(确保给我@Jay Clifford发消息)。让我知道
- 如果您目前正在开发视觉解决方案,并正在使用或希望使用Telegraf和/或InfluxDB。这可能是一个可以共同工作的绝佳项目!
- 如果在教程的任何部分遇到困难。
- 任何评论或建议。我的仓库可以在这里找到,我总是乐意查看任何拉取请求。