GNU Parallel - Đối số thay thế

Sep 09 2020

Tôi muốn có thể thay thế một đối số cho mỗi lần thực hiện lệnh song song của mình.

Tôi có một tập lệnh để xử lý hình ảnh và tôi sử dụng GNU Parallel để khởi chạy một số quy trình cùng một lúc. Tôi sử dụng lõi GPU trong tập lệnh này nhưng chỉ một trong 2 lõi GPU của tôi được sử dụng.

Tôi muốn có thể sử dụng 2 tệp cấu hình khác nhau (một cho GPU 1 và một cho GPU 2) nhưng tôi không biết làm thế nào để làm điều đó.

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Với $ config thay đổi từ gpu_1 thành gpu_2 mọi lần thực thi khác

Điều này có thể hay không?

Cảm ơn 😉

BIÊN TẬP:

Sử dụng số công việc của lệnh song song ( {#}) làm đối số, sau đó lấy 0 hoặc 1 bằng cách sử dụng mô-đun của số công việc này:

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

Trong chức năng nhiệm vụ :

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

Trả lời

1 OleTange Sep 10 2020 at 14:26

Với mô tả của bạn, bạn có thể không muốn GNU Song song để thay thế. Hãy tưởng tượng rằng tất cả các công việc lẻ mất 1 giây và tất cả các công việc chẵn mất 2 giây. Sau đó, bạn kết thúc với các công việc chạy trên cùng một GPU trong khi không có công việc nào đang chạy trên GPU khác.

Thay vào đó, những gì bạn muốn là có một công việc bắt đầu trên GPU2 ngay sau khi công việc kết thúc trên GPU2. {%}(hay còn gọi là vị trí công việc) được thực hiện cho điều này:

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

Một cái gì đó như thế này sẽ hoạt động:

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

Đầu ra

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