Nvidia Smi JSON 输出

lor*_*isi 7 xml json nvidia node.js

我想输入有关机器可用 GPU 和状态的系统信息以进行实时监控。我XML使用以下方式输出 GPU 信息

$ nvidia-smi -x -q
Run Code Online (Sandbox Code Playgroud)

此命令将打印输出当前 GPU 状态(如使用情况、温度等)以及格式化的 XML(具有定义的 DTD)。我的 XML 输出在这里

没有直接从nvidia-smijson 输出的选项,所以此时我看到的唯一选项是将 XML 从 Node.js 转换为 JSON。

问题是我需要它作为 JSON,所以我尝试在我的Node应用程序中转换为 JSON。我依次使用了几个 npm 可用模块,如 xml2json、node-xml2js 等,但每个模块都有不同的错误(null、未定义等)。在浏览器中使用简单的 DOMParser (window.DOMParser) 即可。这似乎是这个 XML 的一个错误,因为当我有一个像这里这样的 GPU 输出时,JSON 会被很好地转换,如这个要点所示。

我使用节点生成来调用nvdia-smi命令,然后解析输出,如下所示:

(function() {

var XMLParser = require('./xml2json');

function gpuInfo() {
    var _data='';
    var curl = require('child_process').spawn('nvidia-smi', ['-x','-q']);
    curl.stdout.on('data', function(data) { 
        _data+= new Buffer(data,'utf-8').toString();
     });
    curl.stdout.on('end', function(data) {
        var x2js = new XMLParser();
        var json = x2js.xml_str2json( _data );
        console.log(JSON.stringify( json,null,2));
    });
    curl.on('exit', function(code) {
        if (code != 0) {
            console.log('Failed: ' + code);
        }
    });

}
module.exports = {
    gpuInfo:gpuInfo    
}
Run Code Online (Sandbox Code Playgroud)

在本例中,我使用的是xml2json 浏览器客户端模块的修改xmldom版本与模块相结合,但它似乎不是一个稳定的解决方案,所以我的解析是在这里完成的,如下所示:

this.parseXmlString = function(xmlDocStr) {
            if (xmlDocStr === undefined) {
                return null;
            }
            var xmlDoc;
            var DOMParser = require('xmldom').DOMParser;        
            var parsererrorNS = null;
            try {
                xmlDoc = new DOMParser().parseFromString( xmlDocStr, "text/xml" );
                if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
                    xmlDoc = null;
                }
            }
            catch(err) {
                xmlDoc = null;
            }
            return xmlDoc;
        };
Run Code Online (Sandbox Code Playgroud)

离开这里

  1. 另一种以 json 形式获取这些信息的方法?
  2. 通过一些强大的 XML / JSON 解析器模块更有效的解决方案?

Ole*_*zak 4

尝试使用https://github.com/Cheedoong/xml2json 它更快,并且可以用作像 jq 这样的二进制工具。你会像这样运行:

nvidia-smi -x -q | xml2json | jq
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:

{
  "nvidia_smi_log": {
    "timestamp": "Thu Aug 29 13:45:26 2019",
    "driver_version": "387.34",
    "attached_gpus": "9",
    "gpu": [
      {
        "@id": "00000000:03:00.0",
        "product_name": "P106-090",
        "product_brand": "GeForce",
        "display_mode": "Disabled",
        "display_active": "Disabled",
        "persistence_mode": "Enabled",
        "accounting_mode": "Disabled",
        "accounting_mode_buffer_size": "1920",
        "driver_model": {
          "current_dm": "N/A",
          "pending_dm": "N/A"
        },
        "serial": "N/A",
        ...
Run Code Online (Sandbox Code Playgroud)