토막숏 폼 블로그

[Pytorch] RAM에 간신히 올라가는 dataset으로 DDP 학습하기

TL; DR; child process 개수 (== gpu 개수)만큼 dataset을 분할하여 각 child에서 자신의 subset을 load합시다 (참고: DistributedSampler 말고 RandomSampler를 써야 함)

  1. 더 큰 RAM을 장착한 server에서 돌리기 (몸이 나쁘면 머리가 고생한다)
  2. Shared memory 사용
    • ray: 불가능 (ray와 child process 간의 연결이 어려움) (https://stackoverflow.com/questions/64499456/python-ray-shared-memory-access)
    • multiprocessing.Array: 가능 (parent에서 np 형태의 shared memory 선언 후 child에서 사용) , but 복잡함
    • multiprocessing.Queue (또는 SimpleQueue): 불가능 (parent에서 dataset 선언 후 queue를 통해 child에 하나씩 보내주는 방식을 생각했으나, 결국 child 개수 만큼의 dataset이 공유메모리에 올라가게 될 듯), 느림
    • file system 통한 소통: 가능 but 엄청나게 느림
    • fork: cuda 쓰려면 불가능 (부모 process에서 global 변수로 두고 fork 데, cuda는 spawn or forkserver만 가능) (https://pytorch.org/docs/stable/notes/multiprocessing.html)
  3. Dataset을 분할하여 각 child에서 독립적인 subset load (일반적으로 많이 쓰지만, 내가 사용한 dataset은 example 생성 시 pool에서 random sampling 해오는 작업이 있어 분할하기 애매했음)
    • example을 분할저장: 불가능 (single process에서 dataset load 후 각 example을 child 개수만큼 나누어 저장하려 했으나, example list의 기가 dataset보다 훨씬 커서 실패)
    • subset load: 성공 (각 subset에 필요한 pool만 가지도록 dataset 수정)

당겨서 다음 글 보기

프로필 사진

작성자

0