Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

끊김 없이 하자

(반만 해결) DataParallel()을 사용한 모델 로드 시의 GPU 지정 문제 본문

낑낑

(반만 해결) DataParallel()을 사용한 모델 로드 시의 GPU 지정 문제

도파미파 2021. 5. 31. 16:34

오늘 해결할 수 있을 것 같지는 않아서 힘들기는 하고 어쨌든 오랜만에 뭔가 쓰고 싶어져서 일단 기록.
https://github.com/ming024/FastSpeech2
위 레포로 학습 후 저장한 모델을 로드해서 추론하려고 하는 과정에서 생긴 문제이다.

학습한 모델이 torch.nn.DataParallel()을 사용했기 때문인지,
학습된 모델을 로드했을 때도 똑같이 모든 GPU를 점거하게 된다.
이를 해결하기 위해 제일 자주 사용했던 os.environ["CUDA_VISIBLE_DEVICE"] = "2" 코드를
torch.device(....) 위쪽에 삽입했는데, 그래도 여전히 0번 GPU를 메인으로 나머지 GPU를 다 소량씩 사용한다.

torch.device('cuda')의 결과에 여러 개의 GPU(*전부는 아닌!)를 넣는 방법을 한참 찾다가,
포기하고 torch.device('cuda:2')로 갈아타보았는데 이랬더니 추론할 때

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:2!

이런 걸 뱉지 뭔가.. 흑흑.

외에도 학습할 때 DataParallel() 사용 시에도 os.environ() 이 뭔가 안 먹었던 것 같아서

나중에는 model = nn.DataParallel(model, device_ids=[2, 3]) 으로 원하는 GPU 지정해서 테스트해 볼 예정.~

-

나중을 위해 링크만 정리.

. DataParallel() with selected devices

https://discuss.pytorch.org/t/while-using-nn-dataparallel-only-accessing-one-gpu/19807

model = nn.DataParallel(model, device_ids=[2, 3])

. DataParallel()을 이용해서 여러 GPU가 고르게 쓰이도록 작성하는 방법

https://aigong.tistory.com/186

. DataParallel() 모델을 저장할 때

https://pytorch.org/tutorials/recipes/recipes/save_load_across_devices.html

. torch.cuda 소스코드 (device 클래스 관련)

https://pytorch.org/docs/stable/_modules/torch/cuda.html#device

 


 

(21. 06. 07.)

위의 이슈는 생각해보니까 어차피 모델 하나로 몰아서 저장했을 거, 0번에만 로드하면 되지 굳이 1, 2번에까지 별로 쓰지도 않는 프로세스를 올릴 이유가 없는데... 깊게 생각해보지도 않았지만 아직은 요지경이다.

DataParallel() 을 이용해서 학습을 했을 때 사용 GPU 기기 제한은 아주 간단하게

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '1, 2'

위와 같이 익히 알던 코드로 해결이 됐다. 굳이

model = nn.DataParallel(model, device\_ids=\[2, 3\])

하지 않아도 아주 잘 된다^^. 일단 뭐 됐다...

 

(21. 06. 09.)

로드 문제도.. 모델 저장할 때 ${model}.module.state\_dict() 안썼기 때문에 어쩔 수 없는 일인가? 생각만 하고 있다

torch.load(... , map\_location='cuda:0': 'cuda:2') 하니까 메인으로 쓰는 GPU가 변하는 정도?

Comments