딥러닝 개발환경

7-1. Jupyter NoteBook (with 원격접속)

Do-Woo-Ner 2020. 3. 11. 16:59

안녕하세요 이번글에서는 Jupyter NoteBook에 대해서 설명하려고해요~


Colab을 이용하려면 Jupyter NoteBook에 대해서 알아야하해요. Colab이 아니더라도 요즘 많은 분들이 Jupyter NoteBook을 이용하여 개발하시기 때문에 알아두시면 좋을거에요!



<1. Motivation>


우리가 보통 프로그램을 만들면 혼자서 만들진 않아요. 보통 팀단위로 모여서 코드를 작성하게 됩니다. 한 프로그램을 만들때 A라는 사람은 프로그램의 A기능을, B라는 사람은 프로그램의 B기능을 만들게되요. 하지만 A라는 사람이 A기능을 구현할때 B기능을 참고해야 할때가 있는데, 만약 B라는 사람이 만들어놓은 코드에 명확한 설명이나 주석없이 구현되어 있다면 어떻게 할까요? A라는 사람은 B라는 사람을 찾아가 하나씩 물어보게 될거에요;;

<사진1>


또한 프로그램의 C라는 기능에 두 사람이 붙어 작업하게되면 이들은 서로 코드를 공유해야할거에요. 그런데 이때마다 작업한 파일을 USB나 이메일로 매번 보내게된다면 조금 번거롭지 않을까요 (용량도 많을텐데...)? 하지만 우리가 작업한 코드를 특정 사이트에다 올리고 해당 코드를 알아서 다운받도록 한다면 조금더 편리할거에요. 





"프로그램을 개발할때 서로 효율적으로 코드를 공유할 방법이 있으면 좋지 않을까요?" 지금부터 이 질문의 해결책인 Jupyter Notebook에 대해서 천천히 알아보도록 할게요.








<2. IPython 프로젝트>


Jupyter 프로젝트는 IPython 프로젝트를 기반으로 하고 있어요. 


IPython이란 python+upgraded shell 이라고 생각하시면되요. Python은 알겠는데 shell에 대한 개념이 이해가 잘 안되시죠? 그럼 간단하게 살펴보도록 할게요.


1) Shell


우리(User)는 여러 application program을 사용해요. 카카오톡도 사용하고, chrome 브라우저도 사용하는 등 여러 프로그램을 사용합니다. 그런데 만약에 위와같이 누군가가 만들어놓은 application program에 내 hard-disk에 접근하게 권한을 주면 어떻게 될까요? 악의적으로 내 파일들을 전부 삭제할수도 있겠죠?


그래서 application program을 개발할때에는 내 컴퓨터의 물리적장치에 접근하는 목적에따라 엄격한 제한을 두게되요. 그래서 application program에서 물리적 자원 (리소스)에 접근할때 직접 접근시키는 것을 제한하고 중간관리자가 있어야 하는데 그 중간관리자가 Operating system이에요.


<사진2>



Operating System은 application program으로부터 물리적 자원을 쓰길 원한다는 요청을 받아요. 그런데 보면 여러 application program이 실행될때도 있고, 하나의 program에 여러 작업이 동시에 진행될때가 있어요. 그래서 Operating System은 여러 작업요청에 대해서 최적으로 스케줄링(작업순서를 결정)해준다음 kernel을 이용하게되요. Kernel을 간단히 말하자면 물리적자원을 이용할 수 있도록 만들어진 프로그램이라고 생각하시면되요. 보통 윈도우라는 운영체제를 사용하시면 이러한 운영체제를 만드는 회사들이 kernel program도 구현해놓아서 우리가 안전하게 물리적 자원인 CPU, Memory, Devices를 쓸 수 있게되는거에요 (상상해보세요 우리같이 컴퓨터에 대해서 자세히 모르는 사람들이 물리적 자원을 건들게 해놓으면..... 아마 금방 컴퓨터가 망가질거에요;;;)


<사진3>


그런데 우리는 가끔씩 hard-disk에는 뭐가 있는지, cpu가 어떤 상태인지 등 물리적자원에 대한 정보를 알아내고 싶을때가 있어요. 이럴때는 shell이라는 매개자를 이용해 우리가 원하는 내용을 shell에게 넘겨주면 shell은 해당 내용을 kernel에게 넘겨주게되요. 그리고 kernel은 shell이 요청한 부분에 대한 정보를 건네주고, 다시 shell은 우리에게 해당 정보를 출력해주게 되는거에요.


<사진4>





2) Python shell prompt


보통 Python을 설치하면 python (shell) prompt를 확인해볼 수 있어요. Python prompt를 이용해도 CPU 정보같은것을 알아낼 수 있어요.



하지만 python prompt는 일반적으로 사용되는 shell script들 예를들어 현재 디렉토리에 어떤 파일들이 있는지 확인할때 사용되는 ls 명령어와 같은 shell command가 제공되지 않는 문제가 있었어요.



또한 shell prompt의 기능이 더 다양해졌으면 하는 바람에서 Python shell prompt를 업그레이드 시킬 project를 준비하게 됩니다.





3) IPython shell prompt 


IPython은 Python의 shell prompt 기능을 더 강화시킨 버전이라고 보시면 될거에요.


3-1) 제공되는 shell 명령어 증가






3-2) 변수이름 입력시 자동완성기능 추가 (Tab키)






3-3) 자료형과 함수에 대한 description(설명서) 제공




이외에 더 많은 기능들이 추가 되었는데요. 핵심은 사용자가 좀 더 사용하기 쉽게 만들고, cell (inline; 코드 입력줄)에 명령어를 입력하면 곧바로 결과를 확인할 수 있기 때문에 (powerful interactive language), 개발자들이 더 자주사용하게 되었어요.



하지만 IPython은 python을 위한 shell과 kernel만 제공해주기 때문에 다양한 언어를 사용하기 힘들다는 단점이 있었어요. 또한 추가적으로 다른 기능들을 제공해주려는 시도가 있었는데 이러한 project가 Jupyter project였어요.








<3. Jupyter NoteBook>


Jupyter는 IPython과 달리 Julia, R, Ruby 등의 언어를 추가로 지원해고 있어요. 또한 더 강력한 기능으로 인해 많은 사람들의 호응을 얻고 있는데요. 지금부터 천천해 알아보도록 하겠습니다.


Jupyter NoteBook은 쉽게 말해 Jupyter shell prompt라고 생각하시면되요. 먼저 Jupyter Notebook에 제공하는 기본적인 기능들에 대해서 알아볼게요.




1) MarkDown 언어 제공


https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Working%20With%20Markdown%20Cells.html


우리가 코드를 작성하다보면 주석을 사용하게되죠? Jupyter Notebook은 주석의 기능을 좀 더 다양하게 만들어주었어요.



1-1)큰 제목 (Heading) 제공해주기


먼저 cell을 생성 (insert 메뉴에 있어요)하고 생성된 cell을 Heading으로 바꿔줍니다



#을 몇번 작성해주는지에 따라 글자 크기가 달라집니다.


해당 cell에 shif+enter or run cell을 실행시키면 아래와 같이 읽기 쉽게 작성된다.




1-2) Markdown


Heading과 마찬가지로 주석기능을 하지만 구체적으로 코드에 대한 설명을 추가할때 markdown을 사용합니다. (작성방식과 실행방식은 Heading과 동일합니다)







1-3) 함수식 제공


Jupyter Notebook은 아래와 같은 함수에 대한 주석도 가능하게 해주는데요. 함수 주석에 대한 문법은 LaTex를 기반으로해요. 보통 논문을 작성하시는 분들께서 LaTex를 이용해 논문을 작성하시는데요. Jupyter Notebook의 함수식은 LaTex 문법을 기반으로 합니다.


https://en.wikibooks.org/wiki/LaTeX/Mathematics







1-4) 그외 기능


그외의 기능들이 무엇이있고 어떻게 사용하는지는 아래를 참고하면 될것 같아요~


https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Working%20With%20Markdown%20Cells.html#LaTeX-equations


https://m.blog.naver.com/ssdyka/221301296717





2) Visualization (실시간 대화형 위젯)


또한 Jupyter Notebook은 cell을 실행하면 이미지관련 작업도 곧바로 NoteBook에 보여줍니다.


<사진5>







3) 코드공유


Jupyter Notebook을 이용하면 Github, Dropbox, Jupyter Notebook Viewer 를 이용하여 코드를 다른사람들과 공유할 수 있어요. 자세한 설명은 아래 영상 13:35초를 참고해주세요! (Github에 대한 설명은 추후에 하도록할게요~)



(주피터 노트북 사용법)




4) Jupyter Notebook 원격접속


Jupyter Notebook은 외부에서도 내 Notebook을 보고 작업할 수 있도록 해줄 수 있어요. 아래 영상 3:10~6:21 부분을 보시면 원격접속 방법에 대해서 자세히 설명해줄거에요.



비밀번호 관련된 부분은 아래 사이트를 참고해주세요. (위의 영상과 같이 보시면 원격접속 세팅하시는데 큰 어려움은 없으실거에요)


(아래사이트는 우분투환경입니다)

https://light-tree.tistory.com/111

(아래사이트는 윈도우환경입니다)

https://m.blog.naver.com/PostView.nhn?blogId=zephyrline&logNo=220980726155&proxyReferer=https%3A%2F%2Fwww.google.com%2F








<4. Jupyter hub>


Jupyter는 애초에 처음부터 다중 유저가 공동작업할 수 있는 Jupyter hub 서비스를 제공해주기도 합니다.

(Jupyter hub는 아직 사용해본적이 없어서 나중에 사용하게되면 따로 글을 작성해보도록 할게요!)






<5. Jupyter Lab>


또한 현재 Jupyter Notebook을 업그레이드한 Jupyter Lab 서비스도 제공하고 있으니 필요에따라 사용하시면 될 것 같네요.




아! 참고로 가상환경에서 따로 주피터 노트북을 설치해서 사용하지 않으시면 root 환경의 jupyter notebook





지금까지 Jupyter Notebook에 대해서 알아보았어요~!

다음글에서는 jupyter Notebook을 기반으로 하는 Colab 서비스에 대해서 알아보도록 할게요! 







[글 래퍼런스]

https://nittaku.tistory.com/104

https://soooprmx.tistory.com/entry/iPython-%EC%84%A4%EC%B9%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95



[사진 래퍼런스]

사진1

https://www.dreamstime.com/continuous-line-drawing-two-men-sitting-laptop-computers-talking-question-continuous-line-drawing-flat-vector-image139657404

사진2

https://en.wikipedia.org/wiki/Operating_system

사진3

https://en.wikipedia.org/wiki/Kernel_(operating_system)

사진4

https://www.guru99.com/operating-system-tutorial.html

사진5

https://alistairwalsh.github.io/python-novice-gapminder/01-run-quit/