GPU를 사용하고 ML 모델을 학습하는 두 개의 스크립트가 있습니다. 자기 전에 시작해서 밤에 효과를 보고 아침에 효과를 보고 싶습니다.
하지만 GPU 메모리가 제한되어 있기 때문에 병렬이 아닌 직렬로 실행하고 싶습니다.
python train_v1.py && python train_v2.py
; 를 사용할 수 있지만 train_v1
동시에 훈련 시간이 더 오래 걸리기 때문에 두 번째 스크립트의 구현을 시작하고 완료한 후 자동으로 실행 train_v2.py
하려고 합니다 .python train_v1.py
어떻게 해야 하나요? 감사해요.
답변1
train_v1.py
다음은 다른 프로세스가 아직 살아 있는지 반복하고 확인하거나 일반적으로 수행되는 방식과 다른 방식으로 호출하는 것을 포함하지 않는 방법입니다 .
$ python train_v1.py
^Z
[1]+ Stopped python train_v1.py
$ % && python train_v2.py
^Z
프로세스가 실행되는 동안 +를 눌러 Ctrl신호를 보내 절전 모드로 전환 하는 경우 입니다 . 그런 다음 셸에 를 사용하여 깨우도록 지시합니다. 이를 마지막에 명령으로 추가할 수 있습니다. 이렇게 하면 처음부터 했던 것처럼 동작하게 됩니다.Ztrain_v1.py
SIGTSTP
%
&& python train_v2.py
python train_v1.py && python train_v2.py
대신 을 %
사용할 수도 있습니다 fg
. 이러한 유형의 쉘 기능에 대해 더 알고 싶다면 다음을 읽으십시오.Bash 맨페이지의 "작업 제어" 섹션.
편집: 대기열에 계속 추가하는 방법
Jamesdlin이 의견에서 지적했듯이 train_v3.py
v2가 시작되기 전에 스키마를 계속 추가하려고 하면 다음을 수행할 수 없다는 것을 알게 될 것입니다.
$ % && python train_v2.py
^Z
[1]+ Stopped python train_v1.py
train_v1.py
아직 시작되지 않았기 때문에 중지 되며 train_v2.py
, 아직 시작하지도 않은 작업은 중지/일시 중지/잠자기할 수 없습니다.
$ % && python train_v3.py
같은 결과를 가져올 것이다
python train_v1.py && python train_v3.py
%
마지막으로 정지된 프로세스에 해당하기 때문입니다 . v3
이와 같이 추가하려고 시도해서는 안 되며 기록을 사용해야 합니다.
$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py
위와 같이 히스토리 확장을 수행하거나 키 바인딩(up과 같은)을 사용하여 마지막 명령을 호출하고 끝에 v3를 추가할 수 있습니다.
$ % && python train_v2.py && python train_v3.py
이는 파이프라인에 더 많은 콘텐츠를 추가하기 위해 반복될 수 있는 작업입니다.
$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py
^Z
[1]+ Stopped python train_v1.py
$ !! && python train_v4.py
% && python train_v2.py && python train_v3.py && python train_v4.py
답변2
이미 시작한 경우 프로세스가 종료될 때까지 프로세스를 폴링한 다음 두 번째 Python 스크립트를 실행할 python train_v1.py
수 있습니다 .pgrep
while pgrep -u "$USER" -fx 'python train_v1.py' >/dev/null
do
# sleep for a minute
sleep 60
done
python train_v2.py
-f
및를 사용하면 -x
첫 번째 Python 스크립트를 시작하는 데 사용된 정확한 명령줄을 일치시킬 수 있습니다. 일부 시스템에서는 조용하게 만드는 옵션을 pgrep
구현합니다 ( 에서처럼 ). 이는 리디렉션이 필요하지 않음을 의미합니다.-q
grep -q
/dev/null
이 -u
옵션은 실행 중인 명령에 대한 일치를 제한합니다(같은 시스템에 있는 친구나 다른 사람에게는 해당되지 않음).
아직 첫 번째 스크립트를 시작하지 않은 경우:
댓글에서 언급했듯이 첫 번째 스크립트 바로 다음에 두 번째 스크립트를 시작할 수 있습니다. 두 번째 스크립트가 존재하지 않거나 아직 실행할 준비가 되지 않았다는 사실은 중요하지 않습니다(첫 번째 스크립트가 완료될 때 실행할 준비가 되어 있는 한).
python train_v1.py; python train_v2.py
그렇게 하면 첫 번째 스크립트의 종료 상태에 관계없이 두 번째 스크립트가 시작됩니다. 질문에 표시한 대로 대신 사용하면 &&
작동 ;
하지만 두 번째 스크립트를 시작하기 전에 첫 번째 스크립트를 성공적으로 완료해야 합니다.
답변3
다음을 사용하여 첫 번째 스크립트를 시작할 수 있습니다.
python train_v1.py; touch finished
그런 다음 주기적으로 존재 여부를 확인하는 루프를 만듭니다 finished
.
while [ ! -f finished ] ; do
sleep 5
done
python train_v2.py
rm finished
답변4
첫 번째 스크립트의 종료 상태를 알 필요가 없다면 다음과 같은 것을 권장합니다.코살로난다는 무엇을 썼나요?.
종료 상태를 정말로 알아야 하는 경우에는 더 복잡합니다(이 경우에는 그렇지 않을 수도 있지만 다른 사람들은 이를 수행하는 솔루션을 찾고 있을 수 있습니다). 나는 썼다리눅스 소형 유틸리티pwait
이를 통해 프로세스가 완료될 때까지 기다리고 종료 상태를 확인할 수 있습니다.