본문 바로가기

반응형

Pytorch

(7)
[Pytorch] RuntimeError: Attempting to deserialize object on CUDA device 2 but torch.cuda.device_count() is 1. Please use torch.load with map_location to map your storages to an existing device. 파이토치를 통해 코드를 짜다보면 모델을 불러오기 위해 load하는 경우가 상당히 많습니다. 그런데 종종 아래와 같은 에러가 발생합니다. # 에러 메세지 RuntimeError: Attempting to deserialize object on CUDA device 2 but torch.cuda.device_count() is 1. Please use torch.load with map_location to map your storages to an existing device. # 에러가 발생한 코드 checkpoint = torch.load(args.pretrained) 이러한 에러가 발생하는 이유는 load를 할때, 불러오는 모델을 학습한 환경에서 2개 이상의 gpu가 사용됐기 때문에, 한 개의 gpu..
[Pytorch] 재생산성을 위한 랜덤설정 reproductibility, randomness control, seed Pytorch에서는 초기화와 속도향상을 위해서 다양한 random함수들이 사용됩니다. 하지만 딥러닝 모델 학습을 재생산하거나 동일한 조건내에서 실험을 해야 할 경우, 이런 randomness를 컨트롤해줘야 할 필요가 있습니다. # torch random 값 생성 torch.manual_seed(random_seed) # 현 gpu에서의 random 값 생성 \ torch.cuda.manual_seed(random_seed) # 2개 이상의 gpu를 사용할 때 torch.cuda.manual_seed_all(random_seed) # randomness가 들어간 함수 미사용 torch.backends.cudnn.deterministic = True # True일 시, 동일한 사이즈에 텐서들이 들어올때의 속..
[Pytorch] apex / amp 모델 학습 빠르게 시키는 법. github에서 pytorch 코드를 살펴보다 보면, apex, amp가 사용되는 모습을 자주 볼 수 있다. amp는 Automatic Mixed Precision의 약자로, 몇 operations들에서 float16 데이터타입을 사용해 학 속도를 향상시켜주는 방법을 제공해준다. 기존 pytorch는 데이터타입이 float32로 기본 설정이라는 것도 참고하면 좋을 것 같다. 또한 구글링을 하다보면 amp를 사용하는 방법이 apex.amp 와 torch.cuda.amp 두 방법이 나오는데, 아래 포스트를 보면 apex의 implementation들이 Pytorch에서 지원을 시작해서, apex는 이제 앞으로는 사용되지 않을 것이라고 한다. https://discuss.pytorch.org/t/torch-c..
[Pytorch] DDP-Distributed Data Parallel 구현 도입 ImageNet과 같이 큰 모델을 학습할 때엔 multi-gpu를 활용하여 학습속도를 향상시킬 수 있습니다. DataParallel과 DistributedDataParallel이 대표적인 방법입니다. DataParallel방법은 딱 한 줄만 수정해줘도 동작하기 때문에, 코딩하는데에는 오랜시간이 걸리진 않지만, DDP에 비해 gpu의 memory를 많이 잡아먹게되고, 학습속도도 비교적 느리기 때문에 전체 학습시간은 더 오래걸리게 된다는 큰 단점이 있습니다. 이번 포스트에서는 학습 속도 향상을 위한 DistributedDataParallel(DDP)을 사용하는 방법에 대해 포스트해보도록 하겠습니다. 이번 포스트의 구성은 # 도입 # 간단한 설명 # 상세한 설명 순으로 진행하였습니다. 데이터 셋은 CIF..
[Pytorch 오류] Pytorch Dataparallel시 CUDA_LAUNCH_BLOCKING=1 현상. 다양한 이유가 있을 수 있겠지만, 나같은 경우 imagenet의 validation dataset이 올바르게 설정되어 있지 않아서였다. validation dataset을 다시 다운받은 후, 디렉토리를 설정해주니 정상 작동했다. ImageNet dataset 설치 방법에 대한 글을 작성한 후, 글을 첨부하도록 하겠다.
[Pytorch] model layer, Sequential 변경하는 법 소개 딥러닝 모델 학습할 때에 여러가지 이유로 선언된 모델의 layer을 수정해야할 때가 있다. 만약 layer가 적다면 직접 변경해줄 수 있다. 그러나 모델의 layer가 많아 자동적으로 변경하고 싶거나, nn.Sequential이 사용되면 변경에 어려움을 느끼게 된다. 이번 포스트에서는 nn.Sequential이 존재하는 model의 layer 수정법을 작성하였다. 정리 모델의 멤버변수를 return 해주는 named_children()과 클래스의 모듈들을 return 해주는 _modules를 활용한다. 코드 class ToyNet(nn.Module): def __init__(self): super(ToyNet, self).__init__() self.layer1 = nn.Sequential( nn...
[Pytorch] network(model) parameter 얻는 방법 소개 최근 경량화 스터디를 시작했다. 경량화 스터디에서 첫 주제는 Pruning이었다. Pruning은 가지치기 기법으로 모델에서 중요하지 않은 weight나 filter를 제거함으로써 계산량과 모델 크기를 줄여주는 방법이다. 중요한 weight나 filter를 찾아내기 위해 모델 내부의 parameter에 직접 접근하고, 변경도 해야해서 구현이 쉽지 않았다. 구현을 위해 여러 시도를 해보면서 알게된 점을 정리해보았다. 정리 0. state_dict를 사용하여 값을 변경하면 된다. 나의 목표는 parameter 참고와 변경이었으니, get_parameters와 state_dict를 적절히 활용하면 될 것 같다. 1. 모듈에 named_parameters / parameters, named_children..

반응형