AIㆍML / 개발자

리뷰 | 텐서플로우 2, "더 쉬워진 머신러닝"

Martin Heller | InfoWorld 2019.07.04
이제 머신러닝과 딥 러닝의 중요함에 대해서는 반론의 여지가 없다. 수십 년 동안 반복된 약속과 허황된 기대, 실망 끝에 두 기술 모두 마침내 실무에 활용되는 수준에 이르렀다. 머신러닝이나 딥 러닝 애플리케이션은 아직 완벽함에는 이르지 못했지만 많은 경우 상당히 우수하다.
 
ⓒ Getty Images Bank

여러 우수한 머신러닝딥 러닝 프레임워크 중에서도 텐서플로우(TensorFlow)는 가장 성숙하고 연구 논문에서 가장 많이 인용되며(구글 직원들의 인용을 제외하더라도) 프로덕션 사용사례도 가장 견실하다. 배우기 가장 쉬운 프레임워크라고 할 수는 없지만 2016년에 비하면 훨씬 더 문턱이 낮아졌다. 텐서플로우는 많은 구글 서비스의 기반이다.

텐서플로우 2.0 웹사이트는 텐서플로우 프로젝트를 “종합적인 오픈소스 머신러닝 플랫폼”으로 소개한다. 그러나 지금의 텐서플로우는 더 포괄적으로, “연구자들이 AI 기반 애플리케이션을 구축하고 배포하는 데 도움이 되는 툴과 라이브러리, 커뮤니티 리소스의 생태계”로 발전했다. 텐서플로우 2.0의 네 가지 주요 구성 요소는 다음과 같다.

- 텐서플로우 코어(TensorFlow core): 머신러닝 모델을 개발하고 학습시키기 위한 오픈소스 라이브러리
- TensorFlow.js: 브라우저와 Node.js에서 모델을 학습 및 배포하기 위한 자바스크립트 라이브러리
- 텐서플로우 라이트(TensorFlow Lite): 모바일 및 임베디드 디바이스에 모델을 배포하기 위한 가벼운 라이브러리
- 텐서플로우 익스텐디드(TensorFlow Extended, TFX): 대규모 프로덕션 환경에서 데이터를 준비하고 모델을 학습, 검증, 배포하기 위한 플랫폼
 
ⓒ Getty Images Bank 

과거 필자는 텐서플로우 r0.10(2016)과 텐서플로우 1.5(2018)를 리뷰한 적이 있다. 처음의 텐서플로우는 데이터 흐름 그래프를 기반으로 하는 머신러닝 및 신경망 라이브러리였으며 배우기가 어렵고 저수준 API를 사용했다. 

그러나 이후 발전을 거듭해 텐서플로우 2.0은 보통 사람이 익히기에도 어렵지 않게 됐으며 고수준 케라스(Keras) API를 사용하고 자바스크립트에서 실행하고 모바일 및 임베디드 디바이스에 배포하고 대규모 프로덕션 환경에서 운용할 수 있는 옵션도 갖췄다.

텐서플로우의 경쟁 상대로는 케라스(텐서플로우가 아닌 다른 백엔드 사용 가능), MX넷(MXNet, 글루온(Gluon)과 함께), 파이토치(PyTorch), 사이킷-런(Scikit-learn), 스파크 MLlib(Spark MLlib) 등이 있다. 마지막 두 개는 주로 머신러닝 프레임워크로, 딥 러닝을 위한 기능은 없다.

한 가지만 선택할 필요는 없다. 하나의 파이프라인에서, 예를 들어 사이킷-런(Scikit-learn)으로 데이터를 준비하고 텐서플로우로 모델을 학습시키는 등 여러 프레임워크를 사용하는 방식도 충분히 가능하다. 


텐서플로우 코어

텐서플로우 2.0은 즉시 실행(eager execution), 더 높은 수준의 직관적인 API, 모든 플랫폼에서의 유연한 모델 구축과 같은 부분이 업데이트됐으며 단순함과 사용의 용이함에 초점을 둔다. 이 가운데에서 특히 텐서플로우 코어와 TensorFlow.js는 자세히 살펴볼 만하다.

- 즉시 실행(Eager execution)
텐서플로우의 원래 작동 모드는 나중 세션에 실행될 그래프에 노드와 에지를 추가하는 것이다. 그런데 즉시 실행에서는 코드가 정의될 때 텐서플로우가 실행된다. 예를 들어 초기 텐서플로우 r0.10의 “Hello, World!” 스크립트는 다음과 같다.

$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> exit()


스크립트에서 tf.Session()sess.run()이 사용되는 것을 볼 수 있다. 텐서플로우 2.0에서는 즉시 실행 모드가 기본 모드이며 다음 그림과 같은 예시를 볼 수 있다. 
 
ⓒ IDG

- tf.keras
앞의 두 가지 예제는 모두 저수준 텐서플로우 API를 사용한다. 효과적인 텐서플로우 2.0을 위한 가이드는 예전의 저수준 API가 아닌 고수준의 tf.keras API를 사용하는 것이다. 이렇게 하면 써야 하는 코드의 양이 대폭 줄어든다. 레이어당 한 줄, 또는 루프 구조체를 사용하는 경우 더 적은 코드로 케라스 신경망을 구축할 수 있다. 

다음 예제는 텐서플로우 샘플과 테스트를 편리하게 실행할 수 있고, 게다가 무료다. 구글 코랩(Colab)에서 실행되는 케라스 데이터 집합과 시퀀셜 모델 API를 보여준다. 코랩은 CPU 외에 GPU와 TPU 인스턴스도 제공한다.
 
ⓒ IDG

- 텐서플로우 2.0으로 전환
이 기사를 쓰는 현재 텐서플로우 1.14에서 텐서플로우 2.0으로의 전환 상태는 다음 화면에서 볼 수 있듯이 제각각이다. 현재 대기 작업은 2개, 진행 중인 작업은 23개, 완료된 작업은 34개다. 진행 중인 작업의 범위는 거의 진행되지 않은 수준부터(담당자가 그만둔 경우) 거의 완료된 수준까지(코드가 리포지토리의 마스터 분기에서 작동하지만 아직 검토 및 배포는 되지 않은 단계) 다양하다.
 
ⓒ IDG

- 텐서플로우 2.0으로 모델 업그레이드
오픈소스 프로젝트의 정식 버전이 출시될 때 종종 그렇듯이 텐서플로우 2.0에도 API에 하위 호환이 되지 않는 변화가 몇 가지 있어 코드를 업그레이드해야 한다. 다행히 텐서플로우 2.0과 함께 자동으로 설치되는 파이썬 코드 업그레이드 스크립트가 있고, 문자열 대체만으로 간단히 업그레이드할 수 없는 API 심볼을 위한 호환성 모듈도 있다(compat.v1). 

업그레이드 스크립트를 실행하면 프로그램은 텐서플로우 2.0에서 실행되겠지만 tf.compat.v1 네임스페이스에 대한 참조가 있으므로 코드를 깔끔하게 정돈하려면 이 부분을 수정하는 것이 좋다. 또한 깃허브 리포지토리의 주피터 노트북도 텐서플로우 2.0으로 업그레이드할 수 있다.

- tf.function 사용하기
즉시 실행 모드의 단점은 흐름 그래프의 컴파일 및 실행 속도를 일부 잃을 수 있다는 점이다. 즉시 실행 모드를 완전히 끄지 않고도 이 속도를 되살리는 방법은 바로 tf.function이다.

함수에 tf.function 주석을 달면 그래프로 컴파일되며 해당 함수와 이 함수가 호출하는 모든 함수는 GPU 또는 TPU에서 실행되거나 세이브드모델(SavedModel)로 내보내 더 빠른 실행 속도를 얻을 수 있다. tf.function의 편리한 새로운 기능은 파이썬 제어 흐름 문을 텐서플로우 제어 작업으로 자동으로 컴파일해주는 오토그래프(AutoGraph)다.

- 분산 학습
필자가 마지막으로 텐서플로우를 살펴봤을 당시 분산 학습을 실행하는 방법은 두 가지였다. 비동기 매개변수 서버를 사용하는 방법과, 동기식이며 올 리듀스(all-reduce) 알고리즘을 사용하는 서드파티 호로보드(Horovod) 프로젝트를 사용하는 방법이다. 

지금은 텐서플로우의 기본 분산 전략은 5가지이고, 원하는 전략을 선택하기 위한 API인 tf.distribute.Strategy가 있다. 이 API를 사용하면 복수의 GPU와 복수의 머신, 또는 복수의 TPU로 학습을 분산할 수 있다. 또한 다양한 플랫폼으로 평가 및 예측을 분산하는 데도 이 API를 사용할 수 있다.

 

ⓒ IDG


TensorFlow.js

TensorFlow.js는 자바스크립트로 머신러닝 모델을 개발해 학습시킨 다음, 브라우저 또는 Node.js에 배포하기 위한 라이브러리다. TensorFlow.js 위에 구축되는 고수준 라이브러리인 ml5.js도 있다. 이 라이브러리는 텐서와 옵티마이저의 복잡함을 숨겨준다.

브라우저의 경우 TensorFlow.js는 데스크톱 디바이스와 모바일 디바이스 모두 지원한다. 브라우저가 WebGL 셰이더 API를 지원한다면 TensorFlow.js는 이 API를 통해 GPU를 활용할 수 있다. CPU 백엔드에 비해 최대 100배의 속도 향상을 얻게 된다. TensorFlow.js 데모는 GPU가 있는 시스템의 브라우저에서 놀라울 정도로 빠르게 실행된다.

Node.js에서 TensorFlow.js는 설치된 텐서플로우 버전을 백엔드로 사용하거나 기본 CPU 백엔드를 실행할 수 있다. CPU 백엔드는 순수한 자바스크립트이며 병렬화할 수 있는 여지가 크지 않다.

공식 TensorFlow.js 모듈을 실행하고, 파이썬 모듈을 변환하고, 전이 학습을 사용해서 자신의 데이터에 맞게 모델을 커스터마이즈하고, 자바스크립트로 직접 모델을 구축해 학습시킬 수 있다.


텐서플로우 라이트

텐서플로우 라이트(TensorFlow Lite)는 온디바이스 추론을 위한 오픈소스 딥 러닝 프레임워크다. 현재 iOS와 ARM64, 라즈베리 파이용 모델을 구축한다.

텐서플로우 라이트의 두 가지 기본 구성 요소는 인터프리터(interpreter)와 컨버터(converter)다. 인터프리터는 다양한 하드웨어 유형에서 특수하게 최적화된 모델을 실행한다. 컨버터는 텐서플로우 모델을 인터프리터에서 사용하기 위한 효율적인 형식으로 변환하며, 최적화를 통해 바이너리 크기와 성능을 개선할 수 있다. 이미지 분류, 사물 탐지, 스마트 응답 생성, 자세 추정, 세분화를 위한 사전 학습된 모델이 있다. 또한 동작 인식, 이미지 분류, 사물 탐지, 음성 인식을 위한 예제 앱도 있다.


텐서플로우 익스텐디드

텐서플로우 익스텐디드(TensorFlow Extended, TFX)는 프로덕션 머신러닝 파이프라인을 구축하기 위한 종합적인 플랫폼이다. TFX는 모델을 학습시킨 이후에 고려할 만하다. 파이프라인에는 데이터 검증, 특성 공학, 모델링, 모델 평가, 추론 제공, 온라인 배포 관리, 네이티브 모바일, 자바스크립트 타깃이 포함된다. 다음 다이어그램은 TFX 파이프라인의 구성요소가 서로 어떻게 맞물리는지를 보여준다.
 
ⓒ IDG


텐서플로우용 스위프트

텐서플로우용 스위프트는 딥 러닝 및 차별화 가능 프로그래밍을 위한 여전히 불안정한 차세대 플랫폼이다. 학습을 위한 고수준 API는 파이썬 텐서플로우와 비슷해 보이지만 @differentiable 속성으로 스위프트 컴파일러 포크에 내장된 자동 차별화를 지원한다. 텐서플로우용 스위프트는 파이썬 코드를 가져오고 호출할 수 있으므로 파이썬에서 텐서플로우로의 전환을 용이하게 해준다.


텐서플로우 지원 툴 7개 

현재 텐서플로우를 지원하는 툴은 7개다. ▲텐서플로우 그래프를 위한 시각화 툴 모음인 텐서보드(TensorBoard) ▲조정 가능한 온라인 신경망인 텐서플로우 플레이그라운드(TensorFlow Playground) ▲무료 온라인 주피터 노트북 환경인 코랩(Colab 또는 Colaboratory) ▲텐서보드와 코랩 또는 주피터 노트북에서 모델을 탐색하고 디버그하는 데 유용한 왓이프 툴(What If Tool) ▲광범위한 머신러닝 벤치마크 모음인 ML 퍼프(ML Perf) ▲텐서플로우 계산을 최적화하는 선형대수학을 위한 도메인별 컴파일러인 XLA(Accelerated Linear Algebra) ▲무료로 사용을 신청할 수 있는 1,000개 이상의 클라우드 TPU 클러스터인 TFRC(TensorFlow Research Cloud)다.

전체적으로 텐서플로우 2.0 베타는 여러 가지 방향에서 큰 발전을 이뤘다. tf.keras API와 즉시 실행 모드 덕분에 코어 프레임워크를 배우고 사용하고 디버그하기가 더 쉬워졌다. 그래프로 컴파일할 함수를 선별적으로 표시할 수 있고 5가지 방법으로 분산 학습 및 추론을 조율할 수 있다.

데이터 검증부터 추론 모델 관리에 이르기까지 머신러닝 파이프라인을 구축하기 위한 일체의 구성 요소 집합인 TFX도 있다. 브라우저 또는 Node.js에서 TensorFlow.js를 실행할 수 있으며 모바일 및 임베디드 디바이스에서 텐서플로우 라이트를 실행할 수 있다. 마지막으로, 텐서플로우용 스위프트는 모델 구축을 위한 새로운 가능성을 열어준다.

- 비용: 무료 오픈소스
- 플랫폼: 우분투 16.04 이상, 윈도우 7 이상, 맥OS 10.12.6(시에라) 이상(GPU 지원 안 됨), 라즈비안(Raspbian) 9.0 이상 editor@itworld.co.kr 

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.