2022 Lablup Autumn Internship 후기 / 회고

인턴십 회고

Posted by jopemachine on January 2, 2023 Updated on March 06, 2023

Lablup Internship

처음엔 오픈소스에 막연히 흥미를 갖게 되어 작은 자바스크립트 기반 모듈들을 디버깅해보면서 간단한 기능을 구현하거나 버그를 고치는 경험을 통해 오픈소스 컨트리뷰션을 시작하게 되었다. 몇 개월이 지난 후 좀 더 큰 규모의 오픈소스 프로젝트에 긴 시간에 걸쳐 지속적인 컨트리뷰션을 경험해보고 싶다는 생각으로 오픈소스 컨트리뷰톤 RustPython 팀 멘티로 참가해 활동해 보게 되었다.

그리고 너무나 감사하게도 OSSCA 프로그램을 통해 Lablup에서의 2개월 간의 인턴십 또한 진행해보게 되었다 💖.

이 포스팅에선 지난 두 달 동안의 인턴십에서 어떤 일을 맡아 진행해보았고, 이 과정에서 어떤 점들을 배우게 되었는지, 어떤 점들이 가장 매력적으로 느껴졌는지 등에 대해 적어 보려고 한다.

인턴십 지원 동기

개인적으로 Lablup에서 오픈 소스와 개발자 커뮤니티들에 지속적으로 관심을 갖고 참여하고 있다는 점이 매력적으로 느껴졌다. (예를 들어 Backend.ai는 몇 년째 오픈소스 컨트리뷰션 아카데미에 참여해왔다.)

그리고 새로운 기술 스택을 배워보고 싶다는 점도 있었다. 이전 실무에선 (비록 짧은 시간이지만) 자바스크립트로 앱, 웹을 만드는 등 프론트 업무를 주로 했었는데 백엔드와 인프라 등 다른 필드의 업무도 진행해보면서 앞으로의 진로 방향에 대해 좀 더 고민해보고 싶다는 점도 지원 동기에 영향을 끼쳤다.

기술 면접

면접 때는 내가 어떤 프로젝트를 했는지, 앞으로 어떻게 커리어를 쌓아 나가려고 생각하고 있는지, Lablup에서 인턴을 하게 된다면 가장 하고 싶은 일이 뭔지 등에 대해 물어보셨다. 내가 프론트 위주로 프로젝트들을 진행해왔기 때문에 기술적인 부분들은 프론트 분야를 중심으로 물어보셨고 백엔드, 데브옵스, AI 등의 분야에 대한 기술적 질문은 전혀 하지 않으셨다.

Lablup 면접을 준비한다면 본인이 프로젝트에서 사용했었던 기술의 세부사항에 대해 얼마나 깊게 알고 있는지, 왜 그 기술을 선택했는지 등을 위주로 준비한다면 좋은 결과가 있지 않을까 싶다.

업무 회고

1 주차 - 비동기 채팅 서비스 구현 과제 할당

1주차엔 우선 Backend.AI의 기능 구현에 들어가기 전 과제를 할당 받아 진행하게 되었다. 과제는 asyncio, aiohttp 등을 공부하며 multi-user, single-room chatting 구조의 채팅 기능을 구현해 보는 것이었다. 사실 이전에도 채팅 기능을 구현해 본 경험이 몇 번 있어서 어렵지 않게 구현할 수 있었으나, 항상 자바스크립트 풀스택으로 작성했었던 것과 달리 이번엔 백엔드를 파이썬으로 작성해야 해서 파이썬의 비동기 처리에 대해 공부하면서 진행했다. FlaskDjango 등의 프레임 워크와 관련된 미들웨어들의 도움 없이 유저 세션 유지 등의 기능을 직접 구현해보고 싶어 이전엔 라이브러리들의 도움으로 쉽게 처리할 수 있었던 부분들에 대해 약간 더 생각해보는 시간을 갖기도 했다.

프론트 관련된 작업은 해당 과제의 학습 목표와 거리가 멀었기 때문에, 개인적으로 제일 익숙한 create-react-app을 사용해 간단하게 작성하고 넘어갔고 백엔드엔 aiohttp, redis, mongodb 등을 사용해 구현했다. 채팅방 구현에는 socket-ioAsyncNamespace를 상속해 사용했으며 과제 특성 상 하나의 네임스페이스에 하나의 룸을 대응시키는 방식으로 간단하게 작성 가능했다.

로그인 기능은 redis에 세션을 유지하는 방식을 통해 구현했다. aiohttp의 각 라우팅 핸들러들에 대해 authenticated란 이름의 세션을 검사하는 데코레이터를 구현해 signout 핸들러 등 인증이 필요한 라우팅 핸들러들에 적용해주었다.

이번 과제에서 처음으로 docker-compose를 통해 한 번에 React, Redis, Mongodb, aiohttp 웹 서버를 모두 작동시키는 식으로 구현해 보았는데 docker-compose를 앞으로 좀 더 잘 활용할 수 있게 된다면 개발할 때 상당히 편리하게 사용할 수 있을 것 같다는 인상을 받았다.

결론적으로 진행한 과제는 대략적으로 아래와 같은 구조를 갖게 되었다.

과제를 진행한 후엔 작성한 코드에 대해 검토 받는 시간을 가질 수 있었다.

단지 과제를 진행하는 것으로 끝내는 것이 아니라 직접 시니어 개발자 분께서 코드를 들여다 보시고 어떤 코드는 어떤 문제점이 있고 어떤 잠재적인 문제들이 발생할 수 있는지 꼼꼼히 설명해 주셔서 혼자 공부하는 것에서 끝나지 않고 평소와 다른 관점, 세부사항들에 대해 생각해 볼 수 있는 좋은 기회가 된 것 같다.

2 주차 - Backend.AI 개발 환경 구축

2주차엔 Backend.ai의 개발 환경을 구축하며 보냈다. 개발은 필자가 기존에 사용 중이던 m1 맥북 에어로 진행했는데 생각보다 Backend.ai 개발 환경 구축에서 많은 어려움을 겪었다.

레포지토리가 pants를 사용해 많은 서비스들을 하나의 레포지토리로 담는 모노 레포지토리 형식으로 구성되어 있었는데 pants의 여러 명령어들이 모두 처음 보는 명령어들이라 좀 더 난항을 겪었다.

3 주차 - Backend.AI 기능 추가 - session show-graph 명령어 추가

3주차엔 드디어 Backend.ai의 첫 이슈를 할당 받아 진행해 볼 수 있었다! 내 Lablup에서의 첫 이슈는 세션들간의 의존성을 트리 형태로 출력하는 명령어 (session show-graph)를 추가하는 작업이었다.

1주차에 진행했었던 과제에서 asyncio, aiohttp, 파이썬 비동기 처리 등에 대해 공부하고 사용해 보았던 것이 큰 도움이 되었다.

서로 의존성을 갖는 연산 세션들의 그래프를 생성하기 위해, Backend.ai FastTrack 개발 환경을 따로 구축하고 Backend.ai와 연동하여 세션들 간의 파이프라인을 생성해야 했는데, 처음엔 FastTrack 역시 개발 환경 구축이 꽤 어렵게 느껴져 난항을 겪었었다.

그래도 직원 분들께서 세세하게 잘 알려주신 덕분에 무사히 이 과정을 넘길 수 있었고, 3주차 마지막 즈음에 드디어 첫 PR을 생성해 볼 수 있었다 🎉.

이번 주차에 추가한 명령어인 show-graph는 기본적으로 트리 형태로 연산 세션들의 그래프를 만들어 출력하지만 --table 플래그를 넣으면 중복되는 세션 없이 가장 먼저 실행되는 세션에서 나중에 실행되는 세션 순으로 테이블 형태로 만들어 출력하게 된다.

4 주차 - Backend.AI 기능 추가 - session rm 명령어 recursive 옵션 추가

두 번째 이슈도 비슷한 종류의 이슈로 session rm 명령어에 --recursive 옵션을 추가하는 작업이었다.

연산 세션이 종료 될 때 해당 세션의 자식 세션들은 더 이상 실행될 수 없는 상태에 놓이게 되고, 스케줄러는 해당 세션들의 상태를 불필요하게 계속해서 체크하면서 리소스를 낭비하게 된다.

그래서 특정 세션을 종료할 때 해당 세션의 자식 세션들을 재귀적으로 함께 종료 시킬도록 만드는 옵션이 필요했다.

이번 이슈의 경우 이미 이전 이슈에서 개발 환경 구축 및 연동이 끝난 상태였기 때문에 이전 이슈에 비해 쉽게 진행할 수 있었다.

5 주차 - Backend.AI MLPerf maskrcnn 벤치마킹 측정

5주차 때는 데이터 다루는 잡을 한 번 맡아 진행해 보고 싶다고 말씀드렸더니 관련된 태스크를 배정받을 수 있었다. Backend.ai 플랫폼의 MLPerf 2.1 벤치마크를 측정을 도와드리는 작업이었다.

MLPerf란 컴퓨터 비전, 의료 이미징, 추천 시스템, 음성 인식 및 자연어 처리 등을 포함한 광범위한 워크로드에 걸쳐 AI 성능을 측정하기 위해 확립된 대표적인 업계 벤치마크이다.

MLPerf 2.1의 8개의 측정 지표들 중 Object detection 벤치마크에 대해 진행했고 maskrcnn을 Backend.AI에서 실행해 출력된 로그 파일들을 전달해주셨다.

해당 트레이닝 로그를 파싱해 pandas, seaborn 라이브러리를 사용해 plotting 해 보았다.

짜투리 시간에 조금씩 pandas를 공부해 두었던 게 큰 도움이 되었고, 지금 껏 코드로만 접했던 Backend.ai라는 플랫폼을 클라우드를 통해 유저 입장에서 직접 사용해보며 Backend.ai에 좀 더 많은 실질적인 기여들을 해 보고 싶다고 느끼게 되었다 🔥🔥🔥.

6 주차 - Backend.AI Jail 디버깅 삽질 / 경험기

6주차엔 Backend.AI Jail 디버깅 및 설정 파일 업데이트 자동화 작업을 진행해보았다.

이 부분에 대한 경험은 개인적으로 가장 생소했던 분야의 경험이어서 글이 계속 길어지다보니 다른 포스팅으로 따로 작성했다.

7 주차 - 분산 시스템 관련 이슈 배정

7주차엔 분산 처리 관련 이슈를 배정 받아 진행해보게 되었다.

하지만 필자가 기존에 분산 시스템에 대해 갖고 있었던 피상적인 지식만으로는 Leader election-based distributed timer and image rescan rate limiting라는 굉장히 길고 복잡해 보이는 이름의 이슈에 어떻게 접근해야 할지는 커녕, 이 문제가 어떤 성격의 이슈인지조차 전혀 감을 잡지 못했다 😱.

그래서 Lablup에서 작성하던 aioraft-ng라는 python 기반의 Raft 구현체가 상세한 측면에서 아직 미구현된 부분들이 많았기 때문에 이 부분들을 직접 구현해보며 기여를 시작해보면 좋을 것 같다고 생각하게 되었다.

하지만 그래도 분산 처리에 관련된 배경 지식이 너무 얕고 피상적이었기 때문에 우선 여러 서적이나 자료들을 찾아보며 분산 시스템에 대한 공부에 전념했다.

8 주차 - Raft 논문 번역 및 스터디

aioraft-ng에 기여하기 위해선, Raft의 작동 방식에 관해 정확하게 이해할 필요가 있다고 판단해 Raft 논문을 번역해 해당 번역 포스팅을 작성해보았다.

문서 번역이나 개발 경험, 팁등의 글들은 공부 목적으로 여러 번 작성해보았지만 논문을 번역해보는 것은 이번이 처음이었는데 역시 양도 많고 쉽지 않은 일이었다. 처음 부터 끝까지 여러 번 살펴보고 다른 포스팅들도 찾아보면서 완전히 잘못된 내용으로 번역한 문장도 2개 이상 있었고 뉘앙스가 이상하게 번역된 문장들도 많아서 제대로 작성하기 위해 노력했다. (그럼에도 불구하고 여전히 오역이나 어색한 문장들이 있을 수 있을 것 같다.) Raft 논문 스터디 외에도 Backend.AI 이슈 해결을 위해 여전히 분산 시스템에 관련된 공부가 필요해 공부에 전념하는 시간을 가졌다.

해당 포스팅을 작성하고 난 후에야 Backend.AI의 이슈가 어떤 성격의 이슈인지 이제야 비로소 조금 알 것 같다고 느끼게 되었다.

9 주차 - gopy를 사용한 파이썬 바인딩 작성 시도

Raft 구현에 관련된 논문은 250 페이지가 넘고, 심지어 아직도 하시코프 사의 Raft 구현체도 꾸준히 개발, 변경되고 있는 것을 보면서 aioraft-ng를 계속 개발하는 것이 정답이 아닐 수 있을 것 같다고 느꼈다.

결론적으로, gopy를 사용해 파이썬 바인딩을 작성해 하시코프 사의 Raft 구현체를 플랫폼 별로 shared object로의 컴파일 함으로써 통해 python에서도 이용할 수 있도록 만드는 게 앞으로의 유지 보수 비용을 최대로 절감하는 방법이 될 수 있지 않을까 생각했다. (안타깝게도 아직까지는 shared object로의 크로스 컴파일은 GOOS, GOARCH 등의 환경 변수를 적당히 변경하는 것만으로는 간단히 작동되지 않는 것 같았다.)

그리고 gopy로 작성한 바인딩에서 채널 같은 파이썬에서 표현하기 힘든 일부 타입을 포함하는 함수들은 모두 컴파일 과정에서 제외되었기 때문에 Raft를 바로 파이썬 바인딩으로 변환하는 것이 아니라, 우선 go 언어로 추상화 계층을 작성한 후 바인딩으로 변환할 필요가 있다고 판단했다. (이 과정에서 분산 처리에 자주 사용되는 go 언어 라이브러리들을 활용할 수 있게 될 것이라는 점도 매력적으로 느껴졌다.)

결과적으로 gopy를 이용해 다양한 시도를 해 보았으나 raft에서 비동기 처리를 위해 사용하고 있는 Future 타입 관련된 처리를 파이썬에서 따로 또 구현하는 게 적절하지 못하다고 판단해 다른 방향으로 좀 더 조사, 공부가 필요할 것 같다고 판단하게 되었다.

이 부분에 대한 내용은 인턴십 기간이 끝나고 나서도 보고 있는 부분이라 다른 글에서 다시 정리해볼 예정이다.

느낀 점

이번 인턴십에선 기여해보고 싶은 분야의 다양한 성격의 업무를 진행해보며 내 스스로가 앞으로 어떤 일을 공부하고 개발해보고 싶은지 고민해 보면서 고민을 바탕으로 오픈소스 기여까지 진행해 볼 수 있었던 개인적으로 굉장히 뜻 깊은 시간이 되었다고 생각한다.

2개월이란 비교적 짧은 기간에도 불구하고 다른 스타트업들에서 일했던 경험에 비해, Lablup에서의 인턴십에서 훨씬 많은 것들을 배울 수 있었고 경험할 수 있었다. 일반적인 스타트업들과 다르게 개발자 중심의 문화와 Lablup의 팀원들의 능력을 신뢰하고 성장을 격려해주는 문화 덕분에 가능한 일이었다고 생각한다.

오픈소스 프로젝트나 커뮤니티 참여에 관심이 있는 분들, 본인이 일하고 싶은 분야를 찾아 앞으로의 커리어를 결정하고 싶거나, 기술에 대한 이해도를 깊게 쌓아보고 싶은 분들 모두에게 Lablup 인턴십은 최고의 선택이 될 수 있을 것이라고 생각한다 👍.