이벤트 핸들링을 위해 Sidecar 컨테이너를 추가한다.
CheckPoint(나중에 오류복구를 위해.), Model, 학습 Log는 EmptyDir 볼륨에 저장되고 Sidecar 컨테이너는 이것을 외부 저장소(S3, Local...)에 저장하는 역할을 한다.
이때 학습 Log는 Container
Horovod Master Job에
Sidecar 컨테이너는 Horovod 컨테이너의 MPI 프로세스를 감시하고 종료되었을 때 해당 프로세스의 Exit code를 분석(0이면 정상종료, 아니면 비정상종료)하여 적절히 핸들링한다.
Exit code가 0일때
Exit code가 0일 때 학습이 정상적으로 종료되었음으로 생각하고 Model, Log를 외부 저장소에 저장한다. (+ 향후 Dashboard가 추가된다면 웹서버에 저장 위치, 상태 등을 추가적으로 전송한다.)
Exit code가 0이 아닐 때
Exit code가 0이 아닐 떄 학습이 비정상적으로 종료되었으므로 CheckPoint, Log를 외부 저장소에 저장한다.
# simulate a long process that will have an identifiable exit code
(sleep 15 ; /bin/false) &
my_pid=$!
while ps | grep " $my_pid " # might also need | grep -v grep here
do
echo $my_pid is still in the ps output. Must still be running.
sleep 3
done
echo Oh, it looks like the process is done.
wait $my_pid
my_status=$?
echo The exit status of the process was $my_status
wait 명령어의 동작은 다음과 같다.
wait
백그라운드로 실행중인 모든 작업이나 옵션으로 주어진 특정 작업 번호나 프로세스 아이디가 끝날 때까지 스크립트 실행을 중단 시킵니다. 자신이 기다리고 있던 명령어의 종료 상태를 리턴합니다.
백그라운드 작업이 끝나기 전에 스크립트가 끝나는 것(무서운 고아 프로세스를 만들어 낼 수 있습니다)을 피하기 위해 wait 명령어를 쓸 수도 있습니다.
작업 목표
이벤트 핸들링을 위해 Sidecar 컨테이너를 추가한다. CheckPoint(나중에 오류복구를 위해.), Model, 학습 Log는 EmptyDir 볼륨에 저장되고 Sidecar 컨테이너는 이것을 외부 저장소(S3, Local...)에 저장하는 역할을 한다. 이때 학습 Log는 Container
Horovod Master Job에 Sidecar 컨테이너는 Horovod 컨테이너의 MPI 프로세스를 감시하고 종료되었을 때 해당 프로세스의 Exit code를 분석(0이면 정상종료, 아니면 비정상종료)하여 적절히 핸들링한다.
Done Of Done(Subtask)
commit hash
Additional context
Pod 내의 다른 컨테이너의 프로세스 접근 https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/ Pod 스펙에
shareProcessNamespace: true
를 추가하면 컨테이너 끼리 Process Namespace를 공유하여 Sidecar 컨테이너에서 Horovod 컨테이너의 프로세스를 볼 수 있다.프로세스 모니터링 https://codeday.me/ko/qa/20190309/27013.html 스켈레톤 코드
wait 명령어의 동작은 다음과 같다.
$? 가 최근 실행한 명령어의 exit code를 가져오는 명령어이다.