명명된 매개변수를 사용한 GNU 병렬

명명된 매개변수를 사용한 GNU 병렬

내 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.

관련 정보