ChatGPT 활용 AI 경진대회 월간 데이콘

알고리즘 | ChatGPT | 프롬프트 엔지니어링 | 언어 | 분류 | Macro F1 Score

  • moneyIcon 상금 : 인증서
  • 1,203명 마감

 

자꾸 Out of Memory가 뜨는데...

2023.03.28 17:58 1,453 조회

제가 Text는 또 첨 만져봐서 그러는데요.


전처리, 토큰화, pad_sequences를 진행하고 나면 차원수가 엄청 많아지는데...

뭘 잘 못 적용해서일까요?? 아니면 차원 수를 줄이는 법이 따로 있나요?




로그인이 필요합니다
0 / 1000
kanghyun3130
2023.03.29 20:11

저도 인공지능이 완전 처음이라,
맨 바닥에 헤딩 하면서 알게 된 거 몇 가지만 말하고 고수 분들의 답변 기다려 보겠습니다.
1. 토큰화 할때 최대 길이를 적당하게 설정 해야 합니다.
2. 학습을 돌릴때 적당한 배치 사이즈로 나줘서 학습을 시켜줘야 해요
3. pytorch를 쓰고 계시다면 validate나 predict 돌리는 코드를 with torch.no_grad() 로 감싸주지 않으면 메모리가 터지기도 하더라구요. (수정: 이건 필수에요!)
도움을 드리기엔 제가 부족하지만 누군가에게라도 도움이 되길 바라면서 써봅니다

kimmmy
2023.03.29 09:10

답변 감사합니다! gpt한테 이것저것 첨부터 다시 물어봐야겠어요 ㅎㅎ

chanmuzi
2023.03.29 18:37

저도 완전 초보지만 지금까지 경험 토대로 말씀드리면, 메모리에 가장 큰 영향을 주는 것은 batch_size와 입력 토큰의 max_length입니다.
이는 직접 테스트하며 비교하는 것이 좋은데요, 만약 코랩이라고 하면 우측 상단의 메모리 관련 탭을 클릭하여 몇 퍼센트의 메모리가 할당되고 있는지 알 수 있습니다.
주로 base 모델은 8~16 배치, large 모델은 4~8 배치가 무료 코랩 환경에서 적당할 거에요.
이것도 역시 token의 max_length가 256이냐 512냐에 따라 다릅니다.
만약 길이에 따른 모델의 예측 결과가 큰 차이가 없다면 max_len을 256으로 가져가되 배치를 키워보는 전략도 생각해볼 수 있겠죠!

이전에 답변 올리신 분의 내용 중에 3번은 반드시 포함해야 하는 것입니다.
validation과 predict에서는 가중치가 업데이트되면 안되니까요.

또한 메모리 관리를 위해 gc.collect나 del 함수를 사용하는 방법 등이 있는데 보통은 train/validation이 시작하기 전후로 한 번 해주는게 기본인데요, 추가적인 자료를 찾아보시면 좋을 것 같네요.

전처리, 메모리 관리에 대한 짧은 추천글을 올려볼 예정이니 참고하셔도 좋겠습니다!

kanghyun3130
2023.03.29 20:03

아 3번은 무조건 해줘야 모델이 영향을 안 받는 거군요!
적용 안 했을 때마다 메모리 에러 발생이 오히려 배움의 기회가 됐네요 ㅎ

chanmuzi
2023.03.29 20:14

사실 optimizer.step() 등을 실행하지 않으면 업데이트되지는 않겠지만 안전장치 개념으로 이해해도 좋을 것 같아요.
그래서 다들 with torch.no_grad() 로 감싸주고도 model.eval() 을 또 해주고.. 등등
관습적으로 train epoch에서는 model.train(), valid epoch에서는 with torch.no_grad() + model.valid() 를 실행시키더라구요!
각각 기능에 대해서는 직접 구글링해보시는 것도 추천드립니다 ㅎㅎ

kanghyun3130
2023.03.29 20:41

말하자면, 모델이 train 모드와 validation 모드가 따로 있다는거죠?
기초도 잘 모르고 쓰고 있었네요 ㅠ

chanmuzi
2023.03.29 21:10

네네 맞아요
https://rabo0313.tistory.com/entry/Pytorch-modeltrain-modeleval-의미
이거 링크 보시면 train / valid(또는 test) 기능이 구분된다는 포스팅이에요!
예를 들면 dropout (각 layer의 일부 노드를 학습에서 제외)같은 것도 train때는 default로 설정된 비율이 반영되는데요,
모델의 성능을 평가하는 validation과 test 과정에서는 '일정한 결과물'이 나올 수 있도록 dropout이 적용되면 안됩니다!
그런 여러가지 기능들을 한꺼번에 컨트롤할 수 있는게 model.train() 과 model.eval() 이죠.

kanghyun3130
2023.03.29 22:16

아하!
이해하기 쉽게 잘 알려주시네요 ㅎㅎ
제 멘토 되실 생각 없으신가요 ㅋㅋㅎ

chanmuzi
2023.03.29 22:57

앜ㅋㅋ 저도 완전 초짜라서.. 같이 공부하면서 대회 참여하는 입장은 좋습니다 ㅎㅎ

kimmmy
2023.03.30 09:28

감사합니다~!