[DL 서버구축] 4. Jupyter 설치

Anaconda가 설치되어있다는 가정 하에 Jupyter를 설치한다.
Jupyter Lab은 Jupyter Notebook을 개선한 것이기 때문에 둘의 설정 방법은 동일하다.
실행할 때만 jupyter notebook으로 할지, jupyter lab으로 할지만 바꾸면 된다.

1. 비밀번호 설정

Anaconda에는 Jupyter Notebook이 이미 설치되어있다.
비밀번호를 설정한 후 백그라운드에서 돌려주기만 하면 된다.

>>> from notebook.auth import passwd
>>> passwd()
Enter password: 
Verify password: 
'sha1:<암호화된 비밀번호>'

이제 config 파일을 생성한 후 암호화된 비밀번호를 넣어주면 된다.

$ jupyter notebook --generate-config
$ vi ~/.jupyter/jupyter_notebook_config.py

# In vi editor
# Password to use for web authentication
c = get_config()
c.NotebookApp.password = u'sha1:<암호화된 비밀번호>'

Jupyter Notebook이나 Lab을 백그라운드에서 실행하기 위해서는 백그라운드로 프로세스를 실행한 후 nohup으로 프로세스를 데몬화하면 된다.
IP나 포트를 지정하고 싶다면 아래의 커맨드에 적당히 채워주면 된다.

$ nohup jupyter notebook --no-browser > jupyter.log &
or
$ nohup jupyter notebook --ip=xxx.xxx.xxx.xxx --port=xxxx --no-browser > jupyter.log &

이 경우 Jupyter를 종료하고 싶으면 ps와 grep을 사용하여 프로세스를 직접 종료해야 한다.

$ ps -eaux | grep jupyter
$ kill <프로세스 ID>

2. Jupyter Script

위에서 소개한 Jupyter의 실행과 종료를 스크립트화할 수 있다.
실행중인 파이썬을 모두 종료하도록 작성했는데, 적당히 수정해서 쓰면 된다.

#!/usr/bin/zsh
PYTHONPATH="/usr/anaconda3/bin/python3"

# Argument Validation
if [ $# -ne 1 ]; then
    echo "Run with the correct command: <run|kill|restart>"
    exit
fi
if [ "$1" != "run" -a "$1" != "kill" -a "$1" != "restart" ]; then
    echo "Run with the correct command: <run|kill|restart>"
    exit
fi

# Run Jupyter Lab
if [ "$1" = "run" ]; then
    nohup jupyter lab --ip=1.1.1.1 --port=1111 --no-browser > jupyter.log &
    exit
fi

# Kill Jupyter Lab
if [ "$1" = "kill" ]; then
    # kill $(ps eaux | grep jupyter | awk '{print $2}' | sed -n '1p')
    killall -s SIGTERM $PYTHONPATH
    exit
fi

# Restart Jupyter Lab
if [ "$1" = "restart" ]; then
    killall -s SIGTERM $PYTHONPATH &&
    nohup jupyter lab --ip=1.1.1.1 --port=1111 --no-browser > jupyter.log &
    exit
fi

다음의 방법으로 Jupyter를 백그라운드에서 실행하고 종료할 수 있다.
물론 스크립트기 때문에 첫 실행 전에 chmod +x jupyter.sh를 실행해주어야 한다.

$ ./jupyter.sh run
$ ./jupyter.sh kill
$ ./jupyter.sh restart

3. Jupyter Service

서비스를 사용할 수 있는 환경이라면 위의 스크립트보다 서비스를 사용하는 것이 훨씬 편하다.
Centos7 기준으로 다음과 같이 jupyter.service를 작성한다. (<> 안의 내용은 알맞게 수정해주면 된다)
서비스는 상대경로(소프트링크)를 사용할 수 없기 때문에 which jupyter를 통해 Jupyter 바이너리 경로를 찾아 입력해야 한다. (예시: /usr/anaconda3/bin/jupyter)
참고로 필자는 /opt/jupyter에서 서비스를 관리할 생각이다.

[Unit]
Description=Jupyter Notebook for hooni
After=multi-user.target

[Service]
Type=simple
ExecStart=<Jupyter경로> lab --ip=<IP주소> --port=<Port번호> --no-browser
Restart=always
RestartSec=5
User=hooni

PIDFile=/opt/jupyter/jupyter.pid
WorkingDirectory=/opt/jupyter
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

서비스를 만들 때 중요한 점은 서비스를 실행하기 전 ExecStart 구문이 잘 동작하는지 쉘에서 먼저 실행해보는 것이다.
예를 들어 User를 root로 써놓고 위 서비스를 실행한다면 아나콘다 환경에서는 jupyter가 실행되지 않을 수 있다. (아나콘다는 보통 유저별로 설치하기에 root에는 아나콘다가 없기 때문)

/etc/systemd/system 안에 서비스를 만들었다면 그대로 사용해도 되나, 필자처럼 별도의 경로에 service를 작성한 경우에는 /etc/systemd/system 안에 링크를 만들어주어야 한다.

$ sudo ln -s /opt/jupyter/jupyter.service /etc/systemd/system/jupyter.service

그 후 서비스를 실행하면 된다.

$ sudo ln -s /opt/jupyter/jupyter.service /etc/systemd/system/jupyter.service  # 배포
$ sudo systemctl enable jupyter  # Jupyter 부팅 시 자동실행
$ sudo systemctl start jupyter  # Jupyter 실행
$ sudo systemctl stop jupyter  # Jupyter 종료

cf. 방화벽

방화벽이 닫혀있는 경우 당연히 외부에서 서비스에 접근할 수 없다.

예를 들어 Ubuntu의 경우 다음과 같이 (필자의 Jupyter 포트는 1111이다)

$ sudo ufw allow 1111/tcp
$ sudo ufw reload

CentOS의 경우 다음과 같이

$ sudo firewall-cmd --permanent --zone=public --add-port=1111/tcp
$ sudo firewall-cmd --reload

방화벽을 해제할 수 있다.

Series Navigation<< [DL 서버구축] 3. Ubuntu 18.04에 CUDA/cuDNN/PyTorch 설치

댓글 남기기