conda tensorflow 설치 및 jupyter notebook 연결

삽질 기록 2018.08.03 23:20 Posted by 아는 개발자 아는 개발자

Conda 환경에서 tensorflow를 설치하는 방법


0. Prerequsite


- Anaconda를 설치한다.

- GPU를 사용할 경우 tensorflow를 사용할 수 있도록 CUDA, cuDNN 라이브러리를 설치한다.


1. tensorflow 가상 환경 생성


tensorflow를 사용하는 가상 환경을 하나 생성한다. 별도로 설정하고 싶은 환경이 있으면 생략하고 아니면 만들자.

kwony@kwony:~$ conda create -n tensorflow pip \ 
python={ python 버전 입력 ex) 2.7, 3.4

2. 가상환경 활성화


1에서 만들어둔 가상 환경을 활성화한다. activate 명령어가 안먹히는 경우는 anaconda의 바이너리가 export가 제대로 안된것이니 확인해보도록 하자.

kwony@kwony:~$ conda activate tensorflow
(tensorflow)$  # tensorflow로 명령어 프롬프트가 변형된다

3. tensorflow 설치


활성화된 명령어 프롬프트에서 tensorflow를 설치한다. tensorflow 공식 홈페이지에서 설치하려는 tensorflow의 종류와 파이선 버전에 해당하는 저장소를 입력하도록 하자.

(tensorflow) kwony@kwony:~$ pip install --ignore-installed \
 --upgrade { URL }

4. jupyter 설치


원래 아나콘다를 설치할 때 기본으로 포함된 jupyter-notebook에서 tensorflow를 쓰려고 하면 없는 모듈이라고 나온다. 방금전에 설치한 tensorflow는 현재 사용중인 가상 환경에만 적용되기 때문이다. 현재 가상 환경에서 사용하는 jupyter notebook을 설치하면 방금 전에 설치한 tensorflow를 사용 할 수 있다.

(tensorflow) kwony@kwony:~$ pip install jupyter

5. jupyter notebook 실행 후 테스트


jupyter 노트북으로 tensorflow 모듈을 사용해보면 문제없이 동작하는 것을 확인 할 수 있다.

(tensorflow) kwony@kwony:~$ jupyter-notebook 



Ubuntu 16.04에서 Tensorflow GPU 지원 버전 설치하기

삽질 기록 2018.05.01 10:13 Posted by 아는 개발자 아는 개발자

Ubuntu 16.04에서 GPU 가속화를 지원하는 Tensorflow를 설치하는 방법

이 포스트는 Tensorflow 공식 가이드 페이지를 읽고 글쓴이의 컴퓨터에 설치한 과정을 정리한 것이다. PC 환경에 따라 차이가 있을 수 있으므로 포스트를 읽고 설치하기 전에 개인 PC환경이 글쓴이와 어떤점이 차이가 나는지 먼저 확인해두길 바란다. 똑같은 instruction을 사용해도 어떤 PC는 되고 어떤 거는 안되는 경우가 많다. 글쓴이의 PC 환경은 다음과 같다.

CPU: Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz, Quad Core

GPU: GEFORCE GTX1060 (그래픽 드라이버 설치 완료)

RAM: 8GB

Kernel: 4.4.0-122-generic


* 혹시 우분투 커널 버전을 업데이트 했다면 중요한 자료들을 미리 백업해두길 바란다. 글쓴이는 처음에 4.9로 업데이트한 커널로 설치해봤는데 재부팅하니 갑자기 컴퓨터가 안켜지는 문제가 있었다. 아무리 찾아도 해결책을 찾을 수 없어 별 수 없이 커널을 밀고 재설치를 했었다.


1. CUDA Toolkit 다운로드 및 설치

Nvidia 홈페이지에서 tensorflow를 지원하는 cuda 설치 패키지를 다운 받는다. 현재 tensorflow는 cuda 9.0만 지원하고 있으니 이에 유의하도록 하자. 만약 현재 사용중인 NVIDIA driver가 cuda 9.0가 호환하지 않으면 삭제하고 재설치해야 하는 경우도 있다. 이런 경우에는 runfile을 받으면 호환되는 그래픽 카드 드라이버도 같이 받을 수 있다.

* CUDA는 GPGPU에서 사용하는 병렬 처리 알고리즘 기술을 C언어를 비롯한 여러가지 언어에서 사용할 수 있도록 지원하는 기술이다. GPGPU를 사용하기 위한 인터페이스로 볼 수 있다.




2. cuDNN 설치

이것 또한 Nvidia 홈페이지에서 자신의 PC 환경에 맞는 CUDA를 설치해야한다. 그런데 CUDA와 달리 cuDNN 부터는 따로 계정을 생성해야 한다. 가입하고 난 뒤에는 cuDNN 7.0.5 버전을 받도록 한다.

* cuDNN은 CUDA를 딥러닝에 사용할 수 있도록 만든 API다.


설치 가능한 목록에서 자신의 환경을 꼼꼼히 확인하고 다운 받아야 한다. Ubuntu 16.04에서는 Runtime Library와 Developer Library가 있는데 나는 Runtime을 선택해서 설치했다.


3. 그래픽 드라이버 설치

본인이 갖고 있는 그래픽 카드에 맞는 그래픽 드라이버를 설치한다. NVIDIA 홈페이지에서 그래픽 카드 드라이버를 받을 수 있다. 미리 설치 했으면 할 필요 없다. 설치 방법이 apt-get 처럼 단순하지 않다. 설치 방법은 추후 별도의 포스트로 올리겠다.


4. Tensorflow 설치 

Tensorflow 홈페이지에서는 총 네가지 방법(Virutalenv, native, Docker, anaconda)을 지원하는데 이중에서 가상 환경을 만들어서 사용하는 방법(Virtualenv)을 권장하고 있다. Virtualenv는 특정 폴더에 python 환경을 독립적으로 꾸릴 수 있는 환경을 제공하는데 이곳에 tensorflow를 설치하면 다른 파이선 프로그램의 디펜던시가 걸릴 우려가 없어 관리하기가 편하다. 글쓴이는 virtualenv를 이용해서 설치했다.

  1. 먼저 python 패키지 관리 시스템과 virtual env를 apt-get으로 설치한다.

    $ sudo apt-get install python-pip python-dev python-virtualenv # for Python 2.7
    $ sudo apt-get install python3-pip python3-dev python-virtualenv # for Python 3.n

    파이썬 2.7과 3.n 버전이 엄격히 구분되니, 앞으로 사용할 파이선 버전에 따라서 명령어를 잘 선택한다.

  2. python 환경을 독립적으로 꾸릴 폴더에 가상 환경을 설정한다.

    $ virtualenv --system-site-packages targetDirectory # for Python 2.7
    $ virtualenv --system-site-packages -p python3 targetDirectory # for Python 3.n
  3. 다음 명령어중 하나로 Virtualenv 환경을 활성화 한다.
    세가지 명령어를 다 시도하면 virtualenv 환경에서 튕기니까 주의한다.

    $ source ~/{targetDirectory}/bin/activate # bash, sh, ksh, or zsh $ source ~/{targetDirectory}/bin/activate.csh # csh or tcsh $ . ~/{targetDirectory}/bin/activate.fish # fish

  4. 정상적으로 됐으면 아래와 같이 활성화된 창이 뜬다.

    (targetDirectory)$

  5. Virtualenv 환경 내에서 pip가 설치 됐는지 확인해본다.

    (targetDirectory)$ easy_install -U pip
  6. pip 버전에 따라서 tensorflow를 설치한다

    (targetDirectory)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
    (targetDirectory)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU
    

5. 설치 완료 메시지 확인

아래와같은 메시지가 나오면 정상적으로 tensorflow가 설치된 것이다


  1. CB 2018.08.01 22:49  댓글주소  수정/삭제  댓글쓰기

    안녕하세요,
    runtime library 와 developer library 간의 차이를 알 수 있을까요?
    검색 해본다고 해봤는데 잘 모르겠습니다.

    • 아는 개발자 아는 개발자 2018.08.01 23:09 신고  댓글주소  수정/삭제

      Runtime Library: cnDNN을 돌릴 때 필요한 기본적인 API를 설치합니다. Window에서 일반 프로그램 설치 옵션중 하나인 '기본 설치'와 비슷하다고 보시면 됩니다. 이것만 설치해도 Tensorflow를 실행하는데 전혀 지장 없습니다.

      Developer Library: 헤더파일과 일부 코드만 제공하고 나머지는 개발자가 직접 빌드해야 합니다. Tensorflow에서 cuDNN을 사용하는 코드를 변경해서 돌려보고 싶은 경우에 사용하는 라이브러리입니다.

      요약: tensorflow를 API만 사용하는 경우에는 Runtime Library를, 직접 코드를 수정하는 경우에는 Developer Library를 사용하시면 됩니다.

      출처: https://stackoverflow.com/questions/48784645/which-nvidia-cudnn-release-type-for-tensorflow-on-ubuntu-16-04

폴리페이스 - 데이터 학습시키기

공상프로젝트/폴리페이스 2017.10.12 21:21 Posted by 아는 개발자 아는 개발자

데이터 구하고 가공하기에서 한 작업은 정치인들의 사진을 인터넷에서 크롤링 한 후 정확도 향상을 위해 사진에서 얼굴 부분만 추려낸 후 이 것을 Tensorflow서 사용 할 수 있는 파일 형식인 tfrecord로 변환하는 작업이었다. 이제는 변환된 데이터를 이용해서 학습을 시키는 일만 남았다. 이번 포스팅에서는 데이터를 학습시키는 과정들을 쭉 살펴보려고 한다.


1. Tensorflow 설치하기 (feat, 그래픽 카드 없이는 못쓴다)


Tensorflow는 내 데스크탑에 그래픽 카드가 있느냐 아니면 없느냐에 따라서 설치 명령어가 달라진다.


(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU


이 프로젝트를 처음 시작 했을 때 내 리눅스 PC는 그래픽 카드가 없었다. 애초에 이 PC는 오직 교육용으로만 사용하기 위해 게임을 할 수 있는 환경 자체를 차단 하려고 했었다. 그래서 맨 처음에 tensorflow를 설치 했을 때는 가장 위에 있는 CPU만 사용 하는 tensorflow 버전으로 설치했었다. CPU만 사용하니 한 번 학습 시키는데(뉴럴 네트워크에서 1회 학습을 하는 경우) 10초 정도 소요됐다. 10000회 정도 학습 시키려면 컴퓨터를 켜 두고 출근해야 하기도 했다.


그런데 회사 선배가 자기가 쓰던 그래픽 카드를 싸게 판다는 말을 듣고 컴퓨터에 설치해서 학습 시켜보니 퍼포먼스가 무려 20배 이상 차이가 났다. CPU만 사용했을 때 10초 정도 소요되던 것이 그래픽 카드를 사용하니까 0.5초면 가능했다. 10000회 학습 시키려고 컴퓨터를 켜두고 출근을 했었는데 이제는 1-2시간 정도면 끝났다. 그동안 내가 얼마나 많은 시간을 학습 과정에서 소비하고 있었던 것일까. 시간이 넉넉한 사람이면 모르겠지만 그래픽 카드의 유무에 따라서 작업의 퍼포먼스 차이가 크다. 초기부터 그래픽 카드를 사용했다면 불필요하게 시간을 허비하지 않았을텐데.


그래픽 카드를 사용했을 때 학습 속도, 1회 학습하는데 0.5초가 소요되고 있다

2. 학습 모델 선택하기


Tensorflow github에선 이미지를 분류 할 수 있는 다양한 학습 모델을 파이썬 코드로 짜뒀다. 개발자는 학습시키는 명령어에 사용할 학습 모델을 옵션으로 추가하면 간단히 학습 시킬 수 있다. 현재 tensorflow에서 만들어둔 학습 모델로는 이런 것들이 있다.


위 사진에 있는 학습 모델들은 이미 논문에 등재된 뉴럴 네트워크를 구글이 tensorflow에서 사용 할 수 있는 형태로 변환 한 것이다. 학습 모델의 이름을 인터넷에 검색해보면 논문 자료를 다운 받을 수 있으니 관심이 있으면 읽어보는 것도 좋다. 물론 내용이 결코 쉽진 않다. 나는 간단히만 읽어봤다.


이미지 인식 모델 중 가장 유명한 모델은 inception 시리즈이다. 이 모델은 현재 네번째 버전까지(inception_v4) 나왔고 imagenet 컨테스트에서 가장 우수한 학습 알고리즘으로 선정됐다. 하지만 서비스를 하려면 정확도 뿐만 아니라 학습하는데 소요되는 시간 및 유지 관리의 측면도 중요할 것 같아서(당시엔 그래픽 카드가 없었기 때문이기도 하다) 이 모든 요소를 절충 할 수 있는 학습 모델을 찾기로 했다. 이때 검증용으로 사용한 데이터는 tensorflow에서 제공하는 flower 데이터를 사용했다. inception_v1을 사용 했을 때는 학습 속도 자체는 나쁘지 않았으나 퍼포먼스가 좋지 않았고 inception_v3, inception_v4는 학습 속도가 너무 느렸다. 결과적으로 inception_v2가 학습시간 대비 가장 훌륭한 퍼포먼스를 보였다. 이미지 학습 모델은 inception_v2로 선정했다.


3. 학습 결과


정치인들 한 명당 대략 100장 정도 사진이 있었고 총 정치인의 수는 99명 이었다. 이 데이터로 inception_v2 모델로 10000회 정도 학습을 시켰는데 정확도가 70%정도 나왔다. 이 정도면 데모용으로 사용하기엔 적합한 수치였다. 기존 논문 대비 적은 양의 데이터임에도 불구하고 퍼포먼스가 좋은 이유는 아마 크롤링한 데이터에서 따로 얼굴 부분만 추려내고 동명 이인인 데이터를 필터링 하면서 순도 높은 데이터를 골라 냈기 때문인 것 같다. 많은 양의 데이터도 중요하지만 순도 높은 데이터도 중요하다는 사실을 확인해 볼 수 있었던 것 같다.

숫자인식 코드 분석해보기

컴퓨터공부/인공지능 2017.08.03 20:49 Posted by 아는 개발자 아는 개발자

지난 포스팅에서 인공지능 이론중 가장 간단한 Linear Regression과 Logistic Regression에 대해서 설명했습니다. 이번 포스팅에선 tensorflow 튜토리얼에 있는 숫자 인식 코드를 차근차근 분석해가며 어떻게 우리가 배운 이론이 접목되었는지 공부해보는 시간을 가지려고 합니다.


먼저 숫자 인식 코드는 여기를 공식 튜토리얼 페이지는 여기를 클릭하면 볼 수 있습니다. 


튜토리얼 페이지를 클릭하시면 MNIST라는 단어를 보실 수 있을겁니다. 이건 컴퓨터 비전에 사용되는 데이터 셋을 말하는 용어니 너무 주의깊게 보시지 않아도 괜찮아요. 그냥 이런 이미지를 가지고 있다는 것만 기억하시면 됩니다!



위의 이미지들은 우리가 숫자를 직접 손으로 쓸 때의 이미지들입니다. 우리가 만든 숫자 인식 인공지능은 고딕으로된 숫자 이미지 뿐만 아니라 여러가지 폰트로 된 숫자도 인식해야 하니까 이렇게 만들어두면 학습에 도움이 되겠죠? 우리는 이런 이미지들을 잘 학습시켜서 우리가 어떤 이미지를 넣더라도 정확한 숫자를 출력하게 하고 싶습니다.


이미지를 학습 시키는 것에 앞서 이미지를 학습에 사용될 데이터로 전환하는 작업을 해야합니다. 아마 비전공자라 하더라도 컴퓨터 이미지들은 픽셀의 형태로 이뤄져 있다는 것을 아실겁니다. 수십에서 수만개의 촘촘한 점들에 숫자 값을 대입해서 이 위치에는 검은 색을 또는 다른 위치에는 빨간 색을 표현하는것이 컴퓨터가 이미지를 보여주는 방식입니다.


왼쪽 '1' 그림을 픽셀 단위로 표현 한 것입니다.

이렇게 표현하니 거대한 행렬이라고 볼 수 있을 것 같습니다. MNIST에 있는 모든 데이터는 28x28 단위를 따르고 있습니다. 784개의 Element들을 하나로 쭉 나열하면 각 이미지가 서로 독립적이게 만들어 줄 뿐만 아니라 보기에도 훨씬 편할 것 같네요(Flattening 한다고 합니다). 이렇게 변환한 행렬은 학습 데이터로 사용하기에 매우 편리합니다.


실제 코드 상에서는 아예 784 배열로 변환한 데이터 값 자체를 한번에 받습니다. 

 
# Train
for _ in range(1000):
   batch_xs, batch_ys = mnist.train.next_batch(100)
   sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


학습에 사용할 input data를 만들어뒀으니 이제 학습 모델을 만들어 봅시다. 숫자 인식은 분류(Classification)작업으로 볼 수 있습니다. 그래서 여기선 Logistic Regression을 사용해야 합니다. 784개의 Element들(숫자 이미지에 있는 모든 픽셀)을 보고 특성을 분석해 10개의 분류(0~9 까지 인식해야 합니다)로 만들어주는 인공지능을 만드는 것이 목표입니다. 먼저 Logistic Regression 에 수식을 다시 살펴봅시다.




여기서 우리는 z에 해당하는 수식을 만들어야 합니다. 전에는 쎄타0, 쎄타1 만 만들어서 간단히 했었죠? 그런데 이번에는 쎄타0, 쎄타1 뿐만 아니라 쎄타784 까지 만들어야 합니다. 학습에 사용하는 input 데이터의 element가 총 784개이기 때문이지요. 계산량이 무척 많아지겠지만 그래도 컴퓨터가 대신 해줄 것이니 너무 염려하지 않도록 합시다.


output data는 크기가 10인 배열로 둘겁니다. 결과값이 3이라면 (0, 0, 0, 1, 0, 0, 0, 0, 0, 0) 요렇게 쉽게 표시 할 수 있습니다. 물론 two's complement로 더 공간 효율적으로 할 수 있긴 하지만 그렇게는 안해요. 이렇게하면 벡터로 표시 할 때 훨씬 보기 편하거든요.


입력값(X)이 1x784 로 들어 온다면 우리는 출력값(Y)을 1x10으로 내야 스펙에 맞습니다. 그러면 입력값을 처리하는 행렬(W)의 크기는 784x10이 되어야 합니다. 수학 수식으로 표현해보면 Y(출력값) = X(입력값) * W(쎄타들의 모음) + B(바이어스, 일반 상수에 해당하는 값) 로 볼  수 있습니다.


실제 코드에서도 이렇게 표현 합니다.

 
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# y = xW + b
y = tf.matmul(x, W) + b
  • x는 인풋 데이터 형식입니다. C언어로 생각하면 int, char을 설정해주는 것과 비슷해요.
  • W는 쎄타들의 모음입니다. 실제로는 Weight라고 불러요. Input이 784개이고 10개의 output이 있으니 총 7840개의 Weight가 존재합니다. 지금은 모두 0으로 세팅했는데 여러번 최적화 과정을 통해서 적절한 값을 찾아가게 될겁니다. 
  • b는 Bias 값입니다. 일반상수에 해당하는 값이에요
  • y를 matmul 명령어를 이용해 정의합니다. matmul은 벡터 값의 곱을 의미합니다. 결과적으로 y = xW + b 로 표현이 되겠네요.

학습 모델까지 훌륭하게 만들었습니다. 이제 Cost function을 구하고 최적화 작업만 거치면 됩니다. 이 작업은 softmax와 cross entropy로 한방에 해결 할 수 있습니다. softmax 포스팅에서 소개한 코드를 그대로 사용하겠습니다.

 
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)


tf.reduce_mean은 argument의 평균을 구해주는 작업입니다. 이렇게 cost function 구하는 모델을 만들어 두고 바로 밑에 GradientDescentOptimizer 의 minimize argument안에 cross_entropy 모델까지 넣으면 Gradient Decent 방식으로 최적화 할 수 있는 모델 까지 만들어 집니다.


하지만 이렇게 그냥 둔다고 바로 알아서 학습을 하진 않습니다. 지금까지 우리가 한 것 학습을 위한 모델을 만든 것에 불과하니까요. 함수를 정의한 후에는 호출을 해야하는 것처럼 여기도 우리가 만든 학습 모델을 실행하는 코드가 필요합니다.

 
  # Train
for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images,
                                    y_: mnist.test.labels}))

주석으로 추천하건데 # Train 아래에 있는 부분이 학습하는 부분 인것 같지요? batch_xs, batch_ys는 학습에 쓰일 이미지 벡터 값과 실제 숫자 벡터 값을 가지고 있습니다. 그리고 바로 아래 sess.run 안의 feed_dict 안에 넣어놓지요. 첫번째 인자인 train_step은 우리가 최적화 작업까지 선언한 학습 모델입니다. 이 두 인자만 넣어주면 바로 tensorflow에 있는 함수들을 이용해서 학습이 진행됩니다.


바로 밑에의 코드는 학습한 데이터를 테스트해보는 작업이네요. correct_prediction은 예측한 값(y)과 실제 값(y_)이 동일한지를 보는 것이고 accuracy는 예측 한 값들에서 평균을 내는 작업입니다. 이것도 어떻게보면 검증하는 '모델'로 볼 수 있겠네요. 첫번째 인자로 예측 모델(accuracy)를 두고 두번째 인자에는 테스트할 이미지와(mnist.test.image)과 결과값(mnist.test.labels)을 대입해서 정확도를 측정 할 수 있습니다.


위 학습 모델로 정확도가 92% 정도 나옵니다. 생각보다 우수하죠? 그런데 딥러닝을 적용하면 정확도가 97%까지 상승한다고 합니다!


참고자료

  • https://www.tensorflow.org/get_started/mnist/beginners


'컴퓨터공부 > 인공지능' 카테고리의 다른 글

뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10
숫자인식 코드 분석해보기  (2) 2017.08.03
Softmax와 Cross entropy  (0) 2017.08.03
Logistic Regression (로지스틱 회귀)  (0) 2017.07.31
Linear Regression (선형회귀)  (0) 2017.07.28
  1. 이용원 2019.05.21 09:45  댓글주소  수정/삭제  댓글쓰기

    0000~9999까지 4단위의 숫자를 인식하고자
    합니다.
    이미지 취득은 어떤 파일형식도 가능합니다.
    같은 글씨체 이며 같은 폰트 입니다.
    다만 환경 여건상 이미지 상태가 양호하지
    않은 경우가 있습니다.
    머신런닝을 이용한 프로그램 개발 가능 하세요?
    01047041111 이 룡원

개발자는 이제 인공지능을 공부해야 합니다.

2017.07.17 23:13 Posted by 아는 개발자 아는 개발자

2016년 3월 이세돌과 알파고의 대결이 시작되기 전까지만해도 알파고의 승리를 점치는 사람은 거의 없었습니다. 경우의 수가 제한된 장기나 체스에 비해 바둑은 수가 거의 무한에 가까워 현재 컴퓨팅 능력으로는 기계가 이 모든 경우의 수를 계산하기는 무리라는 것이 대부분 바둑계 전문가들의 생각이었지요. 하지만 모두의 예상을 뒤엎고 알파고는 10년간 세계를 평정했던 이세돌을 4:1로 제압합니다. 그리고 올해 한층 더 진화된 알파고는 현 인간계 바둑랭킹 1위 커제를 상대로 단 한판도 내주지 않고 우승합니다. 알파고의 기세를 보니 당분간(어쩌면 평생) 이 기계를 이길 수 있는 인간은 나오지 않을 것 같습니다.



(알파고를 상대로 거둔 이세돌의 1승은 인류의 마지막 승리가 될 것이라고 합니다)


바둑 경기가 시작되기 전만 해도 우리는 인공지능이 아주 먼 미래라 생각했었습니다. 사실 컴퓨터 전공생들이라면 배우는 컴퓨터 역사에서도 인공지능 기술은 잠깐 번쩍하고 말던 기술이었습니다. 매번 역사속에 등장 할 때마다 이론은 출중하나 하드웨어 성능 문제로 빛을 보지 못했었죠. 그런데 이번에 다시 등장한 인공지능의 기세는 심상치 않습니다. 초기엔 단순한 노무작업 정도만 할 것이라 예상했는데 요즘의 인공지능은 간단한 스포츠 기사도 쓰고 스스로 광고도 만들기 시작했습니다. 그뿐만이 아닙니다. 창의성의 영역이라 여겨지는 예술에도 침투하기 시작했습니다. 다량의 예술 작품을 학습한 인공지능은 직접 그림을 그리기도 하고 단편 소설을 쓰기도 합니다. 인공지능이 만든 작품 중 몇몇은 저같은 일반인들은 전혀 구분 하지 못할 정도로 고퀄로 보이는 작품들도 있습니다.


(유명 예술가의 화풍을 학습한 인공지능의 작품입니다. 놀랍지 않나요?)


일반인들도 놀라우시겠지만 저처럼 인공지능 관련 일에 종사하고 있지 않는 개발자들은 더더욱 놀랍습니다. 중앙처리장치와 메모리의 성능이 좋아지면서 컴퓨터 산업 전반의 발전이 있을 것이라고 예상은 했습니다만 이정도일 줄은 몰랐습니다. 그리고 놀람과 동시에 두려움도 엄습합니다. 인공지능 시장이 확장하면 할 수록 들러리였던 영역은 더더욱 들러리가 될 확률이 매우 높아졌습니다. 대학시절 저를 감동시켰던 운영체제는 역사가 오래된 만큼 관련 연구도 완료된 상태이고 관련 문제들의 솔루션도 모두 만들어 졌습니다. 앞으로는 더 좋은 페이지 할당 알고리즘이나 더 훌륭한 스케줄링을 만든다고 해도 좋은 논문거리는 되지 못할 것입니다. 이 영역 종사자들이 아마 앞으로 해야할 일은 아마 과거에 이뤄왔던 연구들을 잘 조합하는 것에 불과 할지도 모릅니다. 원가 절감이라는 획기적인 아이디어를 들고 나온 가상화 기술도 Docker가 등장하면서 클라우드 컴퓨팅에서 한물 간 기술이 되버렸습니다. 더이상 발전할 요소가 없다, 한물 간 기술이 되었다는 말은 곧 그 기술을 파고 들었던 개발자의 밥줄이 끊긴다는 말과 같습니다.


(운영체제는 연구가 오래 됐고 Docker가 등장하며 가상화 기술은 한물간 기술이 됐습니다)


우리 모두 역사의 흐름을 무시한 나머지 굶주림을 면치 못했던 조선 후기 양반들과 같은 실수를 하고 싶어하진 않을 것입니다. 남들이 알아주지 않는 분야를 파고든 예술가는 역사책에 이름을 남기지만 남들이 알아주지 않는 기술을 파고든 개발자는 이름 남길 곳이 깃로그 밖에 없습니다. 한물간 기술을 부여잡고 수요가 생기길 기다리는 것은 본인 뿐만 아니라 가족까지 굶이기 딱 좋은 행동입니다. 그렇게 되지 않으려면 개발자들은 시대의 기술 트렌드를 읽고 팔로우 해야합니다. 거의 3-4년을 주기로 트렌드 기술이 있었고 이번에는 인공지능 기술이 트렌드가 됐지요. 그런데 지금까지 나왔던 기술들과 다르게 인공지능의 진입장벽이 높아보입니다. 수식이 난무한 이론도 따라기 벅찰 것 같은데 저걸 다 일일히 코딩하자니 언제쯤 구현을 해볼 수 있을지 가늠이 되지 않습니다.


(분명 공학수학을 수료한 것 같은데 뭔소린지 통 모르겠네요, 하하하)


이런 고민을 하는 개발자를 위해 구글은 올해 4월에 인공지능용 라이브러리 tensorflow 를 공개했습니다. 이건 python으로 짠 인공지능 개발 툴입니다. 학습에 쓸 데이터와 기본적인 인공지능 이론을 갖춘 개발자는 tensorflow에서 제공하는 함수를 이용해 (손쉽게)AI를 만들수 있게 됐습니다. 휴 한시름 덜었습니다. 저런걸 일일히 다 코딩하자니 앞이 깜깜했는데 이미 툴은 다 마련되어 있었다니 천만 다행입니다.





그래도 여전히 첩첩 산중인것 같습니다. 결론적으로는 tensorflow가 있어도 이론을 공부해야하고 위의 수식도 언젠간 배워야 한다는 말이지 않습니까? 얼른 알파고 같은걸 만들어내야 할 것 같은데 마음만 초조하고 뭐부터 시작해야 할지는 모르겠습니다. 대학시절에 인공지능 강의를 하나도 수강하지 않았던 것이 후회되기 시작합니다. 야간대학 속성 강좌라도 등록해야 할 것 같기도 합니다. 하지만 굳이 대학까지 갈 필요는 없습니다. 이미 코세라에 인공지능 개발시 필요한 기초적인 머신러닝 강의가 마련되어 있고 tensorflow 튜토리얼에서도 논문까지 첨부해주면서 설명해줍니다. 다행히 공부할 자료는 인터넷에 널려 있습니다. 우린 이걸 잘 활용해야 합니다.


물론 강의 내용이 쉽지 않고 논문이 술술 읽히지는 않습니다. 하지만 현재 무모하게 트랙을 밟아보고 있는 사람으로서 해볼만 하다고는 생각합니다. 100%까진 아니어도 '이것을 어떻게 쓰면 좋겠다'고 감 정도는 잡아본것 같습니다. 앞으로 저의 매거진에선 인공지능 지식이 전무한 개발자가 코세라 강의와 tensorflow로 공부한 내용을 공유해보려고 합니다. 영어와 수식이 난무한 인공지능에서 엑기스만 뽑아내 저와 같은 개발자들이 쉽게 인공지능을 접할 수 있는 글을 쓰도록 하겠습니다.