2017-07-25 59 views
0

總體目標:我想分配我的python程序到GPU的可用內存最多。nashia-smi命令在bash vs在終端最大的陣列

當前的問題:當我使用這個命令:

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

'array =($(...任何...))'本質上是錯誤的,因爲它依賴於字符串分割,這與glob擴展一起發生。任何建議這種做法的東西都應該是可疑的。 –

+0

謝謝@CharlesDuffy。但是我應該怎麼做呢? – StatsSorceress

+0

['readarray -t' /'mapfile -t'](http://wiki.bash-hackers.org/commands/builtin/mapfile)或[BashFAQ#1](http://mywiki.wooledge。 org/BashFAQ/001)風格的循環。 –

回答

1

以下是詳細的,但要小心遵循良好的做法;它不會被令人驚訝的輸入誤導,以將本地文件名作爲數據進行處理(例如,如果未來版本的軟件在頭文件中有* s,就會發生這種情況),並且運行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