우리는 두 번의 실패를 거쳤습니다. 물론 실패하지 않는 것이 가장 좋았겠지만, 실패를 겪기 전에는 무엇을 만들어야 할 지 감도 잡지 못하고 있었습니다. 그리고 그 과정에서 완성된 형태의 제품을 구성할 만한 기술들이 쌓이고 있었습니다. 이렇게 하나둘 쌓인 기술들을 조합할 수 있다는 사실을 깨닫고 우리는 넷츠프레소 1.0의 초안을 만들었습니다.
통합의 실마리
모델 서쳐가 개발되는 시기에 다른 한 편에서는 모델 컴프레서(Model Compressor)의 개발이 진행되었고 소기의 성과를 올리고 있었습니다. 모델 컴프레서는 넷츠프레소 첫 번째 트라이얼 버전에서 핵심적 부분들만 구분하여 모듈화한 제품 중 하나였습니다. 모듈화 과정에서 기술의 중요도에 따라 우선순위를 정하고 덜 중요한 부분을 포기하는 대신 모델 압축 기술에 집중하여 개발을 진행했습니다. 그 결과, 압축이 가능한 모델의 범위를 획기적으로 늘릴 수 있었습니다.
이로써 우리는 케라스(Keras) 뿐만 아니라 파이토치(PyTorch) 모델도 압축할 수 있게 되었고, 객체 탐지 모델 등 다양한 종류의 모델들을 압축할 수 있게 되었습니다. 넷츠프레소를 활용하여 압축을 할 수 있는 모델이 많아졌기 때문에 모델 서쳐에서 생성된 모델도 모델 컴프레서로 압축하는 것이 가능해졌습니다. 다르게 표현하자면, 압축해야 할 모델이 고객으로부터 오는 것이 아니라 우리가 제공하고 있는 다른 서비스(모델 서쳐)로부터 올 수 있게 된 것입니다. 여기에는 세 가지 정도의 아주 중요한 의미가 있습니다.
첫 번째, 모델 컴프레서를 이용하여 모델을 압축한 후 재학습이 쉬워 졌습니다. 모델 서쳐에서 만들어진 모델의 정보를 이미 알고 있으므로 모델 컴프레서에서 압축 이후 재학습을 손쉽게 할 수 있습니다. 우리가 가장 어렵게 여기고 있었던 재학습의 문제를 제한적으로나마 해결할 수 있게 된 것입니다.
두 번째, 모델 서쳐에서 작은 모델을 찾기 위해 비싼 비용을 치르지 않아도 됩니다. 기존 모델 서쳐에는 압축하는 프로세스가 없었기 때문에 큰 비용을 들여서라도 작은 모델을 찾아내야만 했습니다. 하지만 모델 서쳐 의 결과물을 모델 컴프레서에서 한 번 더 압축할 수 있다면 굳이 작은 모델을 찾기 위해 큰 비용을 들일 필요가 없습니다. 그래서 우리는 NAS를 적용하지 않고 데이터베이스에 있는 모델을 선택하여 한 번만 학습하는 퀵서치(Quick Search) 기능을 사용할 수 있었습니다.
세 번째, 모델 컴프레서의 측면에서 보자면 압축해야 할 모델의 범위가 모델 서쳐가 만들어낼 수 있는 몇 가지 모델로 한정됩니다. 덕분에 우리가 알지 못하는 모델을 압축해야 하는 상황이 줄어들게 되며, 모델 컴프레서가 모델 압축 과정에서 에러를 발생시킬 확률이 줄어듭니다.
모델 컴프레서가 압축할 수 있는 모델의 범위가 넓어지면서 넷츠프레소의 모듈들(모델 서쳐, 모델 컴프레서, 모델 런쳐)이 유기적으로 연결될 수 있는 실마리가 보이기 시작했습니다. 동시에 우리를 오랜 시간 고민하게 만든 문제들을 - 위에서 언급한 세 가지 방식을 통해 - 해결할 수 있었습니다. 이 시기엔 넷츠프레소의 확장성과 활용성에 관한 아이디어가 사방으로 뻗어나갔습니다. (넷츠프레소를 개발하면서 가장 즐거웠던 시기를 뽑으라면 이때를 뽑겠습니다.)
따로 또 같이
우리는 넷츠프레소를 세 가지 모듈로 정의했습니다. 사용자에게 데이터를 받아 모델을 생성하는 모델 서쳐와 모델 서쳐에서 생성된 모델을 압축하는 모델 컴프레서, 마지막으로 모델이 디바이스 위에서 작동할 수 있게 변환해주는 모델 런쳐가 넷츠프레소를 이루는 모듈들입니다. 우리는 직관적인 절차를 통해 모델이 만들어지는 것을 중요하게 생각했고, 이 절차는 넷츠프레소 첫번째 트라이얼 버전의 영향을 받았습니다.
1. 사용자는 본인이 갖고 있는 데이터를 업로드하고, 어떤 기기를 사용할 것이며, 어느 정도 속도를 내고 싶은지를 입력합니다.
2. 사용자가 입력한 내용에 가장 적합한 모델을 추천하고 사용자가 올려준 데이터로 모델을 학습합니다. (모델 서쳐)
3. 학습이 완료된 모델을 그대로 사용할 수도 있고 (그렇다면 여기에서 절차가 종료됩니다.)
사용자가 원하는 만큼 압축할 수도 있습니다. (모델 컴프레서)
4. 압축된 모델을 사용자가 올려준 데이터로 다시 학습합니다. (다시, 모델 서쳐)
5. 모델을 사용자가 원하는 기기에서 돌릴 수 있게 변환하고 패키징합니다. (모델 런쳐)
모델 서쳐, 모델 컴프레서, 모델 런쳐는 따로 또 같이 작동합니다. 자연스러운 흐름을 따라서 세 가지를 함께 사용하는 것도 가능하지만, 본래 별도로 발전해온 모듈들이기 때문에 독자적으로도 동작합니다. 위의 절차를 그대로 따라서 사용할 수도 있고 원하는 기능만 사용할 수도 있습니다.
세 모듈은 이름에서 드러나듯이 ‘모델’을 인풋 또는 아웃풋으로 사용합니다. 우리는 이들을 자연스럽게 연결하기 위해 모델을 주고받는 방식을 사용해야 한다고 생각했습니다. 넷츠프레소 시스템은 ‘모델 데이터베이스’를 중심에 두고 세 가지 주요 모듈들이 이것을 이용해 모델을 주고받도록 설계되어 있습니다. 그리고 물론 여러 개의 부속 모듈들이 함께 시스템을 이루고 있습니다.
2022년 4월 무렵, 위와 같은 설계가 완성되었고, 5개월 정도의 개발을 거친 뒤, 9월 초에 개발이 완료되어 공식적으로 서비스를 런칭하게 되었습니다.
넷츠프레소가 다른 점 - 기술에서 시작된 아이디어
제가 예전에 다니던 회사의 R&D 조직에는 이런 구호가 있었습니다.
'기술이 선도하는 개발!'
저는 이 구호의 뜻을 제대로 이해하지 못했습니다. 당연히 기술이 있어야 개발을 하는 것 아냐? 정도의 생각을 할 뿐이었습니다. 넷츠프레소를 개발하면서 이 말의 뜻을 약간 이해한 것 같은데, 이 구호를 제대로 이해하려면 대략 이 정도로 구체적인 설명이 필요할 것 같습니다.
‘기술에서 나온 아이디어를 바탕으로 개발한다’
넷츠프레소의 개발은 제가 지금까지 경험한 소프트웨어 개발과 달랐습니다. 지금까지 경험한 소프트웨어 개발은 아이디어가 먼저 나오고 이를 실현하기 위해 개발을 하는 것이 일반적이었습니다. 그러나 넷츠프레소는 그렇게 개발을 할 수가 없었습니다. 첫 번째로는 우리에게 아이디어가 없었고, 두 번째로는 멋대로 아이디어를 낸다 한들 이를 실현할 기술이 없었습니다. 즉, 넷츠프레소는 우리가 보유한 기술에 의해 결정됩니다.
우리가 모든 아이디어와 계획을 다 세울 수 있고 그에 맞춰서 기술을 개발하며 그 기술이 계획에 맞게 딱딱 나와준다면 참 좋겠지만, 우리는 신이 아니라 그렇게 할 수가 없습니다. 우리는 모두 사람인지라 아무것도 없는 상황에서 아이디어를 생각해 낼 수가 없으며, 연구자들은 자기가 재밌어 보이는 연구에 더 집중하게 되고, 계획한 대로 연구가 진행되지도 않습니다.
그러므로 기술은 여기저기서 파편처럼 개발됩니다. 그리고 개발된 기술 중에서 ‘이걸 이렇게 적용하면 뭔가 되겠구나’ 싶은 것들이 발견됩니다. 여기에서 아이디어가 시작되고 기획, 설계, 개발합니다. 즉, 넷츠프레소는 기술이 우리에게 전달해 준 아이디어로 인해 개발되었습니다. 좀 더 자세히 설명하자면, 연구자들이 개발해낸 기술을 기획자들이 엮어 아이디어를 만들고, 이 아이디어를 개발자가 현실화한 결과물입니다.
넷츠프레소의 개발 과정을 돌아보면서 연구자들의 개성을 존중하는 것과 다른 사람의 연구 결과를 자세히 이해하려고 노력하는 것이 중요하다고 생각해 봅니다. 또, 우리가 보유한 기술들을 어떻게 엮어야 좋은 제품이 나올지 많은 고민이 필요합니다. 우리는 스스로 아이디어를 만들어낼 능력이 부족하며, 보유한 기술에 의지하여 아이디어를 짜내야 하기 때문입니다.
.
.
스타트업이 살아남기 위해서는 혁신적인 제품을 만들어야 한다는 말에 다들 공감하실 것입니다. 저도, 노타도 열심히 무언가를 혁신하려고 노력을 해왔습니다. 하지만 우리가 무엇을 혁신하고 있는지 명시적으로 이야기해 본 적은 없는 것 같습니다.
저는 이 글을 쓰면서 객관적인 시선으로 우리가 한 일들을 돌아보았습니다. 그리고 우리가 집중해야 할 혁신의 방향성을 이렇게 정의했습니다.
‘AI 개발 절차’를 혁신하는 것도 아니고 ‘AI 개발 방법’을 혁신하는 것도 아니라 ’AI 개발’을 혁신한다는 말을 사용하였습니다. AI를 개발하는 과정의 모든 것이 우리의 혁신 대상이 되어야 한다고 생각하기 때문입니다. 저는 넷츠프레소를 사용하는 유저들이 지금과는 완전히 다른 방식으로 AI 모델을 개발하고 작동시키게 되길 기대합니다. 물론, 우리가 유저들에게 제시할 방식은 새로울 뿐만 아니고 기존 방식에 비해 훨씬 쉽고 빠르며 더 큰 가치를 전달해야 합니다.
현재의 넷츠프레소는 AI 모델을 만들고, 압축하고, 기기에서 작동시키는 전 과정을 그래픽 유저 인터페이스로 작동할 수 있는 형태를 갖추고 있습니다. 복잡한 코드를 작성해야 하는 보통의 AI 개발 과정과 비교하면 확실히 쉽고 편합니다. 분명히 어느 정도는 혁신을 이뤄냈습니다. 그러나 저는 우리가 더 근본적인 차원에서 AI 개발의 혁신을 이뤄내야 한다고 생각합니다. 근본적인 혁신을 위해서는 수많은 기술적 허들을 우리 스스로 넘어야 할 것이며, 최신의 연구 결과들을 잘 이해하고 적용해야 하고, 고정관념을 벗어난 아이디어들을 생각해내야 합니다.
이렇게 생각하니 우리가 가야 할 길이 참 멀다는 생각이 듭니다. 소프트웨어 개발 그 자체로도 쉬운 일이 아닌데, 사용자가 보기에 정말 좋으면서 혁신적이어야 하다니, 참 어려운 일입니다.
하지만 노타가 성공하는 방법은 이 어려운 것을 해내는 것 외에는 딱히 없습니다.
‘AI 개발을 근본적으로 혁신할 제품을 만들어내는 것.’