본문 바로가기

환경구성

Synology에 docker + miniconda +JupyterLab server 올리기

반응형

새해 목표로 딥러닝 공부를 계획하면서, 딥러닝 개발환경을 어떻게 구성할까 고민을 하던 중,

이번에 장만한 Synoloy DS1621+에 miniconda docker이미지를 사용해서 개발환경을 구성했습니다.

Docker가 익숙친 않을뿐더러 miniconda는 처음 써보는 거라 환경 구성에 꽤나 애를 먹었는데,

이번에 고생한 걸 복기하기 위해 정리겸 포스팅하겠습니다.

 


1. Miniconda

Python에서 사용되는 패키지들을 쉽게 관리해주는 툴입니다.

Miniconda 이전에 Anaconda라는 Miniconda보다 더 많은 패키지를 보유한 툴이 있는데,

여기에는 딥러닝에 필요한 scikit learn, numpy, tensorflow까지 약 1500 이상의 패키지가 설치되어 있다고 합니다.

대신, 3GB 이상의 저장공간을 필요하고, 사용하지 않을 패키지까지 설치되어 어느 정도 컴퓨터 사양이 갖춰져야 할 필요가 있습니다.

반면, Miniconda는 Anaconda의 minimize버전인데, python구동에 필요한 최소의 패키지만으로 구성되어 있습니다.

요즘에는 Miniconda를 사용해서 필요한 패키지로만 구성해서 사용하는 것이 대세인 듯합니다.

 

저는 GPU가 없는 버전의 tensorflow를 이용할 것이므로 (그렇게 많은 패키지를 쓸 것 같지도 않지만,,) 제가 원하는 패키지만 구성할 생각이라 Miniconda를 사용했습니다.

Miniconda 위에 JupyterLab패키지를 설치하여 개발환경을 구성하려 합니다.


2. JupyterLab

웹브라우저 IDE에서 작성한 코드를 서버사이드에서 실행할 수 있는 툴입니다.

iPython이라는 커널을 사용하고, 특징으로 cell 단위로 코드를 실행하고 결과를 확인할 수 있어서,

전체 코드를 실행하는 python과는 달리 빠른 디버깅과 원하는 부분의 코드만 실행해볼 수 있다는 장점이 있습니다.

JupyterLab 이전에 JupyterNotebook이 있는데, 둘의 차이점은 다중 탭 지원, 여러 가지 플러그인들의 확장성이 이점이라고 합니다.

JupyterNotebook을 확장해서 만든 프로젝트라고도 하네요.

사실 저도 JupyterNotebook은 사용해본 적이 없어서 자세하게 설명이 어렵네요 ㅎㅎ;;

아무튼 대세는 JupyterLab입니다.


3. 환경구성 (Docker)

아래는 JupyterLab 서버 환경에 대한 도식입니다.

Synoloy 서버 위에 다운로드한 Miniconda docker 이미지를 올리고, 그 위에 JupyterLab 서버를 올려 3단계 구성을 했습니다.

miniconda환경을 구성하기 위해 "continuumio/miniconda3"를 docker패키지-> 레지스트리에서 다운로드합니다.

 

Dokerfile을 작성합니다.

FROM continuumio/miniconda3: 다운로드한 이미지를 불러오고,

RUN conda install -c conda-forge jupyterlab: conda 명령어를 사용해 jupyterlab을 설치합니다.

 

RUN conda install -c conda-forge nodejs
RUN jupyter labextension install @jupyterlab/debugger
RUN conda install xeus-python -c conda-forge

설치된 jupyterLab에 디버깅 툴을 달기 위해 nodejs와 debuger를 같이 설치합니다.

 

완성된 Dockerfile은 아래와 같습니다.

FROM continuumio/miniconda3

LABEL maintainer="movingjin <*****@gmail.com>"
LABEL version="0.1"
LABEL description="Debugging Jupyter Lab"

WORKDIR /jup

RUN conda install -c conda-forge jupyterlab
RUN conda install -c conda-forge nodejs
RUN jupyter labextension install @jupyterlab/debugger
RUN conda install xeus-python -c conda-forge

EXPOSE 8888

ENTRYPOINT ["jupyter", "lab","--ip=0.0.0.0","--allow-root"]

 

작성된 Docker파일만으로 실행을 해도 되지만,

실행할 때, 외부에서 port를 지정하여 연결해야 된다는 점과 컨테이너가 종료되었을 때, 그동안 기록했던 모든 데이터가 유실된다는 단점이 있습니다.

port와 mount를 지정하기 위해 docker-compose.yml 파일을 아래와 같이 작성했습니다.

docker 컨테이너 내부에 EXPOSE로 열린 8888 포트를 호스트에서 8888 포트로 연결해줍니다.

 

docker에서 mount는 두 가지 종류가 있는데요,

host 쪽에서 작성된 파일이 컨테이너로 전달될 수 있는 bind mount 방식과

컨테이너에서 생성된 data파일을 백업 목적으로 host 측 디렉토리에 저장하는 volume방식이 있습니다.

저는 config파일이 host에서 수정되어 컨테이너가 실행되길 원했으므로

jupyter_lab_config.py 파일은 bind mount로,

jupyter에서 작성한 소스코드는 host 측에서 편집하지 않을 것이므로 data 파일은 volume으로 지정했습니다.

miniconda docker로 jupyterLab 서버를 설치 시, 기본 설정파일 저장위치는

/root/.jupyter/jupyter_lab_config.py 입니다.

version: "3.7"
services:
  miniconda:
    build: .
    ports:
      - "8888:8888"
    volumes:
      - type: bind
        source: ./mount/config/jupyter_lab_config.py
        target: /root/.jupyter/jupyter_lab_config.py
      - type: volume
        source: jupyter_lab
        target: /jup
volumes:
  jupyter_lab:

 

그 뒤에, 이미지를 빌드 후 빌드된 이미지를 실행시켰습니다.

#sudo docker-compose build
#sudo docker-compose up -d

 

처음에 jupyterLab server를 실행시키고 지정한 도메인으로 접속하면

token을 입력하라는 화면이 나옵니다.

jupyterLab을 실행할 때, token이 출력되어 나오지만, 매번 접속할 때마다 token을 입력한다는 건 여간 불편한 일이 아닙니다.

마운트한 jupyter_lab_config.py에서 설정을 수정하여 패스워드를 입력하여 접속하는 방식으로 바꾸겠습니다.

아래 명령어로 컨테이너 내부로 접속한 뒤,

#sudo docker exec -it <컨테이너id> /bin/bash

jupyter_lab_config.py파일을 생성합니다.

 

$jupyter lab --generate-config

jupyter_lab_config.py파일은 docker 컨테이너 내부에서 /root/.jupyter/ 위치해 있고,

이 위치를 host쪽 ./mount/config 경로에 저장되도록 docker-compose.yml을 작성하였으니,

host쪽에도 똑같은 파일이 생성되어 있습니다.

 

컨테이너에서 python3 쉘로 들어간 뒤, 아래 코드를 작성하여 비밀번호를 설정합니다.

$python3
>>>from notebook.auth import passwd; passwd()

 

비밀번호 설정 후엔 해시값이 출력되어 나타나는데,

출력된 해시 값을 복사한 뒤, jupyter_lab_config.py에서

c.NotebookApp.password 이 부분을 주석 해제하여 복사한 해시값을 붙여 넣습니다.

c.NotebookApp.password = '해시값'

 

그 뒤에, 컨테이너를 종료한 뒤, 다시 실행시키면

패스워드를 묻는 창이 나타나게 됩니다.

 

패스워드 입력 후, jupyterLab에 접속하면 아래와 같이 나오면 설치가 완료된 겁니다.

 

글이 다소 길어져서 조금 까다로워 보일 수 있는데,

사실 Dockerfile이랑 docker-compose파일만 작성되면, 거의 할 일이 없다고 보면 됩니다

물론 그것 때문에 시간을 많이 쓰긴 했습니다,, ㅎㅎ;;

반응형