내 Makefile에 다음 명령이 있습니다
parallel \
--eta \
--bar \
--joblog mnist/embedder.joblog \
pipenv run python3 \
-m mnist.train_embedder \
--embedder_name {1} \
--embedder_dim {2} \
--embedder_lr {3} \
--embedder_epochs {4} \
:::: grid/embedder_name \
:::: grid/embedder_dim \
:::: grid/embedder_lr \
:::: grid/embedder_epochs
각 파일에는 다음과 유사한 내용이 포함되어 있습니다.
$ cat grid/embedder_name
ae
cnn
$ cat grid/embedder_dim
24
32
48
64
드라이런의 결과는 다음과 같습니다.
$ parallel \
--dry-run \
--eta \
--joblog mnist/embedder.joblog \
pipenv run python3 \
-m mnist.train_embedder \
--embedder_name {1} \
--embedder_dim {2} \
--embedder_lr {3} \
--embedder_epochs {4} \
:::: grid/embedder_name \
:::: grid/embedder_dim \
:::: grid/embedder_lr \
:::: grid/embedder_epochs
Computers / CPU cores / Max jobs to run
1:local / 96 / 8
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
ETA: 0s Left: 8 AVG: 0.00s local:8/0/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name ae --embedder_dim 24 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 7 AVG: 0.00s local:7/1/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name ae --embedder_dim 32 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 6 AVG: 0.00s local:6/2/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name ae --embedder_dim 48 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 5 AVG: 0.00s local:5/3/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name ae --embedder_dim 64 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 4 AVG: 0.00s local:4/4/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name cnn --embedder_dim 24 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 3 AVG: 0.00s local:3/5/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name cnn --embedder_dim 32 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 2 AVG: 0.00s local:2/6/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name cnn --embedder_dim 48 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 1 AVG: 0.00s local:1/7/100%/0.0s pipenv run python3 -m mnist.train_embedder --embedder_name cnn --embedder_dim 64 --embedder_lr 0.001 --embedder_epochs 32
ETA: 0s Left: 0 AVG: 0.00s local:0/8/100%/0.0s
--embedder_name
매개변수 목록 은 계속 늘어나고 있습니다. 과 사이에 매개변수를 추가하려면 , 까지 편집 --embedder_dim
해야 합니다 . 이는 지루하고 오류가 발생하기 쉽습니다.--embedder_dim {2}
--embedder_dim {3}
--embedder_lr {3}
--embedder_lr {4}
위치 매개변수를 명명된 매개변수로 바꿀 수 있나요? 나는 다음과 같이 상상한다.
parallel \
--eta \
--bar \
--joblog mnist/embedder.joblog \
pipenv run python3 \
-m mnist.train_embedder \
--embedder_name {embedder_name} \
--embedder_dim {embedder_dim} \
--embedder_lr {embedder_lr} \
--embedder_epochs {embedder_epochs} \
:::: grid/embedder_name \
:::: grid/embedder_dim \
:::: grid/embedder_lr \
:::: grid/embedder_epochs
이렇게 하면 중복된 이름이 많이 생성되지만(문자열은 embedder_name
명령에 세 번 표시됩니다!) 적어도 실수로 잘못된 인수 순서에 대해 더 강력합니다.
관련이 있는 경우
$ uname -a
Linux t1v-n-5d019513-w-0 5.13.0-1023-gcp #28~20.04.1-Ubuntu SMP Wed Mar 30 03:51:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
답변1
--header :
하다거의당신은 무엇을 원합니까?
첫 번째 행이 헤더인 CSV 파일용으로 만들어졌습니다.
따라서 "grid/embedder_name" 앞에 "name"을 추가해야 합니다.
$ cat grid/embedder_name
name
ae
cnn
$ cat grid/embedder_dim
dim
24
32
48
64
또한 각 파일 사이에 ::::을 사용할 필요가 없습니다. 하나면 충분합니다. (하지만 읽기 쉽다고 생각되면 보관하세요.)
parallel --header : echo {name} {dim} :::: grid/embedder_dim grid/embedder_name
(@r_31415는 명령줄에 이름을 입력하면 작동하지 않는 예를 보여주었습니다. example: :::
대신 -를 사용하면 ::::
이 작업을 수행할 수 있습니다 . parallel --header : echo {foo} ::: foo 1 2 3
)
편집하다:
버전 20220822부터 다음을 수행할 수 있습니다.
parallel --header 0 echo {grid/embedder_name} {grid/embedder_dim} :::: grid/embedder_dim grid/embedder_name
parallel --header 0 echo {embedder_name} {embedder_dim} :::: embedder_dim embedder_name
이렇게 하려면 파일의 첫 번째 줄에 헤더가 없어야 합니다.
답변2
이것을 스크립트/함수로 포장하는 것을 고려해 보셨나요? 예를 들어
#!/bin/bash
genarglist() {
for ((i=1;i<=$#;i++)) ; do
echo -n " --embedder_${!i} {$i}"
done
for ((i=1;i<=$#;i++)) ; do
echo -n " :::: grid/embedder_${!i}"
done
}
parallel --eta --bar --joblog mnist/embedder.joblog \
pipenv run python3 -m mnist.train_embedder \
$(genarglist $*)
name
그런 다음 , ...을 매개변수로 제공하면 됩니다 dim
.