본문 바로가기
Backend MLOps/개인 환경 구축 기록

[ 자취방 워크스테이션 ] # 19 주피터 노트북 기본 설정

by SteadyForDeep 2021. 3. 20.
반응형

//1

이전 글에서 우리는

주피터 노트북을 포함하고있는 도커 이미지를 통해 컨테이너를 만들고

컨테이너 내부에서 주피터 서버를 열어보는 과정을 해봤다.

 

내가 한가지 불친절했던 부분은

도커를 열면서 동시에 주피터를 켜게 하는 베쉬스크립트를

왕창 던져만 주고 자세하게 설명하지 않은 것이다.

 

이 부분을 하나하나 짚어가면서 자세하게 다뤄보겠다.

아울러 주피터 노트북을 열기만 하는 것이 아니라 비밀번호를 설정한다던지

글꼴을 바꾼다던지 하는 기본설정 방법도 알아보자.

 

 

 

 

//2

아래의 링크에서 작성했던 베쉬스크립트를 다시 보자.

2021.03.19 - [딥러닝/개인 환경 구축 기록] - [ 자취방 워크스테이션 ] #18 도커에서 주피터 열어서 외부접속 해보기

 

[ 자취방 워크스테이션 ] #18 도커에서 주피터 열어서 외부접속 해보기

//1 도커를 깔았다. 그런데 뭐 하는 건지 아직 감이 안 잡힌다. (정상이다) 백문이 불여일타라고 한번 해보자. //2 우선 도커는 UNIX소캣에 물린 서로 다른 가상의 작은 컴퓨터들로 이해한다고 했었

davi06000.tistory.com

docker run \
        -d \
        --gpus all \
        -p 8888:8888 \
        -p 6006:6006 \
        --name tensorflow_gpu \
        tensorflow/tensorflow:latest-gpu-jupyter \
        jupyter notebook \
        --allow-root \
        --ip 0.0.0.0 \
        --NotebookApp.token='' \
        --no-browser

하나 하나 뜯어보면 이렇다.

 

큼직하게는

docker run [OPTIONS] tensorflow/tensorflow:latest-gpu-jupyter [COMMANDS]

이고 

 

[OPTIONS]에 해당하는 부분이

-d

--gpus all

-p 8888:8888

-p 6006:6006

--name tensorflow_gpu

 

[COMMANDS]에 해당하는 부분이

jupyter notebook

--allow-root

--ip 0.0.0.0

--NotebookApp.token=''

--no-browser

 

이다.

 

 

 

 

//3

docker run 의 옵션부분을 자세하게 보자.

 

-d :

detach모드로 실행하라는 의미로 도커를 백그라운드에서 돌리라는 말이다.

이전글에서 도커 컨테이너를 이해할때 가장 중요한 부분이 바로

도커 컨테이너는 내부에서 무언가 돌아가고 있어야만 running 상태가 유지된다.

라고 했다.

이는 완성된 앱의 배포에 특화된 기능이기 때문이라고 설명했었는데

일반적으로 완성된 앱은 항상 이용자의 요구를 기다리는 상태로 실행되고 있다.

무한루프의 일종이라고 보면 된다.

그런데 우리가 CLI에서 무한루프를 돌려버리면 다른 작업을 할 수 없는 상태에 빠지게 된다.

따라서 도커 컨테이너를 백그라운드에서 실행하여 바로 다음작업을 계속 진행하고 싶을때 이 옵션을 준다.

이 옵션을 주지 않는 경우 즉 attach모드로 실행하면 도커에서 발생한 입출력을 모두 보게 된다.

 

--gpus all :

nvidia-docker를 사용할때 지피유를 쓰고싶으면 넣어주는 옵션이다.

 

-p 8888:8888

-p 6006:6006

도커 내부의 포트 8888 을 도커 외부 즉 우분투의 TCP포트 8888로 연결한다는 말이다.

8888은 jupyter의 디폴트 포트이고 6006은 tensorboard의 디폴트 포트이다.

 

--name tensorflow_gpu

이 컨테이너의 이름을 tensorflow_gpu로 하겠다는 말이다.

docker ps로 볼때 NAME에 표시되는 것을 말한다.

 

이것 말고도 유용한 옵션들이 많으니 꼭 help를 읽어보고 기능들을 직접 on/off해보면서

직접 차이점을 이해하는 과정을 거쳐야 한다.

 

 

 

 

//4

이번엔 주피터를 켤때 사용하는 옵션을 볼 것이다.

jupyter notebook :

주피터 노트북을 열어라 라는 말이다. 

주피터를 여는 방법은 노트북도 있고 랩도 있어서 주피터의 커맨드로 노트북을 주게된다

띄어쓰기를 하거나 하이픈을 넣어주면 된다.

 

--allow-root :

주피터 노트북은 웹서버의 형태를 가지기 때문에 외부에서 접속하는 것을 원칙으로 한다.

따라서 루트계정에서 서버를 여는 것을 따로 허락해줘야되는데

도커 컨테이너의 기본 계정은 root이기 때문에 컨테이너를 생성하면서 바로 jupyter를 열려면

이 옵션을 꼭 붙여줘야 한다. 

 

--ip 0.0.0.0 :

ip가 0.0.0.0이라니 무슨 의미인가 싶다.

ip 넘버링 중에서 특수한 몇가지 경우중 하나에 해당하는데

쉽게 말하자면 본인의 ip를 모를때 사용한다.

즉 ip를 어떠한 값으로 대체하든 상관없다는 말인데

DHCP서버와 같은 ip할당 주체에게 내 패킷만을 전송하고

ip의 입력은 맡겨버리는 형태다.

컨테이너는 한 대의 새로운 컴퓨터이기 때문에 ip를 새로 할당받게 된다.

따라서 할당되는 ip를 모른다면 0.0.0.0으로 설정해주고 포트만 잘 지정해 주면 된다.

 

--NotebookApp.token='' :

주피터를 처음에 열면 토큰 이라는 난수를 받아서 그 값을 입력하고 내가 누구인지

서버에 등록하는 절차를 거쳐야한다.

ssh를 처음 접속할때 키를 할당받는 것과 동일한 작업이라고 보면 된다.

그런데 이 토큰이 매우매우 길기 때문에 복붙하기 어려운 상황이라면

접속이 불가능하다고 보면된다.

따라서 토큰을 생략해서 이 인증절차를 잠시 꺼둘 수 있다.

인증을 다시 활성화하는 방법은 후에 다루겠다. 

 

--no-browser

우리가 윈도우에서 주피터를 열때 자동으로 브라우저가 뜨고

주피터에 접속했던 것을 기억할 것이다.

서버에서는 이 기능이 필요하지 않으므로 브라우저를 띄우지 않는 옵션을 준다.

 

이런식으로 주피터에서 원하는 기능과 원치 않는 기능을 on/off하면서

나에게 딱 맞는 주피터를 열 수 있다.

 

 

 

 

//5

이번에는 주피터의 기본설정을 다뤄보자.

그러기 위해서는 컨테이너에 다시 접속해서 터미널을 열어야 한다.

 

두 가지 방법을 소개할 것이다.

첫번째 방법은 주피터에서 여는 것이다.

IP : PORT 를 입력해서 주피터에 들어가면

여기 터미널을 열 수 있다.

터미널을 끄는 방법은

러닝으로 가면 지금 실행중인 세션들을 모두 볼 수 있고 터미널에서 내가 끄고자하는 터미널을 찾아

셧다운 시키면 된다.

 

두분째 방법을 더 권장하는데

도커 컨테이너로 직접 들어가는 방법이다.

 

ssh로 접속해서 컨테이너가 돌아가고 있는 우분투에서 도커 명령어를 입력한다.

$ docker exec -it [CONTAINER] /bin/bash

나는 tensorflow_gpu라는 컨테이너에 접속할 것이므로 NAME자리에 대입하도록 하겠다.

루트계정으로 들어온 것이 보인다.

 

exec은 runnuing 중인 컨테이너에 명령을 내리는 명령어다.

 

-it 는 -i 와 -t가 동시에 쓰인것이다.

 

-i는 interactive 모드로 컨테이너와 상호작용을 하면서 입출력을 주고 받을때 사용한다.

 

-t는 tty를 사용한다는 뜻인데 tty는 TeleTypewriter의 약어로

쉽게 말하면 키보드를 사용하여서 컴퓨터를 컨트롤 하겠다는 말이다.

 

/bin/bash는 베쉬 쉘을 여는 명령어다.

 

즉 터미널을 하나 띄워라 하는 명령을 이렇게 풀어서 적어둔 것이다.

 

이제 터미널을 띄워서 들어갔으므로 아래의 명령어를 입력해준다.

$ jupyter notebook --generate-config

환경설정 파일을 만들어라는 명령어다.

그러면 환경설정 파일이 어디에 생겼는지 알려준다.

닷을 꼭 붙여주고 주피터 디렉토리로 간다.

json 파일과 py파일이 눈에 띄는데 py파일을 수정해주면 된다.

vim조차없는 환경이기 때문에

# apt-get install vim

을 통해서 vim을 받아준다.

다 받아지면 vim을 이용해서 이 파일을 열어준다.

모든게 주석처리되어있다.

 

여기서 우리는 필요한 설정을 찾아다가 주석을 풀고 기본값을 넣어줌으로써

주피터의 기본설정을 바꿀 수있다.

 

입력모드가 아닌 상태에서 슬래시(/)를 누르고 키워드를 입력하면

그 키워드가 어디 있는지 알려준다.

 

패스워드를 설정해 보자.

성공한 모습이다.

그런데 저기는 가만히 읽어보니 패스워드 바꾸기 허용에 관한 것이지

패스워드를 설정하는 구문은 아니다.

 

이때는 엔터를 누르고 n을 누르면 다음번째 키워드를 보여준다.

해싱된 패스워드를 사용하는 구간이 나왔다.

여기서 해싱된 패스워드를 입력하고 기본 암호로 사용이 가능하다.

 

해싱에대해 짧게 설명하면 역함수가 없는 함수라고 보면 된다.

역함수를 찾기 굉장히 어려워서 이 함수를 한번 통과하고나면

데이터의 원형을 절대 추론할 수 없는 경우가 있는데 이런 경우 암호로 쓰기 적합하다고 할 수 있다.

 

ESC+:q!를 통해서 vim에서 잠깐 나가보자.

 

그리고 아래와 같은 스크립트를 만들어두자.

$ vim jupyter_pw_gen.py

vim이 뜨면 i를 눌러서 입력모드로 들어간 후 아래와 같이 작성하고

import notebook.auth import passwd
print(passwd())

ESC + :wq를 통해서 저장 후 종료를 한다.

 

이제는 터미널에서

$ python jupyter_pw_gen.py

라고 입력해준다.

원하는 패스워드를 한번 입력하고

똑같은 패스워드를 한번 더 입력하면

아래와 같이 argon2 : ... 라고 시작하는 난수가 나온다.

이게 바로 해싱된 암호에 해당한다.

 

어떤 함호화 체계를 썼느냐에 따라 sha1이나 sha0 같은 것으로 시작할 수 있다.

주피터 암호설정에 대한 많은 포스팅이 있고 대부분이 sha에 대한 것으로

argon이 나오면 당황스러울 수 있다.

하지만 똑같은 형태의 다른 방식의 암호이므로 그대로 사용해주면 된다.

print된 라인 전체를 드래그+우클릭 으로 복사해서

아까 그 config파일 내의 패스워드가 있는 부분으로 가준다.

 

그리고 이렇게 u'' 안에 넣어주고 저장후 종료를 해준다.

 

그리고는 터미널에 exit를 입력하더거나 Ctrl+D를 통해서 컨테이너를 빠져나온다.

그리고 컨테이너를 다시 시작해주면 정상적으로 비밀번호가 동작하는 것을 알 수있다.

주피터에서 설명하는 자동으로 암호를 지정하는 방법도 있으나

나중에 뭘로 했는지 헷갈릴수도 있으니 이런식으로 관리하는 방법이 더 좋다.

 

눈치 챘는지 모르겠지만 저기 c. 이후로 나오는 메소드들은

모두 주피터 노트북을 실행할때 옵션으로 넣을 수 있다.

 

따라서

컨테이너를 만드는 베쉬를 간단하게 작성하고

저 파일을 잘 읽어보고 원하는 기능을 수정하거나

컨테이너를 만드는 베쉬에 옵션으로 달아서 사용이 가능하다.

 

편한대로 사용하면 되겠다.

 

 

 

반응형

댓글