카테고리 보관물: Deep Learning

TensorFlow 1.2.0 RC0 Release

텐서플로우 1.2.0 RC0 버전이 릴리즈되었습니다. 주의해야할 사항은 버전 1.1.0에서 변경된 RNNCell이 다시 변경된 점입니다.

1.1.0 버전에서는 이전처럼 MultiRNNCell([lstm] * 5) 쓰면 레이어간 변수가 공용되었습니다. 그래서 1.1.0 버전에서 RNN 코드를 MultiRNNCell([LSTMCell(...) for _ in range(5)]) 와 같이 써야했습니다. 텐서플로 첫걸음의 RNN 코드도 이를 반영하여 변경되었습니다. 이번 1.2.0 버전에서는 두 가지 경우를 모두 허용합니다. 전자의 경우 동일한 가중치가 공용되고 후자의 경우 각각의 가중치를 가지게 됩니다. 따라서 텐서플로우 1.0.1 버전에서 바로 1.2.0 으로 업그레이드할 때 코드의 동작방식이 완전히 달라지므로 주의해야 합니다.

입력 파이프라인을 위한 tf.contrib.data API 가 추가되었고 텐서보드의 새 버전이 포함되었다고 합니다. 그외 이번 버전에서 바뀐 자세한 내용은 릴리즈 노트를 참고하세요.

1.2.0 RC0 버전이 이미 PyPI에 등록되어 있기 때문에 pip 명령으로 간단하게 설치할 수 있습니다. 텐서플로우 바이너리는 64bit 용이며, 윈도우즈에서는 파이썬 3.5 버전만을 지원합니다.

$ pip install --upgrade tensorflow

$ pip install --upgrade tensorflow-gpu

TPU2 for training and inference

5

작년에 이어 구글 IO 2017에서 새로운 TPU를 발표하였습니다. TPU2는 180 테라플롭teraflop의 성능을 가지고 있고 TPU1과는 달리 모델 훈련에도 사용할 수 있습니다. 이는 얼마전 발표됐던 NVIDIA의 볼타Volta의 최고 성능 테라플롭 120을 크게 앞서는 수치입니다. 기사에 따르면 위 이미지에서 볼 수 있듯이 45 테라플롭의 TPU코어 네개가 모여 180 테라플롭의 성능을 만들고 16비트 반정도half-precision 부동소수점을 사용하는 것으로 보입니다. 거기에 더불어 1,000개의 TPU2가 장착된 구글 클라우드(TensorFlow Research Cloud, TFRC)를 전 세계 연구자들에게 무료로 제공한다고 합니다. 누구나 온라인을 통해 신청할 수 있습니다. 신청 양식을 보면 상당히 간략하게만 쓰도록 되어 있어서 어떤 기준으로 선정이 될지 감을 잡기 힘드네요. TPU2에 TFRC 까지 구글이 페이스북과 NVIDIA와 벌이는 경쟁이 흥미롭고 또 놀랍습니다. TPU2의 페이퍼가 공개되지는 않았습니다만 이전 사례를 보았을 때 늦게라도 나올 가능성을 기대해 봅니다.

[Review] ML with TensorFlow

title매닝Manning 출판사의 텐서플로우 책인 “Machine Learning with TensorFlow“가 거의 원고를 마무리하고 곧 출간될 예정입니다. 이 책의 최신 MEAP 버전을 바탕으로 간략히 리뷰를 작성합니다.

이 책은 텐서플로우를 이용하여 머신 러닝 알고리즘을 작성하는 챕터들로 구성되어 있습니다. 머신 러닝의 관점에서도 텐서플로우의 관점에서도 모두 입문서에 해당합니다. 크게 세가지 파트로 나뉘어져 있으면 첫 번째는 머신 러닝과 텐서플로우의 소개, 두 번째 파트는 회귀, 분류, 군집, 히든 마코브Hidden Markov 모델을 소개합니다. 마지막 세 번째 파트에서는 오토인코더autoencoder, 강화 학습, CNN, RNN을 다룹니다.

1장에서 대부분의 다른 책들 처럼 머신 러닝에 대한 개괄적인 소개를 하고 있습니다. 모델, 파라미터, 학습, 추론(여기서 말하는 추론은 통계의 추론이 아니고 머신 러닝의 예측을 말합니다), 특성 등을 포함합니다. 그리고 L1, L2 노름을 포함하여 일반화된 노름norm에 대해서 잘 설명하고 있습니다. 그리고 세가지의 큰 머신 러닝 분류인 지도 학습, 비지도 학습, 강화 학습을 사례를 들어 차이를 설명합니다. 씨아노Theano, 토치Torch, 카페Caffe에 대해 간략히 소개하고 텐서플로우를 사용하려는 이유와 소개를 합니다. 그런데 scikit-learn이 비교적 저수준(?) 라이브러리이기 때문에 텐서플로우 같은 고수준(?) 라이브러리를 쓴다는 말이 좀 어색하네요. 이 챕터의 마지막에는 책 전체에서 챕터별로 각각 어떤 알고리즘들을 다룰 것인지를 그림과 표로 요약해서 보여주고 있습니다. 이런 정리는 책의 전체 내용을 쉽게 파악하게 도와주므로 아주 좋은 것 같습니다.

계속 읽기

TF 성능 팁: Winograd 알고리즘 설정

텐서플로우tensorflow에서 훈련 성능을 높일 수 있는 위노그라드Winograd 콘볼루션 알고리즘이 디폴트로 활성화되어 있지 않습니다. ResNet을 비롯하여 요즘 규모의 콘볼루션 모델들에서 3×3 필터가 대세로 자리잡고 있습니다. 위노그라드 알고리즘은 3×3 행렬 계산의 연산 횟수를 줄여 줌으로써 모델 훈련 성능이 크게 증가됩니다. 이미 NVIDIA는 cuDNN5에서 부터 위노그라드 콘볼루션을 지원하고 있습니다. 일례로 Wide ResNet 에서 CIFAR10 데이터로 훈련시킬 때 K80 GPU에서 35%정도 빨라졌다고 합니다. 하지만 성능 개선의 정도는 GPU에 따라 다릅니다. 이 설정을 하려면 쉘이나 파이썬에서 아래와 같이 환경변수 TF_ENABLE_WINOGRAD_NONFUSED 를 지정해야 합니다.

os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
$export TF_ENABLE_WINOGRAD_NONFUSED=1

위노그라드 알고리즘의 설정이 파이토치PyTorch와의 성능 차이 요인 중 하나로 지적되면서 조만간 기본으로 사용하도록 설정될 것 같습니다. 일전에 소개해 드린 텐서플로우의 성능 테스트에서 사용한 코드도 위노그라드 설정을 지정하고 있습니다.

얼마전 NVIDIA가 GTC17에서 선보인 볼타Volta 아키텍처에서 16비트 부동소수점을 사용하여 성능을 크게 올렸다고 발표했습니다. 이와 동시에 페이스북이 지원하고 있는 Caffe2가 이미 16비트 부동소숫점을 지원한다고 발표했고 파이토치도 곧 기능을 추가할 거라고 언급했습니다. 아무래도 NVIDIA와 페이스북 간의 공조가 더 긴밀한 듯 합니다. 🙂

fairseq: New SOTA of NMT

18158912_821511514668337_8758096610476425216_n

페이스북의 FAIR팀에서 블로그를 통해 기계번역에 대한 새 모델 fairseq를 공개하였습니다. 기계번역 분야에서는 리커런트 뉴럴 네트워크Recurrent Neural Network가 정석처럼 사용되어 왔습니다만 최근에 콘볼루션 뉴럴 네트워크Convolution Neural Network를 시퀀스 처리에도 사용되고 있습니다. fairseq는 콘볼루션 뉴럴 네트워크와 어텐션 메카니즘을 사용해 기계 번역에서 최고 성능state-of-the-art을 갱신했다고 합니다. 블로그에서 콘볼루션이 단어 한개씩 처리하는 RNN 보다 훨씬 효율적으로 GPU를 사용할 수 있고 전체 문맥을 한꺼번에 조망하는 것이 사람이 번역하는 그것과 비슷하다고 주장합니다. 최근 구글의 NMT 결과와 비교했을 때 더 성능이 높으면서도 NVidia K40 GPU에서 무려 9.3배가 빠르고 GTX-1080ti 에서는 21배나 빠르다고 합니다.

fairseq의 토치 소스는 깃허브에 공개되어 있으며 영어-프랑스어, 영어-독일어, 영어-루마니아어에 대해서는 미리 학습시킨 모델을 제공합니다. 콘볼루션이 주류가 된다면 NLP 책들의 수정이 불가피 하겠네요. 🙂

TF의 텐서와 상수, 변수, 플레이스홀더

텐서플로우TensorFlow의 기본 데이터 구조인 텐서Tensor는 보통 다차원 배열이라고 말합니다. 텐서플로우에는 세 가지의 핵심 데이터 구조인 상수Constant, 변수Variable, 플레이스홀더Placeholder가 있습니다. 텐서와 이 세 가지 타입은 어떤 관계가 있는 것일까요? “텐서플로 첫걸음“에서는 이들에 대한 자세한 설명이 없이 바로 선형회귀 모델을 간단히 만드는 것으로 시작하고 있습니다. 이 글에서 책에서 부족했던 텐서와 상수, 변수, 플레이스홀더에 대해 살펴 보겠습니다.

텐서플로우의 텐서를 다차원 배열로 많이 설명하지만 이는 맞기도 하고 틀리기도 합니다. 이로 인해 다소 오해도 발생합니다. C++ API에서 말하는 텐서는 다차원 배열에 가깝습니다. 메모리를 할당하고 데이터 구조를 직접 챙깁니다. 하지만 파이썬 API 입장에서 텐서는 메모리를 할당하거나 어떤 값을 가지고 있지 않으며 계산 그래프의 연산(Operation) 노드(Node)를 가리키는 객체에 가깝습니다. 우리가 주로 다루는 파이썬 API의 텐서는 넘파이(NumPy)의 다차원 배열 보다는 어떤 함수를 의미하는 수학 분야의 텐서에 더 비슷합니다.

상수 텐서 하나를 만들어 보겠습니다(이 글에 있는 코드는 주피터 노트북에서 작성된 것으로 명시적으로 print 문을 사용하지 않고 있습니다. 이 노트북은 깃허브에서 볼 수 있습니다). 기본 그래프에 상수나 변수를 계속 추가하면 들여다 보기가 어려우므로 각기 그래프를 따로 만들겠습니다.

계속 읽기

TensorFlow 1.1.0 Release

텐서플로우 1.1.0 버전이 릴리즈 되었습니다. PyPI에 등록된 패키지를 pip 명령으로 간단하게 설치할 수 있습니다. 텐서플로우 바이너리는 64bit 용이며 윈도우즈(파이썬 3.5)를 제외하고는 대부분의 파이썬 버전을 지원합니다.

$ pip install --upgrade tensorflow

$ pip install --upgrade tensorflow-gpu

CS 228: Probabilistic Graphical Models Lecture Notes

확률 그래프 모델(Probabilistic Graphical Models)의 유명한 강의로는 벤처 회사 칼리코(Calico)로 간 다프네 콜러Daphne Koller 스탠포드 교수의 코세라 강의 ‘Probabilistic Graphical Models‘가 있습니다. 또 다프네 콜러의 동명의 저서도 유명합니다. 이보다 조금 더 부드럽게 시작할 수 있는 자료로 스탠포드 CS 228 강의 노트가 웹 사이트로 공개되었습니다. 동영상 보다 글을 좋아하지만 책은 부담스러운(정말 부담스럽습니다:) 경우에 딱 좋은 것 같습니다.

Caffe2: Mobile first DL Framework

스크린샷 2017-04-19 오후 4.57.55

페이스북이 딥러닝 프레임워크 카페(Caffe)의 새로운 포크인 카페2(Caffe2)를 오늘 공개하였습니다. 카페2는 페이스북과 NVidia를 비롯해 많은 회사들과 협력한 결과라고 합니다. 특별히 NVidia에서도 블로그를 통해 카페2 소식을 알렸습니다. 카페를 개발한 양칭 지아Yangqing Jia가 버클리를 나와서 구글 브레인으로 갔었는데 어느새 페이스북으로 옮겼군요. 이미 작년에 카페2의 개발 소식이 흘러나왔던 것 같습니다. 카페2는 파이토치와는 다르게 모바일과 대용량 스케일의 상용 제품을 위한 프레임워크로 촛점을 맞추고 있다고 합니다. 그렇다고 파이토치와 명확하게 선을 그을 수는 없지만, 파이토치 보다는 더 성능과 다양한 디바이스 포팅에 중점을 두고 있습니다. 파이토치는 연구자들이 다양한 네트워크를 실험할 수 있는 높은 자유도가 장점입니다. 하지만 카페2와 파이토치의 저수준 라이브러리들은 앞으로 계속 머지되거나 아이디어를 공유할 것 같습니다. 바이두가 텐서플로우의 패치를 보냈는데 구글이 이를 거부했다는 소식에서 부터 구글이 사용하는 텐서플로우와 오픈소스 텐서플로우에는 차이가 있다는 것이 카페2와 함께 레딧해커뉴스에서 회자되고 있습니다.

현재 카페2가 안정화된 상태는 아닙니다. 양칭에 의하면 페이스북이 먼저 개밥먹기를 하고 있답니다. 파이썬 바이너리 패키지가 준비되어 있지 않아 설치도 번거롭습니다. 하지만 카페의 Model zoo를 이용할 수 있다는 것과 모바일 퍼스트 정책은 많은 사람들의 관심을 끌것 같습니다. OpenCL와 iOS의 Metal을 지원하려고 준비 중에 있다고 합니다.

누가 Caffe가 죽었다고 했던가요? 🙂

(업데이트) 구글 브레인의 리더 Rajat Monga 가 바로 댓글로 의견을 냈네요. 구글이 텐서플로우에 대해 감추고 있는 것은 없답니다.

또 페이스북에서 F8 행상 이후에 몇몇 대학 교수를 초빙해서 카페2에 대한 워크샵을 열 예정이라고 밝혔습니다. 이미 많은 대학의 딥러닝 커리큘럼이 텐서플로우로 가고 있어서 더 늦기전에 변화가 필요하다고 생각했을 것 같습니다.

TensorFlow 1.1.0 RC2 and Imperative Style

텐서플로우 1.1.0 버전의 RC2 가 릴리즈 되었습니다. 1.1.0 RC2 의 CPU, GPU 버전이 PYPI에 등록되어 있으므로 pip 명령으로 간단하게 설치할 수 있습니다. 텐서플로우 바이너리는 64bit 용이며 윈도우즈(파이썬 3.5)를 제외하고는 대부분의 파이썬 버전을 지원합니다. 만약 안정적인 버전의 텐서플로우를 설치하시려면 tensorflow==1.0.1 와 같이 텐서플로우 패키지 이름 뒤에 버전을 명시하면 됩니다.

$ pip install --upgrade tensorflow

$ pip install --upgrade tensorflow-gpu

텐서플로우 1.1.0 버전의 릴리즈 노트에는 없지만 contrib 폴더에 텐서플로우의 명령형(imperative) 스타일을 지원하는 라이브러리가 추가되어 있습니다. 요즘 많은 관심을 끌고 있는 파이토치(PyTorch)나 MXNet 등을 의식한 것일까요? 선언적(declarative)인 계산 그래프의 생성이 수면 아래로 내려가 샘플 코드를 보면 깔끔해진 것을 볼 수 있습니다.

import tensorflow.contrib.imperative as tf
x = tf.Variable(np.random.normal(size=[2, 2]), dtype=tf.float32)
y = tf.constant([[1, 2.]])
z = tf.matmul(y, x)
print(z)
array([[-1.231673  ,  3.14744973]], dtype=float32)

NumPy 사용하듯 텐서 계산을 할 수 있고 파이썬의 while, for, if 문을 사용해 계산 그래프를 만들 수 있습니다. 단점은 기본 텐서플로우보다 속도가 느려진다는 것과 모델을 훈련 시킬때 파이썬 반복문에 의해 그래프가 계속 자라나지 않도록 tf.step() 을 사용해야 합니다. 조금 더 자세한 예제는 깃허브를 참고하세요.