GNU Parallel - อาร์กิวเมนต์สำรอง
ฉันต้องการที่จะสามารถสลับอาร์กิวเมนต์สำหรับแต่ละการดำเนินการของคำสั่งคู่ขนานของฉัน
ฉันมีสคริปต์ในการประมวลผลรูปภาพและฉันใช้ 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)
...
}
คำตอบ
เมื่อระบุคำอธิบายของคุณคุณอาจไม่ต้องการให้ 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
สิ่งนี้ควรใช้งานได้:
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