AssertionError: can only test a child process

boingboing·2024년 8월 31일

현상

 "/opt/conda/envs/medsam/lib/python3.10/site-packages/torch/utils/data/dataloader.py"
 File "/opt/conda/envs/medsam/lib/python3.10/site-packages/torch/utils/data/dataloader.py", line 1460, in _shutdown_workers
    if w.is_alive():
  File "/opt/conda/envs/medsam/lib/python3.10/multiprocessing/process.py", line 160, in is_alive
    assert self._parent_pid == os.getpid(), 'can only test a child process'
  • train.py 학습 과정에서 발생함.

  • 현재 프로세스의 부모 PID와 현재 프로세스의 PID가 같은지 확인.

  • 자식 프로세스에 대해서만 부모의 pid가

  • 데이터 로딩하는 dataloader 부분에서 발생함.

    원인

  • python의 multiprocessing 모듈을 사용하는 프로그램에서 발생.

  • 다중 스레드 또는 다중 프로세스 환경에서 데이터로더를 사용할 때 발생함.

  • 부모-자식 프로세스간의 관계가 깨짐. 부모 프로세스가 종료되거나, 예상치 못한 오류로 인해 자식 프로세스와의 관계가 단절된 경우.

    이 현상의 원인?
  • DataLoader의 num_workers 파라미터를 너무 크게 설정하거나, 복잡한 데이터 전처리 로직이 있을 경우 이런 문제가 발생.

  • batch size를 150으로 너무 크게 잡음-> ram에 과부하.

  • 프로세스가 올바르게 종료되는지, 부모 프로세스와 자식 프로세스간의 관계가 유지되고 있는지 확인해야 함.

    해결

  • batch size를 150으로 무리하게 크게 잡음. -> batch size를 8정도로 줄이니 이 문제는 해결됨. (X)

  • 사용할 수 있는 GPU 갯수가 1개인데, num_workers가 4로 잡혀있었음. ->

    참고

  • torch.utils.data.DataLoader의 num_workers는 dataset의 데이터를 gpu로 전송할 때 필요한 전처리를 수행할 때 사용하는 subprocess의 수를 말한다.

  • num_workers의 수가 너무 크면 다른 일을 수행하는 데 사용할 자원이 적어져서 성능이 안 좋아질 수 있다.

  • 따라서 적절한 값을 찾기 위해 하이퍼파라미터 튜닝을 하듯 접근한다.

0개의 댓글