GPU에 올린 train 작업을 종료하기 위해 nvidia-smi에서 확인된 PID 를 kill 했다. 그런데 해당 프로세스에 묶인 GPU 메모리가 free 되지 않는다. 모델과 데이터가 여전히 디바이스에 올라가 있다는 뜻이다. 종료한 PID는 분명 더이상 nvidia-smi에는 실행중인 것으로 표시되지 않는다.
어떻게 된 일일까?
왜 부모-자식 프로세스로 실행되었나?
$ ./train.sh
# train.sh 스크립트 내용은 아래
# python train.py
좀비 프로세스의 부모 프로세스를 찾아 죽이자! 🪓
ps -ef | grep defunct | grep -v grep
# out
[root@server ~]# ps -ef | grep defunct | grep -v grep
jaylnne 21207 21205 0 Feb26 ? 00:00:00 [my_script.sh] <defunct>
kill -9 21205
Tip❗ 부모 프로세스의 부모 프로세스(조부모 프로세스)가 있는 경우도 있다. 자식 프로세스를 죽이는 것이 목적이라면 조부모 프로세스까지 죽일 필요는 없다. 부모 프로세스만 죽이면 좀비가 된 자식 프로세스를 완전히 죽일 수 있다.