GNU Parallel - อาร์กิวเมนต์สำรอง

Sep 09 2020

ฉันต้องการที่จะสามารถสลับอาร์กิวเมนต์สำหรับแต่ละการดำเนินการของคำสั่งคู่ขนานของฉัน

ฉันมีสคริปต์ในการประมวลผลรูปภาพและฉันใช้ GNU Parallel เพื่อเปิดใช้งานหลายกระบวนการในเวลาเดียวกัน ฉันใช้ GPU คอร์ในสคริปต์นี้ แต่ใช้เพียงหนึ่งในคอร์ GPU 2 ตัวของฉัน

ฉันต้องการใช้ไฟล์คอนฟิกูเรชันที่แตกต่างกัน 2 ไฟล์ (ไฟล์หนึ่งสำหรับ GPU 1 และหนึ่งสำหรับ GPU 2) แต่ฉันไม่รู้ว่าจะทำอย่างไร

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" ด้วย $ config เปลี่ยนจาก gpu_1 เป็น gpu_2 ทุกการดำเนินการอื่น ๆ

เป็นไปได้หรือไม่?

ขอบคุณ😉

แก้ไข:

ใช้หมายเลขงานของคำสั่ง parallel ( {#}) เป็นอาร์กิวเมนต์จากนั้นรับ 0 หรือ 1 โดยใช้โมดูโลของหมายเลขงานนี้:

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"

ในฟังก์ชันงาน :

task(){
...
jobnumber=$4 gpu=$(expr $jobnumber% 2)
...
}

คำตอบ

1 OleTange Sep 10 2020 at 14:26

เมื่อระบุคำอธิบายของคุณคุณอาจไม่ต้องการให้ GNU Parallel เป็นทางเลือกอื่น ลองนึกภาพว่างานแปลก ๆ ทั้งหมดใช้เวลา 1 วินาทีและงานทั้งหมดใช้เวลา 2 วินาที จากนั้นคุณจะจบลงด้วยงานที่ทำงานบน GPU เดียวกันในขณะที่ไม่มีงานอื่นทำงานอยู่

สิ่งที่คุณต้องการคือให้เริ่มงานบน GPU2 ทันทีที่งานเสร็จบน GPU2 {%}(aka. job slot) ทำขึ้นเพื่อสิ่งนี้:

parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
MarkSetchell Sep 09 2020 at 18:35

สิ่งนี้ควรใช้งานได้:

seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}

เอาท์พุท

task 1 gpu1
task 2 gpu2
task 3 gpu1
task 4 gpu2
task 5 gpu1
task 6 gpu2
task 7 gpu1
task 8 gpu2
task 9 gpu1
task 10 gpu2
task 11 gpu1
task 12 gpu2
task 13 gpu1
task 14 gpu2