Buttercups - Powerpuff Girls

개념 정리/인공지능

[Object Detection/딥러닝] 학습할 때 유의할 점 & 필수로 구현할 기능

jeonga 2022. 7. 13. 10:48

🔎 NVIDIA GPU 사용 시, 사용중인 프로세스가 없는데 용량이 잡혀있어서 사용할 수 없을 때

💭GPU 용량 확인하는 명령어

nvidia-smi

* docker container 내부에서 확인하면 프로세스가 안보이는 경우가 있다. 아래 참고

* 프로세스 번호가 보이는 경우 kill -9 [PID]로 죽이면 된다.

💭특정 GPU 번호로 잡힌 '모든' 프로세스를 확인하는 명령어 (GPU: nvidia1 => 본인이 선택하여 작성)

sudo lsof /dev/nvidia1 | grep python  | awk '{print $2}' | sort -u

💭특정 GPU 번호로 잡힌 프로세스를 모두 종료하는 명령어

for i in $(sudo lsof /dev/nvidia1 | grep python  | awk '{print $2}' | sort -u); do kill -9 $i; done

❓python process가 여러개 생기는 이유

Pytorch에서 dataloader를 사용할 때 쓰이는 num_workers라는 parameter의 영향이다. 

데이터로더는 배치 사이즈만큼 데이터를 불러오고 이들을 하나의 배치로 합쳐 변환해준다. 그 후 그 배치로 학습을 진행한다.코드내에서 num_workers만큼 프로세스를 그 개수만큼 생성해서 '병렬적으로' 데이터를 불러와서 빠르게 로드할 수 있게 된다. 해당 파라미터를 가지고 코드를 실행하다가 죽이게 되면 병렬적으로 처리되고 있던 프로세스들도 종료되어야하는데 조금 시간이 걸린다. 종료되는 동안 GPU 메모리에 allocation이 되어있지만, 메인 프로세스는 중단시켰기 때문에 nvidia-smi를 했을 때 PID가 안뜨는 경우가 있다. (메모리는 할당되어있는데, PID가 안보이는 경우가 해당됨) 


🔎 학습 중간에 모델 저장하는 기능

여러번의 시행착오를 겪은 이후 웬만하면 꼭 구현하는 기능이다.

딥러닝 모델을 학습할 경우, 이미지 데이터가 많으면 학습 시간이 매우 오래 걸린다.

그러면 보통 퇴근할때 돌려놓고 다음날 확인하거나, 돌려놓고 다른 일을 하는 경우가 많다. 

하지만, GPU 메모리가 부족하게 되거나 프로세스 이슈로 인해서 학습이 중간에 멈추는 현상이 있었다.. (그러면 일정이 딜레이되어 일정이 틀어진다.)

예방 방법으로 꼭 '학습 중간에 모델을 저장'해야 한다.

보통 나는 N epoch을 3번~5번을 나눠 N%3==0 or N%5==0 일때마다 모델을 저장한다. 

이렇게 하면 중간모델에 이어서 학습을 진행하거나, 중간중간에 Over fitting이 일어났는지 실제 Test 데이터를 통해 실험도 해볼 수 있다!

 

torch.save(model_ft, SAVE_PATH + 'resnet_model_11.pt') # 전체 모델 저장
torch.save(model_ft.state_dict(), SAVE_PATH + 'resnet_model_state_dict_11.pt') # 모델 객체의 state dict 저장
torch.save({
    'model': model_ft.state_dict(),
    'optimizer': optimizer_ft.state_dict()
}, SAVE_PATH + 'resnet_all_11.tar') # 여러가지 값 저장, 학습 중 진행 상황 저장을 위해 epoch, loss 값 등 일반 scalar값 저장 가능