总体目标:我试图将我的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
我如何搜索最大值的位置有什么问题?
答案 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