부스트캠프 AI Tech 5기 2주차 [PyTorch]

README·2023년 3월 17일
0
post-thumbnail

PyTorch 학습 정리

1강

딥러닝을 구현하기 위해 사용하는 프레임워크는 다양하지만 가장 많이 쓰이는 것은 PyTorch와 TensorFlow가 있음
PyTorch: 딥러닝을 구현하는 프레임워크 중 TensorFlow와 함께 가장 많이 쓰이는 프레임워크로 DynamicGraph 방식을 활용해 코드를 좀 더 쉽고 간결할게 작성할 수 있다. 딥러닝 과정에서 수행되는 미분 연산을 자동으로 수행해주고 그 외에도 다양한 모델과 함수를 딥러닝 모델 제작에 이용할 수 있다.

2강

Tensor: 파이토치에서 matrix를 표현할 때 사용하는 클래스
view와 reshape의 차이: view 함수는 텐서의 메모리 주소 값을 가져와서 형태만 변환(기존 텐서의 값 변환 시 생성된 텐서의 값도 함께 변환), reshape 함수는 contiguity(메모리에서 자료 저장 순서가 순서대로인지로 텐서 조작과정에서 변경될 수 있음) 보장이 안 되면 복사해서 새로운 텐서를 만든 후 형태를 변환(이 경우 기존 텐서 값 변환해도 생성된 텐서는 변화 없음)
squeeze, unsqueeze: 각각 차원의 개수를 줄이거나 늘릴 때 사용하는 함수로 차원의 개수가 1인 차원을 삭제하거나 추가
mm, matmul: mm과 matmul 둘 다 행렬 곱 연산을 수행하지만 matmul은 broadcasting을 지원(dot은 벡터의 내적)

3강

PyTorch의 프로젝트 구조: 프로젝트를 배포할 때는 프로젝트 형식을 갖춰야 함(프로젝트 형식을 갖춰야 유지보수, 활용에 용이)
Template: 프로젝트 형식을 갖춰야 할 때 템플릿을 이용하여 모델의 형식을 갖추고 기능에 따라서 모듈들을 분리하고 프로젝트를 구성함

4강

nn.Module: nn.Module은 layer와 forward 메서드를 포함한 클래스로 딥러닝 모델을 구현할 때 사용
Parameter: 모델의 학습 과정에서 결정되는 변수로 예시로는 가중치, 편향 등이 있다.
Parameter와 Tensor의 차이: Parameter로 선언된 값들은 Backward 과정에서 미분을 수행하고 Tensor는 수행하지 않음
Backward 과정: Forward의 결과 값(예측값)과 실제값의 차이(loss)에 대해 미분을 수행하고 해당 값으로 Parameter를 업데이트하는 과정
loss.backward와 optimizer.step: loss.backward 함수를 사용하면 모델의 변수의 기울기를 구하고 그 값을 모델에 저장한다. optimizer에서는 모델의 파라미터를 지정하고 생성하기 때문에 backward 함수에서 구한 기울기 값에 모델을 통해서 접근할 수 있다.

5강

Dataset: 파이토치에서 데이터를 불러와서 학습에 사용하기 위해 준비할 때 사용하는 클래스로 직접 만들어서 사용할 수도 있음, 클래스를 생성할 때 필수적인 요소는 init, len, getitem 3가지로 init은 데이터셋의 형태를 정의해주고, len은 데이터셋의 길이, getitem은 데이터셋의 인덱스 방식을 정의해준다.
DataLoader: Dataset의 데이터를 가져와서 학습에 사용할 수 있는 형태로 만들어주는 클래스로 학습할 데이터를 batch size에 맞춰주거나 순서를 섞어준다거나 하는 등의 다양한 기능이 있음

6강

model.save(): 모델을 저장하는 함수로 모델의 architecture와 parameter를 저장하고 학습 중간마다 모델을 저장해서 가장 성능이 좋은 모델을 사용할 수도 있음
model.load(): 저장된 모델을 불러오는 함수로 모델 전체를 불러올 수도 있고 parameter만 불러올 수도 있음
checkpoint: 학습의 중간결과를 저장하고 확인이 가능
transfer learning: 다른 데이터셋으로 학습된 모델을 현재 데이터로 학습하여 사용하는 것으로 단순히 현재 가지고 있는 데이터만 학습하여 사용하는 것보다 좋은 성능을 보여줌
Freezing: transfer learning 과정에서 pretrained model의 피처를 온전히 유지하기 위해 사용하는 방법으로 freezing된 layer는 학습 중에 파라미터가 변경되지 않습니다.

7강

TensorBoard: 딥러닝의 볼 수 있는 시각화 및 도구를 제공하는 라이브러리로 loss, acc 등의 수치항목을 시각화하거나 그래프의 구조를 보여주는 등 다양한 기능을 제공
Weight & Biases: TensorBoard와 마찬가지로 딥러닝의 학습과정을 볼 수 있는 라이브러리로 하이퍼파라미터 튜닝, 데이터 시각화 등에 사용된다.

8강

병렬 학습의 방식: Model parallel, Data parallel
Model parallel: 모델을 분리하여 학습을 분산하는 방법
Data parallel: 데이터를 분리하여서 학습을 수행한 뒤 평균값을 취하는 방법으로 PyTorch에서는 단순히 데이터를 분리하고 평균을 취하는 DataParallel과 GPU 사용의 균형을 맞추기 위해 각 CPU 별로 process를 생성해 개별 GPU에 할당하는 DistributedDataParallel이 있음

9강

Hyperparameter: Hyperparameter는 모델 학습 과정에 반영되는 값으로 학습 전에 미리 조정하고 예시로는 lr, batch-size 등이 있다.
Hyperparameter Tuning: 모델의 학습 과정에서 Hyperparameter들을 수정해가며 모델의 성능을 향상하는 과정, 결과에 엄청난 영향을 미치지는 않지만 유의미한 결과를 제공할 수도 있음
Ray: 분산&병렬 학습을 위한 라이브러리로 Hyperparameter를 다르게 설정한 여러 학습을 동시에 진행하며 결과 값을 비교해보는 것도 가능

10강

OOM(Out of memoy): 모델 학습 시에 메모리 부족으로 나타나는 오류로 해결방법으로는 Batch-Size 줄이기, empty_cache 등의 함수를 사용하여 메모리 정리하기, process 종료 등의 방법이 있다.
메모리 현황 관측: nvidia-smi나 GPUUtil을 통해 메모리의 현황을 살펴볼 수 있음

학습 후기

2주차에는 PyTorch에 관해서 배우는 시간을 가졌다. 예전 학부 시절에 PyTorch를 활용하여 프로젝트를 진행해본 적이 있었는데도 새롭게 배우는 것이 너무나 많았다. 그 당시에 프로젝트를 진행할 때는 단순히 PyTorch의 모델을 가져와서 활용하고 그 값을 가져다 쓴 것에 불과했었는데 이번 기회를 통해서 PyTorch라는 라이브러리에 다양한 기능들이 있고 나의 필요에 따라 모델을 수정하여 활용할 수 있다는 것을 알게 되었다. 일주일간 공부하기는 했지만, 여전히 내가 아는 부분은 PyTorch라는 빙산에서 일각에 불과하다는 것을 알기 때문에 추후 따로 책을 사서 학습을 하며 계속 공부해야 할 것 같다.

2주차 과제 정리

기본 과제1

기본 과제1에서는 torch의 기본적인 활용법과 공식 문서를 찾아보는 법 등을 배울 수 있었고 중간 중간 코드의 빈칸을 채우는 퀴즈 형식으로 되어있어서 코드의 흐름을 보며 따라가다가 빈자리에 어떤 코드가 들어가야 이 모델을 사용할 수 있을까를 고민해 볼 수 있었습니다. 보안(?) 때문에 자세한 내용을 공유할 수는 없지만, torch에서 행렬을 활용하는 법, 모델을 구성하는 법등을 배울 수 있었고 특히 기억에 남는 내용을 하나 꼽자면 hook과 apply에 대한 내용으로 모델에 hook과 apply를 활용해서 필요한 연산들을 삽입하는 과정이었습니다.

기본 과제2

기본 과제2에서는 Dataset과 DataLoader를 필요에 따라 직접 구현하고, 실제 학습에 활용할 수 있도록 데이터를 가공하는 방법을 배웠습니다. 데이터 간의 크기가 맞지 않을 경우 크기를 맞춰주거나 이미지, 문자 등의 데이터가 들어왔을 때 학습에 사용가능하도록 가공하는 법등을 배웠습니다.

심화 과제

Transfer Learning과 Hyperparameter Tuning을 통해서 모델의 성능을 향상시키는 과정을 수행하였고 Ray를 사용하는 방법을 배웠습니다.

오피스아워 후기

오피스아워 시간에는 조교님들이 기본 과제1, 기본 과제2를 해설해주셨는데 내가 혼자 공부할 때는 미처 신경 쓰지 못하고 넘어갔던 부분들에 대해서 디테일하게 잘 알려주셨고 그런 내용을 들으면서 앞으로는 과제를 할 때 좀 더 자세하게 파고들고 알아봐야겠다는 생각이 들었다.

과제 후기

강의를 들었음에도 과제를 하다 보니 모르는 부분이 매우 많았었는데, 이때 최대한 구글 검색 대신 공식문서를 활용하려고 노력했었다. 이 과정에서 당장 필요한 내용을 빠르게 찾는 것도 중요하지만, 개발자가 되기 위해서는 검색을 어떻게 해야 할지 공부하는 것도 필요하다는 생각이 들었다. 그리고 검색을 할 때 영어를 활용하는 게 좋다는 것을 알고 있으면서도 영어라는 언어에 대한 공포 때문에 자꾸 한글로 검색하게 되는데 논문이나 레퍼런스 문서 등을 보기 위해서는 영어가 필수니 최대한 빨리 영어에 대한 공포를 없애고 영어에 친숙해져야겠다는 생각을 하게 되었다.

Week 2 회고

2주차도 벌써 끝이 나고 있다. 물론 주말이 된다고 나의 한 주가 끝나는 것은 아니지만 부스트캠프는 오늘로 한 주가 마무리된다. 이번 2주차에도 팀원들과의 피어세션, 마스터클래스, 멘토링 등의 활동을 하였고 그 과정에서 많은 것들을 배울 수 있었다. 피어세션 시간에는 내가 무심코 지나쳤던 부분을 팀원들의 이야기를 듣고 다시 한 번 생각해보며 공부를 하게 되었고 마스터클래스에서는 엔지니어로서 어떻게 공부를 해야 하고 어떤 목표를 가져야 하는지 배울 수 있었으며 멘토링 시간에는 논문을 읽고 정리하는 방법을 배웠다. 아직 시작한 지 2주밖에 되지 않았지만 벌써 꽤 많은 것들을 배우게 된 것 같고 앞으로도 계속해서 배우면서 성장해 나가고 싶다.

profile
INTP 개발자 지망생

0개의 댓글