Docker 이미지로 설치한 Jupyter에 커널 추가하기


텐서플로우를 시작하면서 나의 Mac mini에 Docker 이미지로 텐서플로우를 설치하였고 이 이미지를 실행하면
텐서플로우 예제 노트북이 포함된 jupyter가 실행된다. 설치 이후 별다른 문제가 없이 잘 사용을 하고 있었는데
이번에 로지스틱회귀 비용함수와 관련된 내용을 공부하다가 이 비용함수의 그래프를 그려주는 python
소스(jupyter notebook)가 있길래 가져다 사용을 해보려 했더니 이 소스가 python 3.X 기반이었다. 그런데
Docker 이미지에 있는 jupyter는 python2 커널만 있어서 python3 커널을 추가하는데 조금 삽질을 했다.


삽질 과정은 생략하고 간단하게 Docker 이미지로 텐서플로우를 설치한 경우 jupyter에 커널을 추가하는 방법을
정리한다.


jupyter Document에서 안내하는 커널 추가 방법


일단 jupyter 공식 홈페이지에 가면 다음과 같은 코드로 커널을 추가하도록 안내하고 있다.

python2 -m pip install ipykernel
python2 -m ipykernel install —user 


python3 커널을 추가할 경우에는 숫자 2만 3으로 바꾸면 된다. 다음과 같이…

python3 -m pip install ipykernel
python3 -m ipykernel install —user


나는 python3 커널을 추가해야 하므로 당연히 두 번째 코드를 사용하였다. 그러나…
첫 번째 라인을 입력하고 엔터를 치니 다음과 같은 오류가 발생을 하였다.

/usr/bin/python3: No module named pip


확인을 해보니 /usr/local/lib/python3.4/dist-packages/ 아래에 아무런 패키지들이 없었다. 그래서 우선
python3용 pip를 먼저 설치했다.

apt-get update
apt-get -y install python3-pip


그런데 이렇게 pip를 설치한 후 python3 커널을 설치하는 과정에서 이번에는 잘 진행되는 듯 싶다가 마지막에
다음과 같은 오류가 발생을 하였다.

ImportError: No module named 'packaging'


pip 패치가 필요하다고 하여 패치를 진행하였다. 이 과정에서 wget 모듈이 필요하여 wget 설치를 먼저 하였다.

#wget 설치
apt-get install wget

#pip 패치
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python2 get-pip.py
$ sudo pip2 install -U setuptools


여기까지 하고 나니 python3 커널이 정상 설치되었다. 아래는 pyhon3 커널 설치 후 New 메뉴의 모습이다.


요약

  1. python3용 pip 설치
  2. wget 설치
  3. 설치한 pip 패치
  4. 커널 추가

후기


python3 커널을 설치한 후 서두에 언급한 비용함수 그래프를 그려주는 노트북을 실행하니 python2 커널에서 
발생하던 오류는 사라졌다. 그런데 마지막에 그래프를 그리는 과정에서 자꾸 커널이 죽어버리는 문제가 발생을
하였다. python과 jupyter를 잘 모르니 원인이 무엇인지를 모르겠다. 정상적으로 실행이 된다면 다음과 같은
그래프가 그려져야 하는 것 같다.



그리고 혹시나 해서 노트북 소스와 출처 링크를 첨부한다.

출처 : https://github.com/shuyangsun/Cost-Function-Graph

cost_function.ipynb










블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


TensorFlow 학습을 위한 간단한 Tip ~ #1

TensorFlow 공부를 시작하면서 몇가지 도구를 사용하게 되었다. 하지만 그 도구들에 대해 자세힌 알고있는
상태에서 시작을 한 것이 아니라 학습을 진행하면서 시행착오를 통해 알게되는 사실들이 꽤 많다.
이 그룹의 게시물들은 바로 이러한 팁을 정리하는 공간이 될 것이다.


첫 포스팅은 Docker와 Jupyter에 대한 몇가지 내용들을 다룰 것이다.


Docker에서 TensorFlow 관리하기

우선 처음 설치에 대한 내용과 1.0.0으로 업그레이드 하는 내용에서 Docker에 대한 약간의 내용들이 언급되었다.
오늘은 거기에 더해서 Container를 다루면서 실수했던 내용 몇가지를 정리한다.


처음 Docker를 통해 텐서플로우 이미지를 다운로드 받고 실행을 시키면 바로 Jupyter가 실행되면서 사용가능한
상태가 된다. 바로 그저께까지도 Docker의 container 사용 방법을 몰라 조금 미련한 짓을 하고 있엇다.


내가 분명 Jupyter상에서 ‘텐서플로우 첫걸음’의 예제를 업로드하여 학습을 하고 난 뒤 Jupyter를 종료시켰다가
다시 실행을 하면 이상하게도 내가 업로드한 내용들이 모두 사라지고 없었다. 처음 Jupyter를 실행했을 때의
상태로 초기화 되어있는 것이다.


이 것은 내가 Docker의 container에 대한 개념을 잘 몰랐기 때문에 발생한 문제였다.


일단 처음 이미지를 다운로드 받을 때 사용하는 명령어는 다음과 같다.

docker run -it -p 8888:8888 -p 6006:6006 gcr.io/tensorflow/tensorflow


이 명령어를 실행하면 이미지가 없는 경우에는 이미지를 다운로드 받은 후 container 하나를 생성하여 바로
Jupyter를 실행하고 이미지가 있는 경우에는 그 이미지를 이용하여 새로 container를 생성하여 Jupyter를 실행한다. 


나는 이 사실을 모르고 계속 Jupyter를 실행할 때마다 위의 명령어를 사용했던 것이다. 그러니 항상 새로운
container가 만들어진 것이고 이전에 작업했던 내용은 이전에 작업했던 container에 있을 뿐이나 당연히
초기화된 새로운 Notebook 목록이 열렸던 것이다.


따라서 이전에 했던 작업을 계속 진행하려고 한다면 당연히 이전에 작업했던 container를 실행시켜 진행해야
하는 것이다.


우선 콘솔에서 다음과 같이 입력하여 자기가 사용했던 컨테이너의 ID나 이름을 확인해두자

docker ps -a


그러면 다음과 같이 현재 생성된 container의 목록과 그 상태가 나온다. STATUS 항목에 Exited라고 표시된
container는 정지된 container이고 실행되고 있는 container들은 Up xx hours 처럼 표시된다.


이 container 목록 중 사용하고자 하는 것에 대해 start 또는 stop 명령을 통해 시작하거나 종료할 수 있게 되는
것이다. 그러니 run 명령은 최초 한 번만 실행하고 이후에는 start/stop을 사용하면 된다.

docker start trusting_booth
docker stop trusting_booth


이 때 주의할 것은 Jupyter가 실행되면 Jupyter에 로그인할 때 필요한 token이 생성되는데 이 token을
잘 기억하고 있어야 나중에 동일한 Jupyter 커널에 접속하여 사용할 수 있다. 만일 token이 올바르지 않다고
한다면 다음과 같이 진행하자


우선 아래와 같이 현재 실행 중인 container의 shell로 들어간다.

docker exec -it trusting_booth bash
root@cbec422fa6de:/notebooks#


여기서 다음과 같이 입력한다. 그러면 현재 실행 중인 Jupyter의 URL이 token과 함께 표시된다. 이 주소를 이용하여
접속하면 된다.

docker exec -it trusting_booth bash
root@cbec422fa6de:/notebooks# jupyter notebook list
Currently running servers:
http://localhost:8888/?token=2587d5ea8dd373c169e8042c4ab15dd956a2a0dc9a50bac9 :: /notebooks
root@cbec422fa6de:/notebooks# 


Jupyter에서 필요한 라이브러리 추가하기


사실 이 부분도 위에 설명한 Docker container의 사용 방법만 제대로 알고 있엇다면 실수를 하지 않았을 부분이다.
나는 다중 선형 회귀에서 사용하는 산점도 행렬을 그리기 위해 pandas라는 라이브러리를 추가하기 위해 작업을
진행했다.


우선 Jupyter에서 라이브러리를 추가하는 것은 매우 쉽다. 아무 Notebook이나 하나 실행해서 code cell에
다음과 같이 입력하고 실행하면 된다. 내가 pandas를 설치했으니 pandas를 설치하는 명려어를 쓴다.

!pip install pandas


그러면 다음과 같이 설치되는 모습이 보여진다.


이제는 현재 실행된 커널의 어떤 Notebook에서도 pandas를 import하여 사용할 수 있다.
처음에는 앞서 Docker에서의 실수로 매번 Jupyter를 실행할 때마서 라이브러리를 추가해주어야 하나 했는데
동일한 container를 사용한다면 그런 실수는 할 일이 없을 것이다.


Jupyter Notebook 활용하기

아직 사용한 지 얼마 되지 않지만 그 짧은 시간에 Jupyter가 얼마나 유용한 툴인지 깨닫고 있다. 바로 직전에
포스팅한 다중 선형 회귀에 대한 내용은 Jupyter Notebook에서 아래 메뉴를 실행하여 다운로드 받은 후
MacDown이라는 Markdown 편집기를 이용해 열어 그 preview를 그대로 복사해 붙여넣은 것이다.


File > Download as > Markdown (.md)


만일 바로 다른 Jupyter에서 실행 가능한 상태로 저장하고 싶다면 다음과 같이 선택하여 저장하면 된다.


File > Download as > Notebook (.ipynb)


어쩧게 저장하느냐에 따라 문서가 될 수도 있고 싫행 가능한 소스가 될 수도 있는 것이다.


참고로 나는 현재 다부분의 블로그를 작성할 때 Ulysses라는 편집기를 사용하고 있다. 이 글도 역시 Ulysses로
작성한 글이다. 그런데 이 Ulysses가 다수의 문서를 관리하고 publishing하는데는 매우 좋은데 일반적인
Markdown과 좀 다른 듯하다. 그래서 Jupyter에서 Markdown으로 저장한 문서를 열면 제대로 표현이 안되는
경우가 많다. 그래서 Jupyter에서 저장한 Markdown 문서는 무료 편집기인 MacDown을 사용한다.


꿩먹고 알먹고

사실 Docker도 그렇고 Python도 그렇고 앞으로 공부해야 할 목록에 들어있었는데 이렇게 TensorFlow 덕분에
함께 공부하게 되어 그야말로 일석이조다. 다만 간혹 오늘 적은 시행착오와 같은 문제로 불필요한 문제로 시간을
소모하게 되는 것은 불만스럽기도 하지만…앞으로도 새롭게 알게되는 내용들은 잘 정리를 해놓아야겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


Docker에서 TensorFlow 1.0 업그레이드 하기

최근 텐서플로우가 1.0을 발표하면서 많은 분들이 1.0 업그레이드에 여념이 없다. 이런 시류에 편승해서 나도
Docker 이미지로 설치한 텐서플로우 0.12.1 버전을 1.0.0 버전으로 업그레이드를 해보기로 했다.


사실 뭐가 어떻게 변했는지도 모르고 그냥 남들 하니까 따라한다…ㅠ.ㅠ
게다가 Docker 자체를 잘 모르는 상태에서 달리 뭘 어찌해야 하는지도 잘 모르겠고. 텐서플로우 홈페이지에 가도
그냥 기존 코드를 1.0에 맞게 변경하는 내용만 있고…Installing 항목에는 기존과 달라진 내용은 안보이고…
가장 상투적인 것이 가장 확실하다고 했던가. 그냥 기존 버전 삭제 후 재설치 하기로 했다.


그 과정에서도 많은 시행착오를 거쳤지만 굳이 그 모든 실수를 다 거론할 필요는 없을 것 같아 깔끔한 성공 과정만
정리한다.



텐서플로우 버전 확인

우선 업그레이드를 하고 나서 제대로 업그레이드가 되었는지 확인이 필요하니 먼저 텐서플로우 버전을 확인하는
방법을 확인해보았다. 간단하게 아래 그림과 같이 코드를 입력하면 된다. 이 화면은 jupyter Notebook 화면이다.



오호라 0.12.1 버전이 현재 내가 사용하는 버전이구나. 업그레이드 해야지~


Docker에 설치된 텐서플로우 이미지 확인

콘솔 창에서 아래 이미지와 같이 명령어를 입력하면 현재 설치된 모든 이미지의 목록이 나온다. 나는 이번에 처음
텐서플로우를 설치하면서 Docker를 사용했기에 이미지가 달랑 하나다. 만약 많은 이미지가 있다면 아래의 코드와
같이 필터링 할 수 있다.

docker images | grep tensorflow




Docker에 설치된 이미지 삭제

역시 아래 코드와 같이 입력하면 된다. 

docker rmi [이미지 ID]

그런데…뭔가 에러가 떴다. 정지된 컨테이너에서 이 이미지를 사용하고 있단다. 정지했으면 좀 풀어주지…-.-




Docker에서 컨테이너 조회 및 삭제 그리고 다시 이미지 삭제

아래와 같이 입력하면 현재 프로세스로 떠있는 모든 컨테이너의 목록을 확인한다.

docker ps -a



나는 현재 3개의 컨테이너가 프로세스로 등록되었고 모두 정지된 상태이며 사용하는 이미지는 모두 텐서플로우다.
가차없이 모두 죽여버리자!

docker rm $(docker ps -a -q)



다시 한 번 docker ps -a 명령을 실행하면 이제 목록에는 아무 것도 보이지 않는다.
이어서 바로 다시 한 번 이미지를 삭제해보자. 아래 그림과 같이 삭제 과정이 표시된다.





텐서플로우 이미지 설치

일단 1.0.0을 설치해야 하니까 뒤에 태그를 명시적으로 지정해주어야 할 것 같아서 아래와 같이 명령어를 입력했다.

docker run -it -p 8888:8888 -p 6006:6006 gcr.io/tensorflow/tensorflow:1.0.0-devel

음…그런데 이거 이미지 다 설치되고 나면 자동으로 jupyter가 실행되어야 하는데…이상하게 shell로 들어가버린다.
뭐냐? 이러면 나 흔들린다…ㅠ.ㅠ 여기서 뭘 어째야 하는거냐…?



일단 당황하지 않고~ 텐서플로우 홈페이지에 있었던 것처럼 다시 한 번 해본다.

docker run -it -p 8888:8888 -p 6006:6006 gcr.io/tensorflow/tensorflow

아하~! 별다른 태그를 주지 않으니까 자동으로 가장 최신의 버전이 설치되는군~
그리고 바로 Jupyter가 실행되면서 로그인에 필요한 토큰과 함께 Jupyter URL이 표시된다.



docker images를 통해 이미지 목록을 다시 한 번 조회해보면 2개의 이미지가 보인다. 위에 보이는 것은
나중에 설치한 이미지이고 아래 보이는 것은 1.0.0-devel 태그를 붙여 설치한 이미지이다.




최종 확인

마지막으로 Jupyter Notebook을 하나 만들어 다시 한 번 버전을 확인해보자.




이렇게 뭐로 가도 서울로 가면 된다고 어찌어찌 텐서플로우 1.0.0을 설치하였다~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


나…해도 될까?

이것 저것 벌여 놓은 일들이 산더미이지만 AI만큼은 왠지 수박 겉핦기라도 해야 할 것 같다.
그래서 올 2017년 목표 중 하나로 잡고 회사에도 함께 공부할 분들을 모아볼까 하고 동호회
제안도 해놓고 하긴 했는데…과연 내가 해도 될만한 분야인지 부담스럽기만 하다.


그래도…

쇠뿔은 단김에 뽑아야 하고 시작은 반이니 일단 무작정 시작해보기로 했다.
아무래도 지명도가 높고 그만큼 학습자료(특히 서적)가 많은 텐서플로우를 타겟으로 잡았다.
그리고 무작정 텐서플로우 홈페이지로 가서 당장 설치부터 해보기로 했다.


뭐라뭐라 설치 방법도 참 다양하다…-.-
그 중 눈에 띄는 것이 있었으니 바로 Docker 이미지로 설치하는 것이었다.
마침 올해 공부해야 할 것 중 Docker도 있었으니 겸사겸사 죽을 쒀보자는 생각으로 
홈페이지에 적힌대로 따라해보았다. 그나마 Docker는 전에 설치를 해놓은터라 바로
홈페이지에 있는 명령어만 치면 되었다.


docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow


음…근데 이상하다…뭔가 반응이 있어야 하는데 얘가 그냥 멍때리고 있다.
docker —version등 기초적인 명령어는 반응을 하는데 run을 하게 되면 콘솔에 아무런 
출력도 없고…혹시나 해서 메뉴 막대에 떠있는 Docker 아이콘을 클릭하여 Docker 메뉴를 
열어보니 아니나 다를까 맨 위의 ‘Docker is running’ 앞부분의 표시가 초록색이 아니라 
노란색이다. Docker를 처음 써보는터라 이유도 모르겠거니와 로그같은 것도 어디서 보는


지도 모르겠고…로그가 있기는 한건지…ㅠ.ㅠ


Docker is running 앞의 신호등이 노란색이었다...



이리저리 검색을 하다가 구글에서 다음과 같이 해보라는 계시를 받았다.


  1. Preferences… 선택
  2. 가장 우측 폭탄모양의 Uninstall/reset 선택
  3. Reset to factory defaults 선택
  4. Docker is running의 restart 선택


이렇게 했더니 다행히도 Docker is running 표시가 초록색으로 돌아왔다.
그리고 다시 한 번 docker run… 실행… 그런데 이번에는 콘솔창에 다음과 같은
메시지가 출력되면서 뭔가 진행이 안되는 듯하다…


Unable to find image 'gcr.io/tensorflow/tensorflow:latest' locally


이건 또 뭔가 하고 Ctrl-C를 눌러 취소하고 다시 실행하기를 몇 번…
사실 개발자 별거 아니다. 메시지만 잘 눈여겨보면 대부분의 문제는 해결이 되는
것을…-.- 처음에는 ‘Unable to find image’만 보고 왜 자꾸 이미지를 못찾는다고
하는 걸까 하며 성질만 벅벅 냈는데 찬찬히 보니 마지막에 ‘locally’가 있다…
그래…아직 이미지를 안받았으니 당연히 로컬에는 이미지가 없지…ㅠ.ㅠ 
메시지를 무시하고 잠시 기다려보니 뭔가 된다.^^




마지막에 보면 URL이 하나 나오고 브라우저를 열어서 접속하라고 부추킨다.
시킨다면 시키는 대로 하는 것이 인지상정~ 사파리를 열고 접속을 해보았다. 그러자
다음과 같은 화면이 등장한다.




화면을 보니 상단에 Jupyter라는 로고가 보이고 아래쪽으로는 뭔가 목록이 보인다.
목록을 보니 뭔가 tensorflow라는 이름도 보이고 mnist라는 이름도 보이는 것이
TensorFlow가 설치가 된 것 같긴 한데 도대체 이놈에 Jupyter라는 것은 뭐하는
놈인가…-.- 항목을 하나 클릭해보니 뭔가 영어로 잔뜩 설명이 나오고 Python 코드도
보이고…검색을 해보니 Python, iPython, Notebook 등등의 단어가 보이고…
결국 확인한 내용은 웹 기반의 Python IDE라는 것…


오늘은 여기까지 삽질기를 마치고 다음에는 Jupyter Notebook에 대해서 조금
알아보도록 하자. 아무래도 얘량 친해져야 텐서플로우든 뭐든 할 수 있을 것 같다.


Docker도 Python도 잘 모르는데…앞길이 구만리다…ㅠ.ㅠ

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^