소프트웨어 전문지 마이크로소프트웨어 395호는 데이터과학을 주제로 담았습니다. 데이터과학에 대한 개론, 학습 방법, 실무 적용 사례, 학계 등 마소 395호 주요 기사들을 IT조선 독자에게도 소개합니다. [편집자주]

인공지능이나 딥러닝에 관심 갖는 사람에게 텐서플로(TensorFlow)는 잘 알려져 있다. 하지만 텐서플로는 좋은 성능과 확장성을 가지고 있지만, 자유자재로 다루기까지는 큰 노력이 필요하다. 사용자의 접근성을 높이기 위해 텐서플로는 슬림(Slim), 레이어(Layers), 케라스(Keras) 등 사용자 편의 위주의 고수준 API를 제공하고 있다. 곧 발표될 텐서플로 2.0에서는 여러 고수준 API로 인한 사용자 혼란을 줄이기 위해, 단일 API로 통합해 고급 기능을 제공하기로 했다. 그리고 단일 API로 ‘tf.keras’가 선정됐다.

케라스(Keras)는 이미 고유한 딥러닝 API로 사랑받고 있었지만, 텐서플로 단일 고수준 API 선정으로 그 관심과 기대가 늘고 있다.

‘Contribute to Keras’ 프로젝트(이하 케라스 프로젝트)는 2018 공개SW 컨트리뷰톤에 참여해 영어 튜토리얼 번역을 통한 케라스 커뮤니티 확대를 목표로 활동을 했고, 그 성과를 인정받아 장려상을 받았다.

흥미 있는 케라스 글 리스트. / 마이크로소프트웨어 395호
흥미 있는 케라스 글 리스트. / 마이크로소프트웨어 395호
컨트리뷰톤 활동 기간 3개월 동안 케라스 프로젝트 팀원 14명은 영어로 작성된 다양한 케라스 튜토리얼 문서를 번역해 공유하고, 학습자가 튜토리얼에 따라 실습할 수 있도록 코드를 검증하는 작업을 했다.

먼저 인터넷에 있는 수많은 케라스 프로젝트 중 어떤 글을 번역할지 선정해야 했다. 첫 오프라인 회의에서 케라스 공식 튜토리얼을 번역하거나, 관심 분야 딥러닝(케라스) 프로젝트를 소개하거나, 예제를 직접 만들어 소개하는 것을 논의했다. 하지만 예제를 직접 만드는 것은 3개월이라는 프로젝트 기간에 달성하기 힘든 목표라고 판단돼 우선으로 케라스 공식 튜토리얼 번역과 관심 분야 딥러닝(케라스) 프로젝트 소개에 집중하기로 했다.

최근 블로그 플랫폼 미디엄(Medium)에 딥러닝 관련 양질의 글이 많이 작성되고 있다는 팀원의 의견에 따라 미디엄 또는 기타 플랫폼에 있는 글 중 각자 흥미 있는 글을 리스트업해 배분하기로 했다.

여럿이 함께하는 번역 프로젝트 특성 때문에 협업을 위한 여러 절차가 추가됐다. 그중 하나가 주/부 담당자 시스템이었다. 앞서 설명처럼 팀원들의 리서치를 통해 60여 개 글이 모여 담당자를 선정하는 작업이 필요했다. 무엇보다 팀원들이 자율적으로 참여하고 즐겁게 작업하는 것이 중요하기 때문에, 임의로 배정하지 않고 각자 선호도를 반영하기로 했다.

각자 작업하고 싶은 글을 골라 공유 문서에 표시하고, 여러 명이 선택한 문서의 경우에는 주 담당자 1명과 부 담당자 여러 명을 지정했다. 주 담당자는 해당 문서를 담당해서 주도적으로 번역과 코드 검증을, 부 담당자는 주 담당자의 작업 결과를 리뷰하고 재검증을 담당했다.

이런 협업 시스템은 번역 결과물의 질을 높이는 데도 큰 도움이 됐는데, 여러 명 리뷰를 거치면서 오타나 잘못된 용어를 수정하고, 자연스럽지 않은 표현을 교정하며 전반적인 번역 질을 향상할 수 있었다.

‘keras.preprocessing.text’의 ‘Tokenizer’ 클래스 설명 수정 반영. / 마이크로소프트웨어 395호
‘keras.preprocessing.text’의 ‘Tokenizer’ 클래스 설명 수정 반영. / 마이크로소프트웨어 395호
케라스 프로젝트는 튜토리얼 번역을 주목표로 했지만, 활동 중 뜻밖의 성과를 냈다. 바로 케라스 컨트리뷰터를 배출하게 된 것이다. 정연준 팀원이 튜토리얼 실습 코드를 검증하면서 정상적으로 동작하지 않는 코드를 발견했고, 원인을 찾던 중 케라스 버그를 직접 수정해 버전 릴리즈에 반영한 것이다.

텍스트 전처리에 쓰이는 ‘Tokenizer’ 클래스가 의도와 다르게 동작하고 있었다. 살펴보니, ‘Tokenizer’의 ‘num_words’ 인자와 관련해 오류가 있음을 발견했다. ‘Tokenizer’는 ‘num_words’ 인자를 받아 해당 값만큼 단어를 사용하게 돼 있는데, 실제로는 ‘num_words-1’개 단어가 사용되는 것이 문제였다.

이 부분과 관련된 ‘keras.preprocessing.text’ 모듈의 코드를 살펴본 결과 프로그램의 실제 동작이 문서와 다른 버그로 확인됐다. 이를 수정하기 위해서는 문서에 맞게 코드를 수정하거나, 실제 구현에 맞게 문서를 수정하는 두 가지 방법이 있었다. 코드를 수정할 경우 다른 모듈에도 영향을 줄 수 있는 수정사항(breaking change)이기 때문에 ‘Tokenizer’와 관련된 테스트까지 모두 수정해야 하는 번거로움이 있었다. 그 때문에 ‘Tokenizer’ 클래스의 설명 문서를 수정했고, 이 내용이 케라스 2.2.3 릴리즈에 반영됐다.

이는 케라스 프로젝트의 새로운 가능성을 발견하게 된 계기였다. 프로젝트 참여자가 번역 기여를 넘어 오픈소스 프로젝트에 참여할 수 있는 발판을 마련했다는 점에서 본 프로젝트가 한글 튜토리얼 제공 이상의 의미가 있다고 확신한다.

조아라 필자의 ‘케라스팀이 들려주는 협업 그리고 머신러닝 이야기’에 대한 자세한 내용은 ‘마이크로소프트웨어 395호(https://www.imaso.co.kr/archives/4654)’에서 확인할 수 있다.