태그 보관물: TensorFlow

이펙티브 텐서플로 2.0

이 글은 “Effective TensorFlow 2.0“을  번역한 것입니다. 이 글은 텐서플로 문서 깃허브에 머지되어 있습니다. 잘못된 점이 있으면 블로그를 통해 알려 주시거나 깃허브에 PR을 보내 주세요.

이펙티브 텐서플로 2.0

Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수 있습니다. 이 번역에 개선할 부분이 있다면 tensorflow/docs 깃헙 저장소로 풀 리퀘스트를 보내주시기 바랍니다. 문서 번역이나 리뷰에 지원하려면 이 양식을 작성하거나 docs@tensorflow.org로 메일을 보내주시기 바랍니다.

텐서플로 2.0은 사용자의 생산성을 향상시키기 위해서 많은 것을 바꾸었습니다. 불필요한 API를 제거하고 API의 일관성을 높였으며(Unified RNNs,
Unified Optimizers) 파이썬 런타임(runtime)과 즉시 실행(eager execution)을 통합하였습니다.

여러 RFC 문서에서 텐서플로 2.0의 변경 내용을 확인할 수 있습니다. 이 가이드에서는 텐서플로 2.0을 사용한 개발 방식을 소개합니다. 여러분이 텐서플로 1.x에 친숙하다고 가정하겠습니다.

주요 변경 사항 요약

API 정리

많은 API가 TF 2.0에서 삭제 또는 이동되었습니다. 주요한 변화는 다음과 같습니다. tf.app, tf.flags, tf.logging을 삭제하고 absl-py 오픈 소스를 권장합니다. tf.contrib 아래에 있던 프로젝트를 이동했습니다. 자주 사용하지 않는 함수를 tf.math 같은 서브패키지(subpackage)로 이동하는 식으로 tf.* 네임스페이스(namespace)를 정리하였습니다. tf.summary, tf.keras.metrics, tf.keras.optimizers와 같은 일부 API는 2.0 버전으로 교체되었습니다. 교체된 이름을 자동으로 적용하려면 v2 upgrade script 사용하는 것이 가장 편리합니다.

즉시 실행

텐서플로 1.x에서는 사용자가 tf.* API를 호출해서 추상 구문 트리를 수동으로 구성했습니다. 그다음 session.run()을 호출할 때 출력 텐서와 입력 텐서를 전달하여 추상 구문 트리를 수동으로 컴파일합니다. 텐서플로 2.0은 (보통의 파이썬처럼) 즉시 실행됩니다. 텐서플로 2.0에서 그래프와 세션은 구현 상세(implementation detail)처럼 느껴질 것입니다.

즉시 실행으로 인한 부수효과 중 하나는 더이상 tf.control_dependencies()이 필요하지 않다는 것입니다. 모든 코드는 라인 순서대로 실행됩니다(tf.function 안의 코드도 이 효과로 쓰여진 순서대로 실행됩니다).

전역 메커니즘 제거

텐서플로 1.x는 겉으로 드러나진 않았지만 전역 이름 공간(namespace)에 크게 의존했습니다. tf.Variable()를 호출하면 기본 그래프에 노드(node)를 추가합니다. 노드를 참조하는 파이썬 변수가 삭제되더라도 그래프에 그대로 남아 있습니다. 이 tf.Variable 노드를 다시 참조할 수 있지만 생성할 때 지정한 이름을 알아야만 가능합니다. 변수를 직접 만들지 않았다면 어려운 일입니다. 이 때문에 사용자와 프레임워크가 변수를 추적할 수 있도록 여러 종류의 메커니즘이 늘어 났습니다. 변수 범위(variable scope), 전역 컬렉션(global collection), tf.get_global_step()이나 tf.global_variables_initializer() 같은 헬퍼 메서드 등입니다. 또 옵티마이저(optimizer)는 암묵적으로 훈련 가능한 모든 변수의 그래디언트(graident)를 계산합니다. 텐서플로 2.0은 이런 모든 메커니즘을 삭제했습니다(Variables 2.0 RFC). 대신 파이썬 변수를 추적하는 기본 메커니즘을 사용합니다! tf.Variable의 참조를 잃어 버렸다면 자동으로 가비지 컬렉션(garbage collection)될 것입니다.

사용자가 변수를 관리하는 일이 늘어나지만 케라스(Keras)(아래 참조)를 사용하면 최소화할 수 있습니다.

세션 대신 함수

session.run()은 거의 함수 호출과 비슷합니다. 입력과 함수를 지정하면 일련의 출력을 얻습니다. 텐서플로 2.0에서는 tf.function() 데코레이터(decorator)로 파이썬 함수를 감쌀 수 있습니다. 이렇게 하면 텐서플로가 이 함수를 하나의 그래프로 실행하기 위해 JIT 컴파일합니다(Functions 2.0 RFC). 이 메커니즘 덕택에 텐서플로 2.0에서 그래프 모드의 장점을 모두 계승할 수 있습니다.

  • 성능: 함수를 최적화할 수 있습니다(노드 가지치기(pruning), 커널 융합(kernel fusion) 등).
  • 이식성(portability): 함수를 저장하고 다시 불러올 수 있습니다(SavedModel 2.0 RFC). 모듈화된 텐서플로 함수를 재사용하고 공유할 수 있습니다.
# 텐서플로 1.x
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# 텐서플로 2.0
outputs = f(input)

파이썬과 텐서플로 코드를 자유롭게 섞어 쓸 수 있기 때문에 파이썬의 장점을 최대한 활용할 수 있습니다. 텐서플로는 파이썬 인터프리터가 없는 모바일, C++, 자바스크립트 같은 환경에서도 실행됩니다. 사용자가 환경에 따라 코드를 재작성하지 않도록 @tf.function를 추가하면 오토그래프(AutoGraph)가 파이썬 코드를 동일한 텐서플로 코드로 변경합니다.

  • for/while -> tf.while_loop (breakcontinue 문을 지원합니다.)
  • if -> tf.cond
  • for _ in dataset -> dataset.reduce

오토그래프는 임의의 중첩된 제어 흐름도 지원합니다. 시퀀스(sequence) 모델, 강화 학습(reinforcement learning), 독자적인 훈련 루프 등 복잡한 머신러닝 프로그램을 간결하면서 높은 성능을 내도록 구현할 수 있습니다.

계속 읽기

TensorFlow 1.13.0 RC2 Release

텐서플로 1.13.0 RC2 버전이 릴리스되었습니다. 이제 공식적으로 파이썬 3.7 바이너리를 지원합니다. macOS와 리눅스는 파이썬 2.7, 3.3, 3.4, 3.5, 3.6, 3.7을 지원하고 Windows는 파이썬 3.5, 3.6, 3.7을 지원합니다.

자세한 내용은 릴리스 노트를 참고하세요. 텐서플로 1.13.0 RC2 버전은 pip를 사용해 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

TensorFlow 공식 케라스 튜토리얼 한글화

tensorflow-docs

텐서플로의 공식 케라스 튜토리얼을 한글로 번역했습니다. 어제 텐서플로 사이트에 정식으로 배포되었네요! 🙂

아직 케라스 튜토리얼(Learn and use ML)만 번역되어 있습니다. 향후 번역은 텐서플로 2.0에 맞추어 진행하려고 합니다. 3월 텐서플로 Dev 서밋이 기다려지네요! 어쩌면 텐서플로 사이트가 새로 단장될지도 모르겠습니다. 🙂

TensorFlow 1.13.0 RC1 Release

텐서플로 1.13.0 RC1 버전이 릴리스되었습니다. 아직 파이썬 3.7 바이너리는 지원하지 않습니다. 자세한 내용은 릴리스 노트를 참고하세요.

텐서플로 1.13.0 RC1 버전은 pip를 사용해 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

(업데이트) 리눅스, 맥, 윈도우즈 용 Python 3.7 바이너리를 지원하기 시작했습니다.

TensorFlow 1.13.0 support Python 3.7

그동안 텐서플로는 파이썬 3.6까지만 바이너리가 릴리스되었습니다. 많은 사람들이 파이썬 3.7 빌드를 원했었는데요. 텐서플로 1.13.0 부터 파이썬 3.7 바이너리가 공식적으로 릴리스될 예정입니다. tf-nightly 패키지에서 파이썬 3.7 빌드를 확인할 수 있습니다.

텐서플로 2.0 릴리스를 위한 깃허브 프로젝트 페이지도 오픈되었습니다. 물론 텐서플로 2.0도 파이썬 3.7을 공식적으로 지원할 예정입니다. 🙂

TensorFlow 1.13.0 RC0 Release

텐서플로 1.13.0 RC0 버전이 릴리스되었습니다. 두 달여 만에 릴리스입니다. TensorFlow Lite가 contrib 모듈 아래에서 코어로 승격되었습니다(tf.lite). 1.13.0 버전의 바이너리는 CUDA 10을 사용합니다. 더 자세한 내용은 릴리스 노트를 참고하세요.

텐서플로 1.13.0 RC0 버전은 pip를 사용해 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

텐서플로 2.0 준비로 한창 바쁜 것 같습니다. 텐서플로 Dev Summit이 3월에 열리는데 아마 이때쯤 나오지 않을까요? 🙂

TensorFlow nightly 2.0 preview

텐서플로 2.0 RC 버전이 언제 등장할지 아직 모르지만 맛보기는 가능합니다. 텐서플로 2.0 preview 버전이 pip로 제공되고 있습니다. 아쉽지만 리눅스 버전만 있습니다.

$ pip install tf-nightly-2.0-preview
$ pip install tf-nightly-gpu-2.0-preview

이 프리뷰는 현재 마스터 브랜치를 기반으로 빌드된 것 같습니다. 이전에 공지된 대로 tf.Session() 등이 tf.compat.v1 아래로 이동되고 즉시 실행(eager execution)이 기본으로 활성화됩니다.

텐서플로 2.0 방식을 적용한 MNIST 예제 노트북은 여기를 참고하세요. 이 노트북은 즉시 실행 튜토리얼과 많이 비슷한 것 같습니다. 또한 2.0 마이그레이션 스크립트를 참고하면 변경될 모습을 미리 가늠해 볼 수 있습니다. 🙂

(업데이트) 미디엄(Medium)에 텐서플로 2.0에 대한 포스팅이 올라왔습니다. 조만간 RC 버전이 릴리즈될 것 같네요. 이 글을 보면 이전에 언급한 대로 기존의 다양한 연산들이 케라스 API로 통일된다는 것을 알 수 있습니다. 케라스 API를 사용하는 방법은 Sequential 클래스나 Model 클래스입니다. 또한 tf.GradientTape() 함수를 사용하여 직접 그래디언트를 업데이트할 수도 있습니다. 다행히 Estimators는 구현이 바뀌겠지만 API는 유지된다고 하네요.

앞으로는 텐서플로를 배우려면 케라스를 배워야 합니다. 당연하지만 케라스를 배우는 가장 좋은 방법은 제가 번역한 <케라스 창시자에게 배우는 딥러닝> 책이죠! 🙂

TensorFlow 1.12.0 Release

텐서플로 1.12.0 버전이 릴리스되었습니다. 케라스 모델이 SavedModel 포맷(via tf.contrib.saved_model.save_keras_model())과 tf.data.Dataset을 지원합니다.

텐서플로 1.12.0 버전은 pip 명령으로 손쉽게 설치할 수 있습니다. 파이썬 2.7, 3.3, 3.4(이상 윈도우즈 제외), 3.5, 3.6 버전을 지원합니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

CPU 사용자를 위한 conda 텐서플로 패키지는 아직 1.12.0 버전이 준비되지 않았습니다. 🙂

pip install tensorflow vs conda install tensorflow

tensorflowtraining

아나콘나(Anaconda)의 텐서플로가 1.9.0 버전부터 MKL-DNN 라이브러리를 사용하여 패키징되었습니다. 이 때문에 pip에 등록된 텐서플로 패키지보다 몇 배 빠르다고 합니다(미디엄 포스트, 아나콘다 블로그). 물론 CPU를 사용할 경우에 국한된 이야기입니다. 아나콘다에 포함된 파이썬 과학 패키지들이 MKL 라이브러리의 덕을 보는데요. 이제 텐서플로도 해당되는 것 같습니다. 앞으로는 CPU 텐서플로 설치 안내에 꼭 아나콘다도 포함해야 겠네요. 🙂

TensorFlow 1.12.0 RC0 Release

텐서플로 1.12.0 RC0 버전이 릴리스되었습니다. 1.11.0 버전이 나온지 한달도 되지 않았는데 정말 빠르네요. 심지어 1.11.0 버전에 맞추어 재실행한 <핸즈온 머신러닝> 주피터 노트북을 아직 커밋하기도 전입니다. 🙂

케라스 모델을 SavedModel 포맷으로 저장할 수 있어(via tf.contrib.saved_model.save_keras_model()) 텐서플로 서빙에 사용할 수 있는 점이 눈에 띄입니다. 텐서플로 1.12.0 RC0 버전은 pip 명령으로 손쉽게 설치할 수 있습니다. 파이썬 2.7(윈도우즈제외), 3.5, 3.6 버전을 지원합니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

사이킷런 0.20 버전은 몇몇 버그를 수정한 0.20.1 버전이 릴리스될 것 같습니다. 🙂

(업데이트) 텐서플로 1.12.0 RC1 버전이 릴리스되었습니다.

(업데이트) 텐서플로 1.12.0 RC2 버전이 릴리스되었습니다.