버그.
요즘 Panoptic deeplab을 reproducing하고있다.
현재 에러가 나는 이유가, 여기선 데이터로더로 배치를 불러올 때 단순히 이미지 tensor만 가져오지 않아서이다.
dictionary의 리스트로 되어있다! 그러면 만약에 16배치면, 리스트 안에 16개의 딕셔너리가 있는거다.
[{}, {}, {}, {}, ... , {}]
그리고 딕셔너리 안에 이미지 텐서 (그외 필요한 각종 데이터)가 들어있는 형태.
근데 그러면 리스트의 딕셔너리에서 꺼내서 전부 합쳐서 데이터로 넣어야한다.
이미지만 그렇게 하는건 할 수 있는데, 또 모델 안에서 이미지 외에 다른 데이터도 필요로하는 바람에 뭔가 자꾸 에러가 뜬다.
뇌빼고 코딩하면 그냥 리스트를 없애고 딕셔너리를 전부 합쳐버리면 되긴 하는데, 코드에서 대체 어떤 형태를 필요로하는지 모르겠다.
왜 굳이 리스트를 쓴거지? 주변 코드를 보면 world_size를 확인하는 등의 코드가 있던데, 인풋이 이런것에 영향을 받나?
그리고 이런 에러가 있으면 보통 깃허브에서 이슈에 있을텐데, 이에 대해 언급하는 사람은 없다.
= 내가 config파일을 제대로 작성하지 않아서일 확률이 높으며, 뭔가 셋팅을 잘 하면 되지 않나?
지금 코드에서 내 셋팅이면 world size=1로 처리되는데, 그래서 딕셔너리에 데이터 하나씩만 들어간건가?
=> dataparallel 관련해서 조금 알아보자.
그냥 검색하면서 주절거리는 내용이 전부다.
관련 이슈 읽을거리
tutorials.pytorch.kr/beginner/former_torchies/parallelism_tutorial.html
tutorials.pytorch.kr/intermediate/dist_tuto.html
Multi GPU
통상적으로, 그냥 single machine에서 여러 GPU를 사용하여 parallel하게 처리하는 것을 의미한다.
multi gpu 환경이라면 코드에서 아마 nn.DataParallel을 사용했을 것이다.
비디오 돌릴 때 맨날 썼으니 당연히 익숙하다.
import torch.nn as nn
model = nn.DataParallel(model)
이거.
멀티GPU처리를 할때 내부적으로 Scatter와 Gather함수를 사용한다.
입력을 나누고 출력을 합친다는 생각을 하면 될 것 같다.
먼저 Batch size가 정해지면 이걸 GPU 개수로 나눠서 각각 할당해서 입력을 나눠서 처리할 수 있다.
그리고 각각 분산하여 연산되었다면 결과를 합치는 과정 또한 필요하다.
따라서, 전 과정은 이런 순서로 진행된다.
1. Replicate -> 2. Scatter -> 3. Parallel_apply -> 4. gather
각각의 디바이스에 모델의 복사본을 만들며, input을 각 모델에 분산해서 넣을 수 있도록 나눠주는 작업, 그리고 나눠서 연산을 진행한 후, 최종적으로 결과 합치기.
연산은 병렬이지만 loss function의 계산은 하나의 GPU에서 진행된다.
그래서 마지막에 출력을 하나로 모은 것.
만약에 loss function도 나눠서 처리를 하도록 구현한다면, 그것은 분산처리와 비슷한 원리라고 한다.
nn.DataParallel을 사용하는 경우에는 기본적으로 criterion을 하나로 모아서 계산하기 때문에, 만약 Loss도 따로 계산하고싶다면 별도의 코딩이 필요하다.
Distributed?
그러면 코드에서 보였던 그건 뭘까...
일단 앞에서 multiGPU는 그냥 프로세스는 하나다. 워커는 여러개 둘 수 있긴 하겠지만 아무튼.
그런데 Distributed라면 기본적으로 여러 프로세스를 처리하는 목적이라서, 각각 나눠서 연산할거라서 작업이 끝날때까지 기다리는 작업이 필요할 것 같다. 보통 클라우드같은데서 거대한 연산을 하려고 이런 짓을(?) 하는 것 같다.
그래서 RANK, master address, master port 이런걸 지정해준다. 코드나 에러메시지에서 보였던 저 변수들의 정체가 바로 그것.
어디서 합칠건지, 프로세스를 몇개나 기다려야하는지 등을 알아야하기 때문.
에러에서 계속 보였던 WORLD_SIZE는 프로세스의 개수를 의미했다.
원래 분산처리 더 찾아보려고 했는데 어쩌다보니 이 글 쓰다가 버그 잡는바람에 대충 끝.
댓글