이번 달에 주력으로 하게 된 일은
이정도가 될 것 같다.
연산량 계산은 처음 해봐서, ptflops와 thop 라이브러리를 사용해봤다.
두 라이브러리는 우리한테 익숙한 FLOPs 대신 MACs 단위를 사용한다.
FLOPs: FLoating point OPerations
MACs: Multiply-ACcumulate
FLOPs는 덧셈 or 곱셈 연산 각각을 하나의 연산으로 보고,
MACs는 <덧셈+곱셈>을 묶어서 하나의 연산으로 본다.
따라서, 일반적으로 FLOPs는 MACs의 두 배 정도가 된다.
참고
두 라이브러리 모두 연산량 산출 결과는 비슷비슷 한데, 출력이 예쁘게 되는건 ptflops였다.
다만, 두 라이브러리는 nn.Modules를 상속하는 연산들에 대해서만 연산량 계산이 가능하다. 내가 보고있는 모델에는 matmul 연산이 포함되어 있는데, 이 연산은 라이브러리에서 지원하는 계산에 포함되지 않아서 결국은 내 손으로 직접 했어야 했다. (ㅋㅋ)
https://machinethink.net/blog/how-fast-is-my-model/
위 링크 보고 생각해보면서 계산했다.
convolution 연산량을 계산할 때, W_out, H_out를 이용해야 하는데 수많은 convolution의 연산 output을 어찌 계산하고 앉아있겠는가... 그래서 torchinfo 라이브러리를 사용해 각 연산별 output size를 참고했다! 참고로 torchinfo 라이브러리는, 모두가 한번쯤은 들어봤을 torchsummary 라이브러리를 계승(?)하는 라이브러리다. torchsummary는 이제 더이상 유지보수가 되지 않는 것 같다. (아닐수도있음!) torchinfo에도 맨 아래에 MACs가 산출되어 나오긴 하는데, issue 페이지를 살펴보면 100% 정확하진 않다고 하니 참고하자.
아무튼, 그동안은 내가 모델을 직접 구현해볼 일도 없었고 앵간한 모델들은 남들이 구해둔 연산량이나 모델 크기가 조금만 찾아봐도 나왔기 때문에 연산량 산출 방식에 대해 깊게 고민해보거나, 모델 내부 어디에서 오버헤드가 생길런지 잘 생각해보지 않았었다.
그런데 이 작업을 해보면서, 어느 부분에서 확연한 오버헤드가 발생하는지, 어떻게 해결해볼 수 있을지를 생각/실행해볼 수 있었다. 여태 모델 성능 올리기는 하이퍼파라미터 만지기, 데이터 만지기로만 해봤어서 '이제 이 모델을 어떻게 발전시키지..?'라는 생각에 살짝 멍해졌었는데 모델 구조 자체를 조금씩 손볼 생각을 하니 너무 설렜다... ㅋㅋ
현업에서는 모델 평가에 있어서 성능 뿐만 아니라 연산량도 정말 중요한 지표이다. 인턴으로서 모델 연산량 산출이라는 큰 작업을 해봤다는게 대견하기도 하고... 일 시켜주신 선배님께도 감사하고... 암튼 AI 엔지니어라면 꼭!! 갖춰야 할 스킬을 갖게 된 것 같아서 아주 뿌듯했다! 내 가 해 냄 !
요정도를 바꿔가면서 학습 양상을 봤다.
cosingwarmannealing을 쓰면 일반적으로 학습이 더 잘 된다는... 내 경험과 여기저기서 주워들은 말들을 토대로 적용해봤는데, 역시나 만능은 없다는걸 깨달았다! 파라미터를 조금만 바꿔도 결과가 훅훅 바뀌어서, 역시 딥러닝은 그때그때 달라요~ 라는걸 다시 한 번 느꼈다. 암튼 이건 아직 진행중이다. 가장 신기했던건, 똑같이 1/2 downsampling인데도 kernel size/stride/padding을 어떻게 조합하느냐에 따라 성능 변화가 꽤 컸던 것! 암튼 그랬슈.
Text 기반으로 한 회의/일상 대화 classification project 진행.
BERTviz 사용해서 학습된 모델의 attention 시각화.
- 모델: koBERT
- 데이터: AIhub 회의 담화/한국어 담화 text
내가 맡은 일
NLP task 경험이 없어서 BERT 모델이나 attention이라는 개념 자체를 완벽히 이해하지 못한 채로 프로젝트를 진행했다. 시간이 많았다면 공부랑 병행하면서 했겠는데... 그게 아쉽다. 그리고 학습 환경이 너무 열악했다. 그래서 그냥 딱 학교 과제 끝내는 수준으로만 우다다 마무리했다... ㅜㅜ
이걸.. 내가 해냈다..
(채점 기준을 모두 충족 && 구현에 크게 어려움이 없음 && 그렇다고 쉬워보이지는 않아야 함) 이 true가 되는 주제를 고르느라 시간을 많이 버렸다...^^
결론적으로는! 날짜별 TODO list를 관리할 수 있는 앱을 만들어봤다.
구경해보세요^.^
내가 구현하고 싶은 기능들을 만들라다보니, 배운적도 없는 RecyclerView와 gesture를 다뤄야 했다.
내가 원하는대로 잘 처리가 안돼서 너무너무너무 답답했는데, 그래도 구글신&유튜브신&디버깅신의 도움으로 어찌저찌.. 해냈다.
퇴근하고 집에 오면 바로 책상에 앉아서 자기 전까지 앱개발 하다가 자는걸 2주정도 반복했는데, 사람이 할 짓이 아니었다... ㅜㅜ 결과가 눈에 바로바로 보이니까 뿌듯하긴 한데 쉴 시간이 없는게 정신적으로 너무 힘들었다. 징징징징....
매일 징징대고 가끔은 질질짰는데 강민이가 토닥토닥 해주고 많이 챙겨줘서 잘 지나간 것 같다..
조교님께서 demo하는 날 코드를 보시더니 오~라고 하셔서 굉장히 뿌듯했다. 그 오~가 어떤 의미인지 모르겠지만.. 암튼 뿌듯했삼.. 이러고 B+나오면 그냥 자퇴해야겠다~^^
아무튼지간에. 백엔드 다뤄본 경험이 거의 없어서 내가 이걸 어케하지 싶었는데 꽤 재미있는 경험이었다. 성취감이 엄청났다 ㅋㅋㅋ 근데 기능적인 면에서 조금씩 수정할 일이 생길 때, DB 구조도 다시 생각해봐야 하는게 좀 귀찮았다.
암튼,,, 즐거운 경험이었다! 만나서 반가웠고 다신 ... ㅎ
연구실 학부 인턴 면접을 보고 합격했다...ㅋㅋㅋ 7월부터 근무하게 될 것 같다.
지난 달에만 해도 내 인생~ 흐름에 맡겨야지~ 했는데 이렇게 되었습니다. 어디로 튈지 모르는 내 인생 아주 재밌다
여태까지 해본건 남들이 만들어놓은거 잘 활용하기~ 였다면, 이제부터는 더 깊게 들어가서 그 "남들이 만들어놓은거"를 만드는 사람이 되어야 한다!
부캠 끝나고 내가 엄청나게 엄청난 사람이 된 착각을 하고 있었는데, 회사에서 일하면서 세상은 넓고 내가 채워야할 부분들이 많이 있는걸 또 한번 깨달았다. 연구실 인턴으로 근무하기 전&후로 cs231 강의나 과제들 한번 보면서 기초를 더 탄탄하게 할 예정이다.
나 너무너무 고생했다!!! 영원히 안끝날 것 같던 1학기도 끝났다. 6월은 조금 릴랙스하고 나 자신에 더 집중할 수 있길!
이만 밥먹으러 가야해서 여기까지만 쓰고 더 쓸 말이 생각나면 추가하겠숨!