簡體   English   中英

如何限制每個通過 gnu 並行啟動的 python 進程使用一個 CPU?

[英]How do I limit using one CPU per python processes launched via gnu parallel?

如果我運行這個腳本

$ seq 1 4 | taskset -c 0-3 parallel -j4 -u <my_bash_script.sh>

然后<my_bash_script.sh>中包含的每個 python 進程都在多個 CPU 上運行,而不是一個。 python 函數同時使用 numpy 和 pytorch。 因此, taskset -c 0-4選項強加了 CPU 的最大數量,但並不能保證每個進程僅限於一個 CPU。

我試過了

$ export OPENBLAS_NUM_THREADS=1
$ export MKL_NUM_THREADS=1

但它沒有用

我還添加到 python 腳本中

import mkl
mkl.set_num_threads(1)

但它沒有幫助

使用工作槽:

$ seq 1 4 | parallel -j4 -u taskset -c {%} <my_bash_script.sh>

Jobslot 就是為此而構建的:想象一下,您有 4 個以上的工作。 如果您隨后將每 4 個工作分配給 cpu 4,那么您可能會面臨每 4 個工作比其他工作短的風險。 在這種情況下,即使有更多作業要運行,cpu 4 也會空閑。

Jobslot 不會將每 4 個作業傳遞給 cpu 4。相反,它看起來是哪個 cpu(或更確切地說是作業槽)完成了一項作業,然后在該 CPU 上開始一個新作業。

(另外:由於您使用-u你應該學習的區別--group (默認)和--linebuffer (通常是使用當你真正想要的-u ))。

問題是您的tasksetparallel可以運行的 CPU 限制為 4 個 CPU。 我相當確定parallel子進程、 my_bash_script.sh每個實例及其my_bash_script.sh的 Python 進程也將繼承相同的 CPU my_bash_script.sh集,因此它們也能夠在您指定的 4 個 CPU 中的任何一個上運行。

我認為,您想要的是將parallel啟動的每個 Python 進程限制在不同的 CPU 上,您可以通過將taskset my_bash_script.sh移動到taskset來做到這my_bash_script.sh 具體而言,不限制在那里parallel運行,但限制在Python的處理它開始可以通過包裝調用運行pythonmy_bash_script.shtaskset 您正在向my_bash_script.sh每次調用傳遞一個數字,以便您可以使用它來為每個python調用計算不同的 CPU(目前您可以使用(($1 - 1))因為您正在傳遞值 1 - 4 但是如果你有更多你想要取值 mod 4 或其他東西)。

請注意,我所描述的應該有效,但並不完美。 假設你如果過程1完成第一則沒有使用CPU 1和什么都不會,因為你已經限制了他人各1個CPU運行過程1對1的CPU,CPU的2個過程2,等等。 理想情況下,您希望它們能夠接管現在空閑的 CPU,但這更復雜。

編輯:@Ole Tang 上面的回答建議使用{%}來使用作業槽,而不是根據您提交任務的順序將任務分配給 CPU,這有助於(但不能消除)我上面描述的問題。

我想知道您為什么要將它們每個限制為 1 個 CPU。 確實,如果多個線程同時運行,內核將嘗試對它們進行時間切片,以賦予每個線程相同的資源,這實際上會由於上下文切換、緩存沖突等而損害性能。 OTOH,如上所述,替代方案至少在某些時候可能會有一些 CPU 空閑,這並不明顯,這最終會給您帶來更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM