Tensorflow.JS는 어떻게 웹에서 딥러닝을 돌렸을까?
1. 인트로
Tensorflow JS는 자바스크립트를 기반으로 만들어진 머신러닝/딥러닝 라이브러리입니다. 현재 1.0 버전이 정식출시되었으며, 구글이 정식으로 서포트하고 있어 활발히 개발되고 있는 라이브러리입니다. Tensorflow 라이브러리와 호환이 잘 되며, 간편하게 웹 브라우저에서 학습한 모델을 실행시킬 수 있으며, 심지어 실시간으로 학습시키고 결과를 볼 수도 있습니다. 최근에는 웹 브라우저에서 카메라, 마이크, GPU 등을 적극적으로 사용할 수 있도록 Native Web API를 제공해주기에 Tensorflow JS 라이브러리와 자연어 처리, 음성, 비디오 등을 활용하여 다양한 기능을 구현할 수 있습니다.
본 글에서는 Tensorflow JS의 내부 구조에 대해서 살펴보고, 어떻게 웹에 무거운 딥러닝 라이브러리를 올릴 수 있었는 지 살펴보고자 합니다. 그리고 Tensorflow JS에서는 어떤 API, 기능들이 있는 지 살펴보고, 마지막으로 공개된 데모 샘플과 어플리케이션들을 살펴보고자 합니다.
2. Tensorflow.JS
구조
Tensorflow JS의 전체적인 설계 철학은 Tensorflow와 동일합니다. LSTM Cell, Batchnorm 등과 같은 Tensorflow Core부터 Keras를 대체하는 TF Layers, Data 모두 Tensorflow 라이브러리와 동일합니다. 여기에 추가적으로, Tensorflow 모델을 JS로 실행 가능하도록 변환시켜주는 Converter, 웹 브라우저안에서 시각화를 도와주는 Vis, 랩탑, 모바일과 같은 Edge 디바이스에 특화된 Google AutoML 서비스를 활용할 수 있는 AutoML API가 존재합니다. 이처럼 Tensorflow JS는 Tensorflow의 기본 디자인 철학을 그대로 계승하면서, 시각화와 모델 구조 짜기가 어렵다는 점을 해결하기 위해 다양한 툴들을 제공합니다.
Tensorflow JS는 JavaScript에 변수형을 도입한 TypeScript로 작성되어 있고, Backend Engine 부분에서는 딥러닝 연산의 가속을 위해 Web Assembly, WebGL, WebGPU, Tensorflow C++ Adaptor 등으로 작성되어 있습니다. 일반적으로 JavaScript로 짜여진 프로그램의 경우 실행 속도가 느리기에, 거의 대부분의 연산자는 앞에서 나열한 것과 같은 다른 엔진을 사용합니다. 이 기술들 모두 웹 브라우저의 프로그램들을 빠르게 실행시키기 위해 만들어진 기술들로, 일반적인 JavaScript 프로그램들 보다 빠르게 실행됩니다. WebGL, WebGPU의 경우 Native GPU를 웹에서 사용할 수 있는 기술들로 Tensorflow JS는 이 기술들을 통해 GPU를 사용하고 딥러닝 연산을 가속합니다. Tensorflow JS는 자동으로 적절한 Backend Engine을 선택하며, 가장 효율적인 방법으로 딥러닝 모델을 실행합니다.
어떻게 Tensorflow.JS를 웹에 올렸을까?
Tensorflow JS는 WebGL을 활용해서 Native GPU를 사용하여 딥러닝 연산을 가속화했습니다. WebGL에서 제공하는 벡터 자료구조를 활용해서 병렬연산을 더 효율적으로 처리해 Convolution과 같이 병렬연산이 많이 필요한 연산자들을 최적화하였습니다. Tensorflow JS에서 어떻게 WebGL을 사용했는 지 아래의 링크에서 볼 수 있습니다.
GPU가 없더라도 Tensorflow JS는 Web Assembly와 SIMD를 활용해서 CPU 딥러닝 연산을 가속화하였습니다. Web Assembly는 웹 브라우저의 속도를 높이기 위해 개발된 언어이며 기존 JavaScript보다 더 빠르게 실행됩니다. 여기에 CPU에서 병렬처리를 보다 효과적으로 하기 위해 고안된 SIMD(Single Instruction Multiple Data)를 활용하여 기존 연산을 더 가속화하였습니다. SIMD를 통해 Edge Device에서 가속화 하는 방법에 대해서는 아래의 블로그를 참조해주세요.
이처럼 Tensorflow JS는 WebGL과 Web Assembly/SIMD를 활용해서 GPU/CPU 딥러닝 연산을 가속화하였고, 성능 벤치마크는 아래의 자료에서 확인할 수 있습니다.
( 그림 클릭 시 링크로 이동 )

특징
Canvas, Video와의 CompatibilityTensorflow JS는 웹 개발자들이 사용하기 편리하게 되어있습니다. 일반적으로 Tensorflow를 사용할 때 입력웹 브라우저에서는 주로 이미지, 음성 데이터를 자체 Audio, Canvas, Video 포맷으로 주로 처리하는 데, Tensorflow JS에서는 모델 입력으로 이러한 포맷들을 입력해도 문제 없습니다. 이처럼 꼭 텐서로 변환해주지 않아도 HTML 친화적이기에 웹 개발자들도 딥러닝 모델을 무리없이 쉽게 연동할 수 있습니다. 아래의 샘플에서 카메라 Native Web API와 PoseNet을 연동한 사례를 확인할 수 있습니다.
FFT, Object Detection을 위한 NMS 로직 등 다양한 기본 연산자 구현Tensorflow JS에서는 오디오, Object Detection을 위한 다양한 기본 연산자들이 있습니다. 오디오 처리에서는 주로 FFT, Object Detection에서는 NMS 연산을 사용하는 데 Tensorflow JS에서는 이러한 연산들도 최적화되어 구현되어 있습니다. 이처럼 다양한 범위의 연산자를 지원하며 오디오, Object Detection 등 다양한 범위를 할 수 있습니다. 그리고 모바일 최적화된 Depthwise Convolution들 또한 지원하며 손쉽게 GPU가 없는 Edge Device에서도 딥러닝 모델을 학습시키고 실행시킬 수 있습니다.
TF 모델 웹 모델 변환 로직Tensorflow JS는 Tensorflow에서 학습된 모델을 쉽게 변환할 수 있습니다. 간단한 명령어를 통해 학습된 모델을 변형시킬 수 있으며, 다만 지원하지 않은 연산들이 있는 경우 Custom Operator를 구현해야 합니다. 그러나 거의 모든 범용적인 연산자들이 Tensorflow JS에 구현되어 있기에 해당 이슈는 크게 없을 것이라 생각됩니다. 간단한 터미널 커맨드를 사용하여 Tensorflow 모델을 손쉽게 변환시킬 수 있습니다.
( 그림 클릭 시 링크로 이동 )

Tensorflow.JS Pretrained ModelTensorflow JS는 많은 샘플 구현체들이 있습니다. 비젼, 자연어 처리, 음성 다양한 분야의 구현체들이 있으며 샘플 페이지에서 MobileBert, Tokenizer 구현체, Semantic Segmentation 등의 구현체들을 확인할 수 있습니다. 특히 자연어 처리 분야에서 딥러닝 말고도 전처리, 후처리 로직이 굉장히 많이 필요한데 샘플페이지에서 JavaScript로 작성된 코드를 그대로 활용할 수 있습니다. 이처럼 다양한 구현체들이 존재하며 원하는 모델을 선택해서 재학습할 수 있고, 기존에 학습된 모델들을 활용할 수 있습니다.
총평
Tensorflow JS는 브라우저에서 딥러닝을 효율적으로 돌릴 수 있는 유일하고, 웹개발자 친화적인 라이브러리입니다. 웹 브라우저에서 학습을 시키려면 Tensorflow의 Tensor, Optimizer 등과 같은 개념을 이해해야 하지만 단순히 학습된 모델을 실행시키기 위해서는 다른 딥러닝 지식이 필요없고 복잡한 변수 타입 변환을 할 필요가 없습니다.
TensorflowJS에서도 몇 가지 단점들이 있는데, 그중 한 가지는 모델 최적화를 지원하지 않는다는 점입니다. Tensorflow Lite는 적극적으로 Quantize, Pruning 등을 지원하여 Edge Device에 적합한 모델로 변형하는 것과 달리 적극적인 모델 압축 로직을 지원하지 않기에 웹 브라우저에서 최적화하기 어렵습니다. 또한 디바이스의 자원을 100% 효율적으로 사용할 수 없기에, 무거운 딥러닝 모델을 돌리기에는 적합하지 않습니다.
그럼에도 불구하고 웹 서비스는 모바일 어플리케이션보다 배포가 쉽고, 빠르게 실험하고 개선할 수 있다는 장점이 있기에 빠른 실험 사이클을 가져갈 수 있는 웹 서비스에 딥러닝을 돌릴 수 있다는 것은 굉장히 큰 장점입니다. 많은 웹개발자들이 Tensorflow JS를 활용하여 웹 게임, 웹 어플리케이션을 만든다면 앞으로 딥러닝이 적용된 창의적인 웹 서비스가 많이 나올 수 있을 것이라 생각합니다.