bv中的nvidia-smi命令vs终端中最大的数组

时间:2017-07-25 20:54:36

标签: bash shell

总体目标:我试图将我的python程序分配给具有最多可用内存的GPU。

当前问题:当我使用此命令时:

nvidia-smi --query-gpu=memory.free --format=csv

我得到以下输出:

memory.free [MiB]
4800 MiB
5332 MiB
5346 MiB

当然,这种变化非常频繁,所以也许这不是实现我总体目标的最佳方式。目前,我尝试使用它来确定三个中的哪个GPU具有最多的可用内存。在这种情况下,它显然是GPU2(它们被标记为0,1,2)。

我创建了一个bash脚本:

#/bin/bash

myarr=( $(nvidia-smi --query-gpu=memory.free --format=csv) )
echo $myarr

将其输出到屏幕:

memory.free

以前以这种格式输出:

memory.free [MiB] 4800 MiB 5332 MiB 5346 MiB

然后我做了这个(with thanks to the first answer here):

myarr2=${myarr[2,4,6]}
echo $myarr2
IC=(`tr ' ' '\n' <<<$myarr2 | cat -n | sort -k2,2nr | head -n1`)
echo $IC
Ival=${IC[0]}
Cval=${IC[1]}
echo $Ival $Cval

但是,看起来我的工作并不重要,我总是得到最大值的索引位置1.在上面给出的例子中,这是正确的。一般来说,这是不正确的。

完整的脚本:

#/bin/bash

myarr=( $(nvidia-smi --query-gpu=memory.free --format=csv) )
echo $myarr
myarr2=${myarr[2,4,6]}
echo $myarr2
IC=(`tr ' ' '\n' <<<$myarr2 | cat -n | sort -k2,2nr | head -n1`)
echo $IC
Ival=${IC[0]}
Cval=${IC[1]}
echo $Ival $Cval

我如何搜索最大值的位置有什么问题?

1 个答案:

答案 0 :(得分:1)

以下是冗长的,但要注意遵循良好做法;它可以通过令人惊讶的输入将本地文件名作为数据进行处理而误导(例如,如果软件的未来版本在标题中有*,则会发生这种情况),并运行shell内部的所有处理(对于非常大的输入,这可能会更慢,但是对于仅处理少量数据的情况(如此处),由于避免sort的进程启动开销,tr会更快},cat或shell外部的其他工具。)

#!/usr/bin/env bash

max_idx=0
max_mem=0
idx=0

{
  read _;                         # discard first line (header)
  while read -r mem _; do         # for each subsequent line, read first word into mem
    if (( mem > max_mem )); then  # compare against maximum mem value seen
      max_mem=$mem                # ...if greater, then update both that max value
      max_idx=$idx                # ...and our stored index value.
    fi
    ((++idx))
  done
} < <(nvidia-smi --query-gpu=memory.free --format=csv)

echo "Maximum memory seen is $max_mem, at processor $idx"

如果我按如下方式定义nvidia-smi(请注意,由于名称中的-,此定义无法移植到所有版本的bash中):

nvidia-smi() { printf '%s\n' 'memory.free [MiB]' '4800 MiB' '5332 MiB' '5346 MiB'; }

...这会作为输出发出:

Maximum memory seen is 5346, at processor 3