잡담.
자주 듣는 얘기가 있다. 어떤 일이 A, B, C, …, Z 이렇게 순차적으로 이뤄진다고 할 때, 나는 A 설명했다가, B, C, ..,D까지 스킵하고는 E를 설명했다가, F를 한참 설명하다, 다시 B가 필요해진 것 같아 B를 설명하는 식이라고 한다. 한두 명만 이런 얘기를 하는 게 아니라, 나랑 가깝게 일을 한 모두가 비슷한 얘기를 하는 걸로 봐선, 좀 문제가 있는 것 같다.
상대방과 내가 같은 지식과 한계를 갖고 있을 것이라는 전제를 갖고 설명하는 듯한 느낌이다. 내가 쉬운 부분은 상대한테도 쉽고, 내가 어려운 부분은 상대방도 어렵고. 사회적 관계에서만이 아니라 일에서도 공감능력은 중요한 것 같다. 게다가 이런 건 노력해도 잘 나아지지 않는다고 한다……..
오픈 소스에 대한 개인적인 생각
솔직히 자기과시욕을 제외하면, 오픈소스를 왜 하는 이유를 잘 모르겠다. 회사 입장에서는 더더욱 잘 모르겠다. 구글이 왜 오픈 소스를 하는가같은 글을 여러 개 읽어봐도 잘 이해가 가지 않는다. 그럼에도 내가 정말 정말 가끔씩, 오픈소스를 하는 이유는 다음과 같다. 멋있어 보여서도 사실 크지만, 그걸 제외
내가 생각하는 오픈소스의 장점
1. 공부 & (경력이 적은 사람의) 포트폴리오를 대신함.
토이 프로젝트를 만들어서 포트폴리오로 사용하는 사람들이 많다. 나도 예전엔 그랬었는데 요즘은 잘 하지 않는다. 무엇인가를 배울 때엔 작은 규모의 프로젝트가 도움이 많이 되는 것은 맞다. 다만, 그런 프로젝트의 가장 큰 문제는 경험이 없으면 쓸모 있는 프로젝트를 하는 것이 불가능하다는 점이다. 첫 번째로, 나같이 창의력 없는 4차 산업혁명엔 전혀 맞지 않는 사람에게는 좋은 주제를 잡는 것이 실제 프로젝트 내용보다 더 어려울 수도 있다. 일을 하는 도중에 누군가에게 피드백을 받기도 힘들다. 경험이 많은 사람의 경우 그런 피드백이 없어도 성공적으로 무언가를 만들어낼 수 있다고 생각하지만, 나 같은 신입 찌랭이 프로그래머에게는 힘들 것 같다. 오픈소스 활동은 이 부분에서 포트폴리오용 프로젝트보다 유리한 점을 많이 갖고 있다. 거인의 어깨 위에서 일을 시작할 수 있다는 점이다. 창의성 없어도, 자신의 프로그래밍 스킬을 발휘할 수 있으며, 이를 타인에게 보여주고 리뷰도 받을 수 있다. pytorch 코드 내에 FIXME로 검색한 결과이다. 저 중 몇 개는 분명 그리 어렵지 않을 것이고, 초보 프로그래머도 기여를 할 수 있을 것이다.
사실, 더 중요한건 내가 한 일에 대해 리뷰를 받을 수 있다는 점이다. 협업 경험이 적은 나 같은 초보자에게는 가장 간절한 부분이다. 나보다 경험이 많은 사람에게 내 코드롤 보여주고, 아이디어를 교환하는 과정은 대학교에서 배우지 못했다. 내 주변 학생들은 나보다 실력이 압도적으로 뛰어나지 않았고, 그렇게 해줄 수 있는 교수나 선배들은 정말 바빴다. 사실 내가 씹아싸라 친구가 없어서 그랬을지도 모르겠다…
2. 꼬우면 내가 하지
(내가 기계학습을 공부하고 있어서 다른 분야는 어떤지 모르겠다). 텐서플로우던, 파이토치던 그다지 완벽하지 않다. 이를 만든 사람들이 훌륭하지 않아서가 아니라, 훌륭함에도 불구하고. 암튼, Tensorflow에서 어떤 함수의 Gradient가 정의되지 않았다는 에러를 마주쳤을 땐 적당히 미분을 해서 그 식을 구현해서 처리할 수 있을 것이다. 단점은, 내가 잘 모르는 분야에 대해서는 (VS Code에서 기능상 한계를 찾았는데, 난 Electron은커녕 javascript도 해본 적이 없다면?) 아무 의미가 없다는 점이다.
기능이 없어서 안될 때
Example
암튼 내가 생각하는 오픈 소스의 장점 두 가지를 얘기했으니, 실제 예시를 통해 정말 이런 장점이 존재하는지, 그리고 초보 프로그래머에게 어떤 도움이 되는지 살펴보자. 초보라는 딱지를 굳이 붙인 이유는 내가 초보라서 그렇다.
문제 발견
위의 (2)와 같은 상황이었다. Deep generative ranking for personalized recommendation 논문을 재현하려고 했었다. 논문에서 (내 생각에) 가장 큰 컨트리뷰션은 user-item preferences를 Beta distribution으로 생각하고, 이 분포 자체를 sampling하여 학습하자는 아이디어인 것 같다. 암튼,일반적인 Normal distribution과는 다르게, Beta distributinon의 sampling을 이용한 분포 업데이트는 조금 까다로웠고, 감마함수의 n차 도함수(Polygamma function)을 필요로 했다. 근데 PyTorch에서는 감마 함수의 N’th order derivative를 구현해놓지 않고 있었다(order of 1까지 구현되어 있었음).
해야 하는 일을 정의하기.
암튼, 텐서플로우에선 이게 이미 구현되어 있다는 것을 곧 찾아냈고, Scipy에서도 같은 기능을 제공한다는 사실을 알아냈다. 저 두 구현체 모두, cephes
(https://www.netlib.org/cephes/)라는 라이브러리의 Copy-Paste라는 사실도.
또한 파이토치의 많은 부분이 Cephes로 되어 있다는 사실도 알아냈다. 그럼, 내가 할 일은 Polygamma를 Scratch부터 구현하는 것이 아니라, 적당히 Cephes 코드를 고치는 것이라는 생각이 들었다. 딱히 Polygamma에 대한 내용을 이해할 필요도 없는 간단한 일이었다.
가장 좋았던 건, Polygamma에 대한 Interface가 모두 만들어져 있었다는 점이다. n=1인 경우를 제외하면 NotImplementedError를 던지게 되어 있었다.
구현하기 & PR 날리기
이 부분은 간단했다. C로 되어있는 library를, template을 이용한 함수로 바꾸고, 몇몇 interface용 함수들을 구현했다. 조금 복잡했던 부분은 Cuda 구현이었다. 다행히도 그 파일 내에 같이 구현된 다른 코드들을 대충 봐 가면서 거의 복붙을 했는데 별 이상한 점이 없었다.
공부가 된 건데, 내가 생각하는 거보다 테스트/의사결정/코드에 대한 기준이 엄청 높았다. 사실 여느 회사에서도 다들 이렇게 하는 것 같지만.
코드 리뷰 중 일부.
아마 코딩을 세상에서 가장 잘 하는 그룹 중 하나(사실 확실하진 않다)의 사람에게 코드 리뷰를 받는 경험은 어찌 됐건 도움이 되는 것 같다. 매일매일 이 정도 텐션을 갖고 프로그래밍을 대했다면, 더 잘 하는 엔지니어가 되어 있었을 텐데, 허비한 시간이 아깝다.
결론(배운 점)
- 공부 & 포트폴리오를 대신함
PyTorch 개발진이 사용하는 Python 규칙에 대해 어느정도 이해한 것 같기도 하고 아닌 것 같기도 하고. 딥러닝이니, 강화 학습이니 하는 Fancy한 단어들 뒤에는, 사실 80년대 물리학과/수학과/전산학과 대학원생이 마감에 쫓겨가며 만든 Fortran/C 코드가 숨어있다는 사실을 깨닫게 되었다.
- 꼬우면 내가 하지
감마 함수를 PR한 뒤 머지되기 전에, 결국 처음 구현하려고 했던 논문을 파이토치로 구현했다. 생각보다 성능이 나오지 않는다는 사실을 깨닫고, 시간을 많이 허비했구나 하는 생각이 들었지만, 뭐, 이거 하면서 많이 배웠으니 그걸로 괜찮겠지 하는 생각이었다.
사실 남는 건 자기과시 뿐…
사실, 위에서 쭉 얘기했던 모든 장점을 제외하더라도 가끔 하면 재밌는 짓이라서 ‘ㅅ’…