안녕하세요.


이번에는 Docker를 이용해 구축한 TensorFlow(이하 텐서플로우)의 학습된 정보 (training)를 Tensorboard(이하 텐서보드)로 시각화는 방법을 다뤄 보겠습니다.


앞서 소개한 바 있는 Docker로 Windows에서 텐서플로우 수행하기 포스트에서 생성한 도커 컨테이너에서는 버그로 인해 텐서보드가 수행되지 않지 않는 현상이 있어 불가피하게 새로운 컨테이너를 만들어야 합니다.

귀찮겠지만 다음과 같이 새로운 컨테이너를 만들도록 합시다.   


1. 0.9 버전의 텐서플로우 컨테이너 만들기


Docker Quickstart Terminal를 실행한 후 현재 실행 중인 컨테이너 정보를 확인합시다.


$ docker ps -a


기존에 설치한 컨테이너가 수행 중이라면 정지하고 새로운 이미지를 다운로드 받아 설치합니다.


$ docker stop {수행중인 컨테이너 이름} $ docker run -p 8888:8888 -p 6006:6006 -it b.gcr.io/tensorflow/tensorflow:r0.9-devel

b.gcr.io/tensorflow/tensorflow 다음 콜론(:) 구분자 다음은 태그를 지칭하고 여기서 r0.9-devel 은 0.9 개발자 버전을 의미합니다.

(글을 작성하는 시점에서 텐서플로우는 활발히 개발 중인 프로젝트임으로 다음 링크에서 최신 버전에 대한 태그를 확인하기 바랍니다.)


또한 -d 옵션은 포트 포워딩을 의미하는데 jupyter가 사용하는 기본 포트인 8888과 텐서보드가 사용하는 포트인 6006를 전달해서 외부(즉, windows) 상에서 접속할 수 있게 해 줍니다.


다운로드가 완료되면 새로운 컨테이너가 생성되고 기본 값으로 bash 가 실행됩니다.


2. jupyter 실행하기


root@{컨테이너 아이디}:/# cd /


루트 폴더로 이동하면 jupyter를 실행할 수 있는 shell script 가 준비되어 있습니다. 이전 이미지는 컨테이너 생성 후 바로 이 스크립트를 수행하도록 지정되어 있으나 이 개발자 버전에서는 사용자가 직접 이 스크립트를 수행해 주어야 합니다.

bash가 종료되더라도 jupyter가 종료되지 않도록 nohup 으로 수행하고 새로운 process로 띄우기 위해 & 옵션을 줍시다.


root@{컨테이너 아이디}:/# nohup ./run_jupyter.sh


이제 windows에서 브라우저로 다음 경로에 접속해 jupyter를 실행합니다: 

http://192.168.99.100:8888/


3. 텐서보드 실행하기


텐서보드는 jupyter처럼 웹서비스로 동작합니다. 따라서 이를 실행하기 위해 run_jupyter.sh 와 같은 run_tensorboard.sh 스크립트를 만들어 보도록 하겠습니다.


root@{컨테이너 아이디}:/# nohup tensorboard --logdir=/logs --port 6006 &


여기서 logdir은 텐서플로우 프로그램에서 지정하는 로그 경로를 의미하고 port 는 사용할 포트를 의미합니다.

이제, windows 의 브라우저로 텐서보드를 접속해봅시다: 

http://192.168.99.100:6006/


아직 텐서플로우로 학습한 바가 없어서 아무런 기록이 없습니다.

4. 샘플코드 수행하기

jupyter에서 새로운 ipython 파일을 생성하고 샘플코드를 입력합시다.


import tensorflow as tf

# reset everything to rerun in jupyter
tf.reset_default_graph()

# config
batch_size = 100
learning_rate = 0.5
training_epochs = 5
logs_path = "/logs"

# load mnist data set
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# input images
with tf.name_scope('input'):
    # None -> batch size can be any size, 784 -> flattened mnist image
    x = tf.placeholder(tf.float32, shape=[None, 784], name="x-input") 
    # target 10 output classes
    y_ = tf.placeholder(tf.float32, shape=[None, 10], name="y-input")

# model parameters will change during training so we use tf.Variable
with tf.name_scope("weights"):
    W = tf.Variable(tf.zeros([784, 10]))

# bias
with tf.name_scope("biases"):
    b = tf.Variable(tf.zeros([10]))

# implement model
with tf.name_scope("softmax"):
    # y is our prediction
    y = tf.nn.softmax(tf.matmul(x,W) + b)

# specify cost function
with tf.name_scope('cross_entropy'):
    # this is our cost
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

# specify optimizer
with tf.name_scope('train'):
    # optimizer is an "operation" which we can execute in a session
    train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

with tf.name_scope('Accuracy'):
    # Accuracy
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
# create a summary for our cost and accuracy
tf.scalar_summary("cost", cross_entropy)
tf.scalar_summary("accuracy", accuracy)

# merge all summaries into a single "operation" which we can execute in a session 
summary_op = tf.merge_all_summaries()

with tf.Session() as sess:
    # variables need to be initialized before we can use them
    sess.run(tf.initialize_all_variables())

    # create log writer object
    writer = tf.train.SummaryWriter(logs_path, graph=tf.get_default_graph())
        
    # perform training cycles
    for epoch in range(training_epochs):
        
        # number of batches in one epoch
        batch_count = int(mnist.train.num_examples/batch_size)
        
        for i in range(batch_count):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            
            # perform the operations we defined earlier on batch
            _, summary = sess.run([train_op, summary_op], feed_dict={x: batch_x, y_: batch_y})
            
            # write log
            writer.add_summary(summary, epoch * batch_count + i)
            
        if epoch % 5 == 0: 
            print "Epoch: ", epoch 
    print "Accuracy: ", accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})
    print "done"

MNIST 데이터셋(수기로 작성한 숫자를 모아 구분하는 데이터셋)을 이용해 간단한 소프트맥스 로지스틱스 회기 분류로 학습 후 평가하는 모델을 수행해 봅니다.

이때, 텐서보드를 위해 추가되는 코드는 다음과 같습니다.


  • logs_path = "/logs" : 텐서보드가 참조할 로그 정보가 저장될 경로를 지정
  • tf.scalar_summary("cost", cross_entropy)
    tf.scalar_summary("accuracy", accuracy)
    summary_op = tf.merge_all_summaries()

    : EVENTS 항목에 표시할 요약 정보로 cost와 accuracy를 지정
  • writer = tf.train.SummaryWriter(logs_path, graph=tf.get_default_graph())
    : SummaryWriter 개체를 생성해 로그 경로에 현재 그래프를 지정
  • _, summary = sess.run([train_op, summary_op], feed_dict={x: batch_x, y_: batch_y})
    : training과 summary operation을 수행
  • writer.add_summary(summary, epoch * batch_count + i)
    : minibatch 수행 시마다 결과 요약 저장

5. 텐서보드에서 결과 확인

텐서보드는 events, images, audios, graphs, histograms 항목으로 구성되어 있습니다.

이번 샘플 코드에서는 events 와 graphs 에 관한 정보만 저장됩니다.




events 항목에서 학습으로 인해 accuracy가 증가되면서 cost 가 주는 모습을 보여주는 도식을 볼 수 있으며, graphs 항목에서는 모델의 형태와 텐서의 흐름을 역동적으로 볼 수 있습니다.


5. 참고자료



안녕하세요. 


docker image를 이용해 windows PC에서 텐서플로우를 사용하는 방안 에 덧붙여 이번에는 클라우드 환경에서 텐서플로우 딥러닝 개발을 할 수 있는 방안을 검토해 본 결과를 공유합니다.

요약하면, 다음과 같습니다.

  • 아마존 웹 서비스 기반 
    • 장점: GPU를 활용한 컴퓨팅 파워로 방대한 데이터로 인해 학습 시간이 많이 소요될 경우 활용 가치가 높음
    • 단점: 시간 당 사용 비용 모델(성능에 따라 대략 시간 당 천원에서 4천원 꼴)로 모델링 검증 완료 후 효과적으로 활용 필요

  • 구글 클라우드 플랫폼 기반
    • 장점: 베타 버전이라 요금이 싸고 텐서플로우를 개발하는 주최가 구글이라 빠른 개선이 기대됨.
      60일 무료 기간을 이용해  온라인에서 놀이터(playground) 목적으로 모델링을 하거나 학습이 오래 걸리더라도 상관없는 경우에 활용할 가치가 많음
    • 단점: 지금까지는 GPU 기반 컴퓨팅을 활용할 수 없는 것으로 보이고 preview인 cloud machine learning 서비스가 오픈되면 재 검토 필요




다량의 컴퓨팅 능력을 요하는 텐서플로우의 특성 때문에 연구에 있어 컴퓨팅 기기의 수요가 많은데 클라우드 서비스를 통해 대여해서 사용할 수 있다는 점에 착안하여 다음 양대 클라우드 서비스를 필두로 조사를 시작했습니다.

  1. 아마존 웹서비스(AWS)
  2. 구글 클라우드 플랫폼 (GCP)

1. 아마존 웹 서비스로 텐서플로우 구축하기


전자의 경우, 인스턴스를 구축하고 직접 관련 서비스를 설치하는 IaaS 형태로 필요한 하드웨어를 직접 설정하거나 정해진 목적에 따라 marketplace를 통해 손쉽게 인스턴스를 구축할 수 있도록 제공합니다. 검색 결과 64 bit linux 기반에 GPU를 이용하는 아마존 머신 이미지 (AMI) 가 등록되어 있음을 찾을 수 있었습니다. 



현재 소프트웨어 사용료 없이 EC2 사용료만 부과되고 아마존은 지역(region)에 따라 사용료가 달라지는 특성 상 글을 작성하는 시점에서 가장 저렴한 지역 (미국 동부지역) 기준으로 시간당 0.65 달러 / 2.6달러이며 (한국 돈으로 환산하면 대략 천원 내외/ 4천원 내외 예상) 각각의 하드웨어 스펙은 다음과 같습니다.

가격 발생 부담 때문에 직접 사용해보고 평가하지는 못했는데 추후 각각의 성능을 검토해 볼 예정입니다.


2. 구글 클라우드 플랫폼으로 텐서플로우 구축하기

후자인 GCP는 AWS와 다르게 PaaS 나 SaaS 형태가 두드러지며 각각 Products 를 활용해 Solutions 을 구축하는 방법을 가이드 하는 형태로 제공합니다.


최근 소식에 따르면 구글에서 TensorFlow 를 활용한 클라우드 기계학습 플랫폼을 준비중인데 아직 limited preview 단계라 활용 사유를 적고 대기해서 선정되어야만 활용할 수 있어 아쉬웠습니다.


그렇다고 클라우드에서 텐서플로우를 사용할 수 없는 것만은 아닙니다. 아래 링크는 시계열 금융 데이터로 기계학습한 사례를 다루고 있는데 이때 GCP의 또다른 제품인 Cloud Datalab를 활용하고 있음을 알 수 있었습니다.

https://cloud.google.com/solutions/machine-learning-with-financial-time-series-data


이 서비스의 특징은 원 클릭으로 Google App Engine과 Google Compute Engine을 이용해 Google BigQuery, IPython 및 TensorFlow를 지원하는 jupyter server를 생성해 주는데 다음과 같이 VM 기본 설정이 그다지 좋지는 않습니다.

  • 머신유형: n1-standard-1 (CPU 1개에 4GB 의 메모리를 가진 Intel Haswell 플랫폼)
  • 100 GB 스토리지

AWS 에 비해 활용 측면과 가격 측면이 유리하다고 판단되는데 datalab의 경우 현재 베타 버전인 관계로 App Engine 가격 정책만 따른다고 명시되어 있어 부담없이 신규 인스턴스를 만들어 수행해 볼 수 있습니다. 자세한 사용법은 다음 링크를 참고하시면 됩니다.

https://cloud.google.com/datalab/docs/quickstart   

GCP는 현재 신규 가입 시 60일 간 무료 사용에 500달러를 추가 제공하고 있으니 이 기간동안 활용해 보면서 성능을 평가해보려고 합니다.

다음은 생성된 인스턴스로 동작하는 jupyter service 입니다.

기존 활용했던 docker image 기반의 설치형 jupyter와 가장 큰 차이점은 git 리포지토리와 연결 할 수 있도록 기본 제공한다는 점입니다. 클라우드 서비스의 특성 처럼 시간이 지날 수록 개선될 것으로 보입니다.

이후 이 서비스를 기반으로 학습 시간이 많이 소요되는 benchmark를 선정해 수행하고 수행시간을 비교해 보고자 합니다.

이상입니다.


P.S. 마지막으로 설치된 텐서플로우의 버전이 궁금해서 확인할 방법을 찾았으나 마땅히 검색되는 것이 없더군요. 흥미로운 점은 python 텐서플로우 모듈의 버전을 출력해 보면 0.8.0 기준으로 설치한 docker image와 Cloud Datalab 모두 0.7.1 로 출력됩니다.

갑자기 텐서플로우의 버전 관리 (versioning) 가 제대로 이뤄지고 있는지 의구심이 들었습니다. :-(

  


  1. 1466359586 2016.06.20 03:06 신고

    좋은글 감사

  2. 1466388505 2016.06.20 11:08 신고

    잘보고가요~

안녕하세요.


한동대 김인중 교수님이 인공지능 및 기계 학습 관련 동향을 정리한 보고서가 있어 공유 및 보관 차원에서 스크랩합니다.

기계학습의 발전 동향, 산업화 사례 및 활성화 정책 방향


아래는 기록 차원에서 윗 글의 요약을 발췌한 것입니다.
되도록 원문을 읽어 보시길 권합니다.


Executive Summary

■ 인공지능 기계학습의 산업적 중요성

– SW는 이제 국가 전체의 경쟁력 확보를 위한 필수 요소가 되었다. 해외 선진 기업들은 고도화된 SW기술을 기반으로 전통적인 IT 분야 뿐 아니라 자동차, 의료, 경제, 교육, 문화 등 거의 모든 분야에서 혁신을 주도하고 있다.
– 인공지능 기계학습의 발달은 지적 활동의 자동화에 대한 가능성을 열고 있다는 점에서 그 파급 효과가 매우 크고 광범위할 것으로 전망된다.
– 최근 딥러닝을 중심으로 급격히 발전한 기계학습 기술은 실용화를 위한 요구 수준과 실제 인공지능 기술간의 격차를 크게 좁히며 다양한 지능형 시스템의 출현을 예고하고 있다.
– 인공지능 기계학습은 많은 양의 데이터가 발생하는 빅데이터나 사물인터넷 시대에 필수적인 핵심 SW기술이다.
– 구글, 테슬라를 비롯한 선진 SW기업들은 기계학습 기술을 스마트카, 핀테크, 스마트 헬스케어 등 고부가 가치 융합분야에 적용하여 새로운 가치를 창출하고 있다.

■ 기계학습 및 딥러닝 기술 소개

– 현재 기계학습 기술은 딥러닝을 중심으로 매우 급격히 발전하고 있다.
– 딥러닝은 데이터로부터 고수준의 정보를 학습하는 기술로 주로 깊은 신경망에 기반한다.
– 딥러닝의 핵심 방법론으로는 사전학습(pre-training) 알고리즘, 컨볼루션 네트워크(CNN), 순환신경망(RNN) 등이 있다.
– 딥러닝은 다양한 분야에 적용되어 기존 방법을 압도하는 탁월한 성능을 보이며, 인공지능 시스템의 실용화에 대한 기대를 높이고 있다.

■ 기계학습 기술의 최근 발전 동향 및 산업화 사례

– 기계학습 분야에서 최근 이루어진 주요 발전 내용은 새로운 딥러닝 모델 및 계층의 개발, 새로운 학습 알고리즘 및 학습 결과의 이해 방법, 딥러닝과 기존 방법론을 결합한 새로운 응용의 발굴 등이 있다.
– 구글, 마이크로소프트, 페이스북, 지멘스, 캐스피다, 크리테오, 아마존, NVIDIA 등의 선진 기업들은 기계학습 기술을 인터넷 서비스, 생산공정, 우편자동화, 의료, 보안, 광고, 배송, 지능형자동차 등 다양한 분야에 적용하여 수익을 창출하고 있을 뿐 아니라 새로운 시장을 개척하면서 주도권을 확보하고 있다.

■ 해외에서의 기계학습 기술 발전 및 산업 활성화 성공 요인

– 기계학습의 학문적/산업적 성공의 배경에는 학계의 뛰어난 리더들, 풍부한 공개 데이터, 지속성 있는 기술 컨테스트에 의한 성능 중심의 기술경쟁, 오픈소스, 연구성과 공유를 위한 빠른 출판 미디어, 연구 성과의 언론 보도에 의한 대중적 이슈화 등이 있다.
– 반면 우리나라에서는 전문 인력의 양적/질적 부족, 학습/평가 데이터의 부족, 성능보다 SCI 논문 중심의 경직된 평가제도 등이 기술 발전과 산업화의 장애물이 되고 있다.
– 기계학습 기술 발전 및 산업 활성화를 위해서는 이 같은 장애물들을 극복하고 해외에서 성공적이었던 제도 및 문화를 도입하여 좋은 기반을 구축하는 것이 필요하다.

■ 기계학습 기술 발전 및 산업 활성화를 위한 정책적 방안

– 기계학습 기술에 의한 변화에 효과적으로 대응하지 못할 경우 산업 전반에 있어서 세계적 추세를 따라가지 못하고 경쟁력을 잃어버릴 가능성이 있다. 따라서 기계학습 기술 발전 및 산업화에 대한 정부 차원의 큰 그림과 체계적 추진 및 지원이 요구된다.
– 깊이 있는 기계학습 전문가를 육성하기 위해서는 오픈소스를 활용한 응용 연구 뿐 아니라 방법론 중심의 심도 있는 연구에 대한 지원이 필요하다.
– 기술 컨테스트를 지속적으로 개최하여 현실적 문제들을 제시하고, 참가팀들의 기술을 성능 중심으로 평가한 후, 그 결과를 공개한다면 해외의 사례와 같이 학계 및 산업계의 투명성을 높이고, 논문보다 성능 중심의 실질적 연구를 장려하는 효과를 거둘 수 있을 것이다.
– 기계학습에 필수적인 학습/평가 데이터와 컴퓨팅 인프라를 구축하고 기술 컨테스트와 연동하여 제공한다면 정부의 지원이 실질적인 핵심 기술의 개선으로 이어지도록 유도할 수 있을 것이다.

+ Recent posts