부스트캠프 AI Tech 3주차 주간 학습 정리
Day 1
- 학습 강의 : PyTorch 1 ~ 3강
- 과제 : [필수과제] Custom Model 개발하기
1. 강의 복습
PyTorch
1강 : Introduction to PyTorch
- PyTorch와 TensorFlow의 차이점 :
- PyTorch는 Define by Run(Dynamic Computational Graph, DCG) 방식으로 실행을 하면서 그래프를 생성한다. 논문을 쓰거나 개발 중일 때 용이하다.
- TensorFlow는 Define and Run 방식으로 그래프를 먼저 정의하고 실행 시점에 데이터를 feed한다. 개발 후 배포할 때 용이하다.
2강 : PyTorch Basics
- PyTorch의 연산의 장점은 Numpy + AutoGrad에 있다.
- torch.FloatTensor()로 Tensor를 생성할 수 있다.
- list나 ndarray를 사용하여 Tensor를 생성할 수도 있다. ndarray의 경우 torch.from_numpy(nd_array) 형식으로 생성 가능
- view, squeeze, unsqueeze 등으로 tensor의 차원을 조정할 수 있다.
- 행렬곱셈 연산은 dot이 아닌 mm을 사용, mm은 matmul과 달리 broadcasting을 지원하지 않는다.
- backward 함수를 사용해 자동 미분이 가능하다.
a = torch.tensor([2., 3.], requires_grad = True) b = torch.tensor([6., 4.], requires_grad = True) Q = 3*a**3 - b**2 external_grad = torch.tensor([1., 1.]) Q.backward(gradient = external_grad) a.grad >>> tensor([36., 81.]) b.grad >>> tensor([-12., -8.])
3강 : PyTorch 프로젝트 구조 이해하기
- 프로젝트 템플릿 이용하기
- 코랩을 ssh로 연결하여 vscode로 작업환경 세팅하기(ngrox 이용)
2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)
- 필수 과제를 통해 torch 모듈에 존재하는 여러 수학적 연산, indexing에 대해 공부했고 특히 gather함수의 실습을 통해 Tensor의 dim에 따른 연산을 더 잘 이해할 수 있었다.
- hook에 대한 개념을 배웠고 이를 forward, backward 함수에 적용하는 것을 배웠다.
- apply에 대해서 배웠고 hook을 이용해 forward함수에 변화를 줄 수 있다는 것을 알게 되었다.
3. 참고할 만한 자료
- 부스트코스 제공 자료
4. 피어세션
- 문석암 캠퍼님의 github의 pull request에 대한 설명과 적용 과정
- 이예빈 캠퍼님의 당일 강의 요약
- 자세한 내용은 Peer Session 참조
Day 2
- 학습 강의 : DL Basic 4 ~ 5강
- 과제 : [필수과제] Custom Dataset 과제
1. 강의 복습
PyTorch
4강 : AutoGrad & Optimizer
- 하나의 Layer를 하나의 레고블럭으로 생각하면 편하다. 결국 딥러닝 모델은 각각의 레고블럭을 정의하고 이러한 레고블럭들을 연결시킨 것이다. (블록 반복의 연속)
- torch.nn.Module은 딥러닝을 구성하는 Layer의 base class이다.
- 기본적으로 Input, Output, Forward, Backward, 그리고 학습의 대상이 되는 parameter(tensor)를 정의한다.
- nn.Parameter(Tensor 객체의 상속객체)를 통해 학습의 대상이 되는 parameter를 정의한다.
- *nn.module 내에서 attribute가 될 때에는 required_grad = True로 지정해서 학습의 대상이 된다.
- 대부분의 layer에서는 weight 값들이 지정되어 있다.
- backward 함수를 통해 layer에 존재하는 parameter들의 미분을 진행(loss function 미분)
- optimizer.zero_grad()를 이용해 이전의 gradient 값이 현재의 gradient 계산에 영향을 주는 것을 제거하기 위해 초기화
5강 : Dataset & Dataloader
- Dataset class의 getitem() method를 이용해 하나의 데이터를 불러올 때 반환하는 방식을 결정한다.
- Data 형태에 따라 Dataset class의 각 함수를 다르게 정의해야 한다.
- DataLoader는 Data의 Batch를 생성해주는 클래스
- collate_fn은 Variable length를 정의해주고 padding을 해줄 때 많이 사용한다.(시퀀스 데이터 처리)
2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)
- 필수 과제를 통해 Dataset class와 DataLoader class의 여러 파라미터와 적용 방법 등을 배웠다.
- transform class를 통해 이미지를 tensor로 바꿀 수 있고 이미지의 Data Augumetation 할 수 있다.
- Custom Dataset을 만드는 연습을 했고 이 과정에서 pandas를 다시 복습하였고 tqdm에 대해 알게 되었다.
- init, len, getitem method를 정의하면서 각 method의 역할과 데이터 셋을 불러오고 전처리하여 처리하는 과정을 직접 실습하면서 배울 수 있었다.
- torch에서 지원해주는 여러 Dataset에 대해 살펴볼 수 있었다.(MNIST, AG_NEWS 등)
3. 참고할 만한 자료
- 부스트코스 제공 자료
4. 피어세션
- 1일차 필수과제에 대한 질의응답
- 문석암 캠퍼님의 당일 강의 요약
- 1일차 알고리즘 문제 풀이 코드 리뷰
- 자세한 내용은 Peer Session 참조
Day 3
- 학습 강의 : DL Basic 6 ~ 7강
- 과제 : [선택과제] Transfer Learning + Parameter Tuning
1. 강의 복습
PyTorch
6강 : 모델 불러오기
- 최근 AI의 트렌드는 Backbone이라고 하는 기본적인 모델(이미 학습되어 있는)을 가져와 원하는 데이터를 학습시키는 것이 대세이다. -> fine tuning이라고 불린다.
- 학습의 결과를 저장할 필요가 있기 때문에 PyTorch에서는 model.save()라는 함수를 지원해준다.
- 모델 형태(architecture)와 paramter를 저장
- 학습 중간 과정의 저장을 통해 최선의 결과 모델 선택(Early stopping)
model.state_dict()
: 모델의 paramter를 표시,torch.save(model.state_dict(), os.paht.join(MODEL_PATH, "model.pt"))
형식으로 모델 parameter 저장,model.load_state_dict(torch.load(...))
형식으로 parameter를 같은 형태의 모델에 load- torch.save(model, …)은 모델 형태 저장, torch.load(…)은 모델 형태 load -> pickle 형태로 저장
- checkpoints : 학습의 중간 결과를 저장하여 최선의 결과를 선택
- epoch, loss, metric을 함께 저장하여 확인
- colab에서 지속적인 학습을 위해 필요
- Transfer learning : 다른 데이터셋으로 만든 모델을 현재 데이터에 적용
- 대용량 데이터셋으로 만든 모델의 경우 성능이 좋기 때문에 이를 활용
- 현재 딥러닝에서 가장 일반적인 학습 방법이다.
- TorchVison이나 NLP의 경우 HuggingFace에서 모델을 지원
- Freezing : pretrained model 활용 시 모델 일부분의 parameter를 변경하지 못하게 하는 것(
requires_grad = False
로 바꿔준다.)
7강 : Monitoring tools for PyTorch
- 학습 모터닝 도구에는 Tensorboard, weight & biases 등이 있다.(시각화 도구)
- Tensorboard
- scalar : matric(Acc, Loss) 등 상수 값의 연속(epoch)을 표시
- graph : 모델의 computational graph 표시
- histogram : weight 등 값의 분포를 표시
- image : 예측 값과 실제 값을 비교 표시
- mesh : 3d 형태의 데이터를 표형하는 도구
- torchvision.utils.make_grid(image)를 사용하면 image grid를 생성해준다.
- weight&biases : MLops 도구 중 하나로 볼 수 있다.
- 협업, code versioning, 실험 결과 기록 등을 제공
2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)
- 딥러닝의 학습 방법은 Transfer learning이 가장 대세이다.
- 모델을 불러오고 fine tuning을 하는 방법, Freezing에 대한 개념을 배웠다.
- 학습 중간 결과를 확인하기 위해 Tensorboard, weight & bias 등의 도구를 사용한다. 시각화 도구를 이용함으로써 좀 더 편하게 paramter 값의 변화를 histogram으로 살펴볼 수 있고 이를 공유하기도 쉽다.
3. 참고할 만한 자료
- 부스트코스 제공 자료
4. 피어세션
- 김다인 캠퍼님의 강의 요약 및 캐글 간단 설명
- 필수과제 1, 2에 대한 질의 응답
- Attention Is All You Need 가볍게 읽어보기
- 차주 강의요약 발표자 선정
- 자세한 내용은 Peer Session 참조
Day 4
- 학습 강의 : PyTorch 8 ~ 10강
- 과제 : [선택과제] Transfer Learning + Parameter Tuning
1. 강의 복습
PyTorch
8강 : Multi-GPU 학습
- Node는 한 대의 컴퓨터를 말한다. ex) Single Node Single GPU라는 것은 1대 컴퓨터 내 1개의 GPU를 말한다.
- Multi GPU를 이용해서 학습하는 방법에는 Model parallel, Data parallel이 있다.
- Model parallel는 모델의 병목, 파이프라인의 문제점 등이 존재한다.
- Data parallel은 데이터를 나눠 GPU에 할당하고 각 결과의 평균을 취한다.
- DataParallel : 단순히 데이터를 분배하고 평균을 취함 -> GPU 사용 불균형 문제, Batch 사이즈 감소(한 GPU가 병목), GIL(
- DistributedDataParallel : 각 CPU마다 process를 생성하여 개별 GPU에 할당
- DataParallel : 단순히 데이터를 분배하고 평균을 취함 -> GPU 사용 불균형 문제, Batch 사이즈 감소(한 GPU가 병목), GIL(
- torch.nn.DataParallel(model) 을 통해 DataParallel 구현
- DistributedDataParallel의 경우 torch.utils.data.distributed.DistributedSampler(train data) 형식의 코드를 통해 Sampler를 사용해야 하고 pin_memory = True로 설정해야 한다.
9강 : Hyperparameter Tuning
- 학습 성능을 높이는 데 가장 큰 요소로 작용하는 부분인 데이터 부분이다(좋은 모델은 이미 고정되어 있기 때문에).
- 데이터는 많으면 많을수록 좋다. 그 다음이 Hyperparameter Tuning이다.
- Hyperparameter Tuning의 기본적인 방법은 grid 방식과 random 방식이 있다. 최근에는 베이지안 기반 기법을 많이 사용(BOHB)
- Ray라는 도구를 이용해 Hyperparameter Tuning을 진행
- multi-node multi processing을 지원하는 모듈
- ML/DL의 병렬 처리를 위해 개발된 모듈
- config에 search space 지정 -> 학습 스케줄링 알고리즘 지정 -> 결과 출력 양식 지정 -> 병렬 처리 양식으로 학습 시행
- 베이지안 관련 알고리즘을 선택할 수 있고 이를 활용하면 효율적으로 Hyperparameter Tuning가능
- 학습 과정이 함수로 되어있어야 Ray를 사용할 수 있다.
- 좋은 데이터가 제일 중요하다!!!
10강 : PyTorch Troubleshooting
- OOM = Out Of Memory : 왜, 어디서 발생했는지 알기 어려움, 메모리의 이전 상황 파악이 어려움
- 가장 기본적인 해결법은 Batch size를 줄이고 GPU를 clean하게 하는 것
- GPUtil을 사용해서 GPU 상태를 확인하기(
GPUtil.showUtilization()
) - torch.cuda.empty_cache() 쓰기 : 사용되지 않은 GPU상 cache를 정리하여 가용 메모리를 확보한다. del과는 구분이 필요
- 학습 시작 전에 코드를 추가하여 이전 학습에 의해 생긴 메모리의 영향을 없앨 수 있다.
- training loop에 tensor로 축적되는 변수 확인(1-d tensor의 경우 python 기본 객체로 변환하여 처리 -> 메모리에 적층되는 것을 방지)
- del 명령어를 적절히 사용하기
- 필요가 없어진 변수 삭제(python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지하기 때문)
- 가능 batch 사이즈 실험해보기
- torch.no_grad() 사용하기 : Inference 시점에서 사용(validate나 test할 때)
2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)
- 과제를 진행하면서 Pre-trained model을 불러와서 적용하는 과정을 코드를 따라가면서 확인할 수 있었다.
- Ray에 대한 사용법을 배울 수 있었다.
- 가장 중요한 것은 모델, 데이터, Hyperparameter tuning 순인데 모델은 좋은 모델이 거의 결정되어 있기 때문에 좋은 데이터가 학습 성능을 좌우한다. 어떻게 하면 좋은 데이터를 만들고 수집할 지가 가장 중요한 부분인 것 같다. Hyperparameter tuning은 마지막 단계에서 작은 수치만큼의 성능을 높일 때 사용하자!
3. 참고할 만한 자료
- 부스트코스 제공 자료
4. 피어세션
- 팀회고를 진행했다.
- 김현욱 캠퍼님의 강의 요약
- 자세한 내용은 Peer Session 참조
주간 회고
- PyTorch 과제를 수행하는 과정에서 많은 배움을 얻었고 좋은 모델은 무엇인가, 좋은 데이터란 무엇이고 어떻게 만들 것인가에 대한 고민을 가지게 되었다. 모델, 데이터의 기본 개념조차 헷갈렸던 처음과 비교하면 많이 발전하고 있는 게 느껴져서 뿌듯하다.
- 오피스 아워 시간을 통해 과제를 만드신 멘토님들의 출제 의도를 들으면서 인공지능 학습 과정의 flow를 좀 더 파악하는 시간이 되었다. 과제를 스스로 다 해결하긴 했지만 솔루션을 함께 보면서 복습하는 게 많은 도움이 될 것 같다. 뿐만 아니라 지난 주 과제를 할 때 이해하지 못한 상태에서 제출을 했는데 다시 한 번 복습하면 얻는 것이 많을 것 같다.
- 지난 주에 비해서 학습 정리도 제 때 다 진행해서 나름 계획했던 걸 지킨 주가 된 것 같다.(마지막날이 밀리긴 했지만 …) 지금처럼만 꾸준하게 할 일 해나가자!!!
- 라이엇게임즈 CTO 님의 개발자의 자세와 TDD에 대한 특강이 있었다. 한 줄의 코드를 짤 때도 항상 가독성을 생각하고 필요없는 부분이 있는지 생각해야 한다고 다짐했다.
- 최성철님의 마스터 클래스 또한 유익한 강의였다. MLops에 대한 것들을 알려주시면서 결국 엔지니어로서 성공하기 위해서는 AI 뿐만 아니라 데이터베이스, 리눅스, 도커, 쿠버네티스 등 다양한 분야의 능력을 기르는 것이 중요하다고 알려주셨다. 부스트코스를 잘 수료하고 난 뒤 언급한 내용들을 공부해서 엔지니어로서의 역량을 높여야 겠다.
당장은 부스트코스 따라가기도 벅찬 수준…