본문 바로가기

부스트캠프 AI Tech/Pytorch

(17)
[17] Troubleshooting Out Of Memory(OOM) 큰 모델을 사용할 때 자주 겪었었는데 보통 batch_size를 줄여서 돌리면 정상적으로 돌아갔다. OOM 이 해결이 어려운 이유들 왜 발생했는지 알기 어려움 어디서 발생했는지 알기 어려움 Error backtracking 이 이상한데로 감 메모리의 이전상황의 파악이 어려움 해결 : Batch Size 줄이기 → GPU clean→ Run GPUUtil 사용하기 nvidia-smi 처럼 GPU의 상태를 보여주는 모듈 Colab은 환경에서 GPU 상태 보여주기 편함 iter마다 메모리가 늘어나는지 확인!! torch.cuda.empty_cache() 사용되지 않은 GPU상 cache를 정리 가용 메모리를 확보 del 과는 구분이 필요 reset 대신 쓰기 좋은 함수 imp..
[16] Hyperparameter Tuning 성능 개선 방법 모델 변경(성능이 좋은 모델로...) 데이터 변경(추가, 오류 확인, 증량) 하이퍼 파라미터 튜닝 Hyperparameter Tuning 모델 스스로 학습하지 않는 값으로 사람이 지정 learning rate, 모델의 크기, optimizer 등 단, 요즘 이 하이퍼파라미터도 NAS(nueral architecture search)나 AutoML 등을 활용하여 선택 가능.. 하이퍼 파라미터에 의해서 값이 크게 좌우 될 때도 있음(요즘은 그닥 없음) 마지막 0.01을 쥐어짜야 할 때 도전 grid search 가장 기본적인 방법 - grid vs random grid search : 특정 파라미터에 대해 몇 가지 탐색할 값들을 정해놓고 차례대로 확인 random search : 특정 범위 ..
[15] Multi-GPU 학습 Multi-GPU GPU vs Node : Node를 system이라고 부르며 이 경우 1대의 컴퓨터로 보면 된다. Single Node Single GPU : 1대의 컴퓨터에 1개의 GPU Single Node Multi GPU : 1개의 컴퓨터에 여러 개의 GPU Multi Node Multi GPU : 서버실에 달려있는 GPU Model Parallel 다중 GPU에 학습을 분산하는 두 가지 방법 모델 나누기 / 데이터 나누기 모델을 나누는 것은 생각보다 예전부터 사용(alexnet) 모델의 병목, 파이프라인의 어려움 등으로 인해 모델 병렬화는 고난이도 과제 Model parallel(e.g. AlexNet) 모델 병렬화는 다음과 같이 있는데, 첫번째 케이스는 하나의 GPU가 작업이 끝나야 다른 G..
[14] monitoring tool - wandb weight & biases 머신러닝 실험을 원활히 지원하기 위한 상용도구 협업, code versioning, 실험 결과 기록 등 제공 MLOps의 대표적인 툴 loss, acc log 뿐아니라 gqu, cqu, network traffic 체크 가능 사용법 https://wandb.ai/ Weights & Biases – Developer tools for ML WandB is a central dashboard to keep track of your hyperparameters, system metrics, and predictions so you can compare models live, and share your findings. wandb.ai 로그인 하고 API키 할당 받고 새로운 프로젝트..
[13] Monitoring tool - Tensorboard Tensorboard TensorFlow의 프로젝트로 만들어진 시각화 도구 학습 그래프, metric, 학습 결과의 시각화 지원 PyTorch도 연결 가능 → DL 시각화 핵심 도구 Parameters scalar : metric 등 상수 값의 연속(epoch)을 표시 graph : 모델의 computational graph 표시 histogram : weight 등 값의 분포를 표현 Image : 예측 값과 실제 값을 비교 표시 mesh : 3d 형태의 데이터를 표현하는 도구 코드 작업 import os import numpy as np from torch.utils.tensorboard import SummaryWriter logs_base_dir = "logs" os.makedirs(logs_bas..
[12] 전이학습 tansfer learning 모델 저장하고 불러오기 model.save() 학습의 결과를 저장하기 위한 함수 모델 형태(architecture)와 파라메터를 저장 모델 학습 중간 과정의 저장을 통해 최선의 결과모델을 선택 만들어진 모델을 외부 연구자와 공유하여 학습 재연성 향상 # 모델 저장 폴더 만들기 MODEL_PATH ="saved" if not os.path.exists(MODEL_PATH): os.makedirs(MODEL_PATH) # 모델 파라미터만 저장 torch.save(model.state_dict(), os.path.join(MODEL_PATH, "model.pt")) # 같은 모델 형태에서 파라미터만 load new_model = TheModelClass() new_model.load_state_dict(tor..
[11] image transform PIL vs opencv image 관련 작업을 할 때 이미지를 어떻게 불러오는지는 엄청 중요하다. transform관련하여 torchvision이나 Albumentations 를 주로 이용하고 있는데 속도나 편함 측면에서 Albumentations 를 자주 쓰는 편이다. Albumentations 라이브러리는 cv2로 읽고 RGB로 변환하여 input 하는 것을 권장한다. PIL RGB로 이미지 읽어옴 array화 필요 cv2 BGR로 이미지 읽어옴 Video capture와 같은 기능 지원이 잘 되어있음 PIL에는 없는 다양한 함수들 지원(PIL에 있는 거의 모든 기능이 OpenCV에 존재) cv2 함수의 입력으로 numpy array를 넣어서 바로 사용가능(numpy array와의 호환성이 좋음) ..
[10] Dataloader 의 기본요소 Dataloader는 데이터셋을 미니 배치 단위로 제공해주는 역할 DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None) . Datalaoder에는 Dataset 인스턴스가 들어감 a = iter(DataLoader(dataset_iris)) # 이렇게 정의해 두고 next(a) # 를 계속 실행하면 다음 batch 가 나옴. 출력 잘 나오는지 파악할 때 확인 가능 # [tensor([[5.1000, 3.5000, 1.4000, 0.200..
[09] Dataset Dataset 관련 모듈 알아보기 torch.utils.data : 파이토치 모델을 학습시키기 위한 데이터셋의 표준을 `torch.utils.data.Dataset 에 정의 torchvision.dataset : 이미지 데이터셋 모음 torchtext.dataset : 텍스트 데이터셋 모음 torchvision.transforms : 이미지 트랜스폼 torchvision.utils : 이미지 데이터를 저장하고 시각화를 위한 도구가 들어있는 모듈 Dataset의 기본 요소 from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self,): pass def __len__(self): pass def __getitem__..
[08] backward 과정 이해하기 for epoch in range(epochs): …… # Clear gradient buffers because we don't want any gradient from previous epoch optimizer.zero_grad() # get output from the model, given the inputs outputs = model(inputs) # get loss for the predicted output loss = criterion(outputs, labels) # get gradients w.r.t to parameters loss.backward() # update parameters optimizer.step() ……… optimizer.zero_grad() - gradient..