인턴 활동중 딥러닝 pretrain model 이나 모델 학습에서 회사에서 제공해 준 노트북의 VRAM 이 부족하여 서버를 하나 대여받게 되었다. 다른 분들도 이용하는 서버였기에 Docker 를 얹어서 그 안에 jupyter lab 을 깔고 그 jupyter lab 을 내 노트북과 연결하여 사용하기로 하였다.
환경 :
1. 노트북 : win11, 64bit, rtx3050 4GByte
2. 서버 : ubuntu20.04
1. mobaxterm 설치
이거는 어렵지 않고 관련 자료도 많아서 내가 참조한 블로그 링크를 남긴다
https://securityspecialist.tistory.com/141
2. Ubuntu 에서 Docker 설치 및 컨테이너 생성
2.1. ubuntu docker 설치 이 부분은 내 이전 포스팅에서 언급했으므로 링크만 남긴다.
여기서 Docker 는 ubuntu 20.04 image 를 활용하였는데 이에 대한 글도 아래 링크에 적어두었다.
https://jeahun10717.tistory.com/42
2.3. Docker image pull
$ docker pull [IMAGE]:[TAG]
# example
$ docker pull nvidia/cuda:11.7.0-devel-ubuntu20.04 # cuda toolkit만 포함
$ docker pull nvidia/cuda:11.7.1-cudnn8-devel-ubuntu20.04 # cuda toolkit, cudnn 포함
pytorch를 사용하던 tensorflow를 사용하던 딥러닝을 하려면 대부분 gpu를 활용할 건데 그냥 ubuntu를 받으면 cuda, cudnn 같은 gpu tool을 사용자가 설정해 주어야 한다. 하지만 위의 example 의 image 를 가져오면 그런 번거로운 과정이 필요가 없다.
2.3. Docker container 생성
$ docker container run -it --gpus all -d -p [호스트포트]:[컨테이너포트] --name [컨테이너이름] [이미지이름] /bin/bash
# -d 백그라운드 실행
# -p 포트 설정 : 도커컨테이너에 [호스트포트]로 접근하면 [컨테이너포트]로 연결해줌(바인딩)
# --name : 컨테이너 이름
# example
$ docker container run -it --shm-size=128G --gpus all -d -p 55520:8888 --name sjhUbuntu d5447fc01ae6 /bin/bash
- 위에서 사용한 docker run 은 이미지가 생성이 되어 있어야 가능하다. 따라서 위 2.1. 에서 포스팅한 내용을 참고하고 docker container run 에서 사용한 옵션들은 아래 링크를 참고하라
- docker run 옵션 정리 링크 :
https://jeahun10717.tistory.com/43
2.4. Docker Terminal 접근
Docker run 을 통해서 컨테이너를 생성했을 때 기본적으로 백그라운드로 돌아가게 된다.
Docker terminal 에 접근하기 위해서는 exec 를 사용한다.
$ docker exec -it --privileged cudaUbuntu /bin/bash
3. Docker 내부에 Jupyter lab 설치
3.0. ubuntu 내에 user 추가 및 sudoUser 비밀번호설정
# 아래 명령어들은 docker 의 초기 user 인 root 라고 가정한다.
# 1. apt update
apt update
# 2. sudo 설치
apt install sudo
# 4. root 유저 비밀번호 설정
passwd
# 5. user 추가
adduser [계정(유저)이름]
adduser jeahun
# 6. user 에 sudo 권한 추가
usermod -aG sudo [계정(유저)이름]
usermod -aG sudo jeahun
3.1. nvcc 연결 안되어 있을 시 실행
docker image 자체에 애초에 cuda toolkit 이 포함되어 있음에도 nvcc 명령어가 먹히지 않는 경우가 있다.
이에 아래 명령어를 작성하면 해결된다. (nvcc 링크 설정)
$ sudo nano ~/.bashrc
$ sudo vim ~/.bashrc
위의 설정 파일이 열리면 아래 실행
export PATH="/usr/local/cuda-11.7/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH"
변경 사항 적용
$ source ~/.bashrc
3.2. Docker 내부에 anaconda 설치
아나콘다 설치 역시 어렵지 않은 부분인데 Docker 를 처음 만들었을 때 대부분 root 로 시작하므로 우리가 일반적인 상황이 아니므로 주의가 필요하다. Root 에서 무언가 설치를 하는 경우 경고가 많이 뜨게 되는데 이를 피하긴 위해선 귀찮더라도 user 를 하나 만들어주는 게 좋다. root 에서 anaconda 를 설치하는 경우 /home/[username]/anaconda3 와 같은 형태로 설치가 안될수도 있다. 이러한 문제만이 아니더라도 만약 다른 프로그램을 설치한다고 하더라도 보통 사람들은 root 계정으로 설치를 진행하는 경우가 드물기에 구글링을 하는데에도 어려움이 있을 수 있다.
(사실 권한 문제나 여타 다른 문제들이 발생하더라도 Docker 는 컨테이너만 날리면 돼서 크게 걱정하지 않아도 될 것 같다.)
# anaconda 설치파일 설치
# 밑의 명령어 2개중 1개만 실행하면 됨
curl -O https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh
# bash 실행
bash Anaconda3-2022.10-Linux-x86_64.sh
# 주의! : 위의 명령어를 실행하면 내가 지금 접속해 있는 유저의 하위에 설치됨
https://velog.io/@boom109/Anaconda-%EC%84%A4%EC%B9%98-on-Ubuntu-20.04-LTS
3.3. Docker 에 jupyter lab 설치
위의 과정에서 성공적으로 anaconda 를 설치하고 conda 가 정상적으로 동작한다면 해당 버전에 맞는 python 과 pip 가 깔려 있을 것이다. jupyter lab 설치는 아래 명령어를 치면 된다.
$ pip install jupyterlab
4. 내 컴퓨터와 서버 연결
제일 위에서 말했다시피 현재 내가 해결해야하는 일은 내 labtop 에서 jupyter 를 연결하는 것이다. 그 기본에 해당하는 모든 설치 작업은 위에서 마쳤고 이제는 연결을 진행한다. 아래에서부터 진행할 때 내가 개인적으로 사용하는 노트북을 pc, 연결해야하는 서버를 ubuntu server, 그 안에 jupyter 를 실행하고 있는 docker 를 docker server 라고 부르겠다. 또한 전체적인 연결 그림은 아래와 같으니 아래 그림을 참고하여 이해하면 될 것 같다.
4.1. ubuntu server, docker server 포트 개방
ubuntu server 에서 특정 포트를 개방하여 외부에서 접근이 가능하도록 만들어야 한다. 이에 대한 설명은 아래 링크에 자세히 나와 있으니 참고하라. 또한 docker server 에서 jupyter lab 이 열릴 8888 포트 역시 개방해 주어야 한다.
https://server-engineer.tistory.com/840
4.2. ubuntu server 와 docker 서버간의 연결
이에 대한 작업은 2.2. docker container 생성 부분에서 ubuntu server 에서 접속할 포트 55520 을 jupyter lab 에서 열려 있는 8888 포트를 연결하는 작업에서 이미 끝마쳤다.
$ docker container run -it -d -p 55520:8888 --name sjhUbuntu d5447fc01ae6 /bin/bash
# gpu 를 사용해야 할 경우는 docker image 가 gpu 를 지원하는지 확인하고
# 아래 명령어를 사용하면 된다.
docker run -it -d -p 55520:8888 --gpus all --name cudaUbuntu c59453d3655b /bin/bash
# 기본적으로 shm(공유메모리 설정) 은 default 로 하더라도 문제가 없었다.
# 그런데 컨테이너를 여는 과정에서 실수가 있었던 건지 shm 이 지나치게 작게 잡히는 문제가 발생했다.
# 이에 shm 을 명시하여 Docker Container 를 여는 것을 추천한다.
docker container run -it -d -p 55555:8888 --gpus all --shm-size=128G --name dockerTest 4157de9bccb1 /bin/bash
4.3. jupyter lab 외부접근 허용
jupyter lab 의 외부접근 허용에 관한 포스팅은 아래 링크를 참고하라.
주의할점이 하나 있는데 아래 링크에 들어가 보면 c.NotebookApp.ip 와 같은 형태로 되어 있는데 이는 jupyter notebook 의 설정이다. 만약 jupyter lab 을 사용하고 싶다면 NotebookApp 을 ServerApp 으로 수정하여 똑같이 작성하면 문제없이 동작한다.
https://jeahun10717.tistory.com/24
# jupyter notebook 일 경우
$ jupyter notebook --generate-config
$ vim ~/.jupyter/jupyter_notebook_config.py
> c.NotebookApp.allow_origin = '*' # 외부 접속 허용하기
> c.NotebookApp.notebook_dir = 'jupyter 실행시 시작 위치' # 작업경로 설정
> c.NotebookApp.ip = '접근할 ip' --> 모든 아이피에서 접근하려면 '0.0.0.0' # 아이피 설정
> c.NotebookApp.port = 8888 # 포트설정--> 반드시 숫자로!
# jupyter lab 일 경우
$ jupyter lab --generate-config
$ vim ~/.jupyter/jupyter_lab_config.py
> c.ServerApp.allow_origin = '*' # 외부 접속 허용하기
> c.ServerApp.notebook_dir = 'jupyter 실행시 시작 위치' # 작업경로 설정
> c.ServerApp.ip = '접근할 ip' --> 모든 아이피에서 접근하려면 '0.0.0.0' # 아이피 설정
> c.ServerApp.port = 8888 # 포트설정--> 반드시 숫자로!
4.4. ssh 터널링 작업
위에서 아래 그림의 ubuntu server 와 docker server 간의 연결은 끝마쳤다.
이제 pc 와 ubuntu server 를 ssh 터널링을 통해 연결을 해보자.
터널링을 위한 명령어는 아래와 같다. 이 명령어는 내 pc 에서 mobaxterm(linux 기반 터미널이면 다른 것도 상관 없음) 을 통해 입력해야 한다
$ ssh -L [pcPort]:[ubuntuUserIP]:[ubuntuUserPort] -N [username]@[externalIP]
# pcPort : ubuntu server 에 연결할 "pc" 의 내부포트
# ubuntuUserIP : pc 에서 내가 접근할 ubuntu server 의 특정 user 의 내부 ip
# ubuntuUserPort : pc 에서 내가 접근할 ubuntu server 의 특정 user 의 port
# username : ubuntu server user 의 이름
# externalIP : 외부에서 ubuntu server 에 접근할 때 사용하는 외부 IP
# 사용예
$ ssh -L 32444:192.168.52.77:55520 -N User_jeahun@168.115.97.85
4.5. 접속 되는지 확인
내 pc 에서 http://localhost:32444/lab 에 접근해보면 잘 접근되는 것을 알 있다. 아래 메일로 문의 하면 된다.
jeahun10717@gmail.com
'프로그램 설치 및 환경설정 > Docker' 카테고리의 다른 글
[Docker] Ubuntu Server Docker Container - 외부 pc vscode 연결 (0) | 2024.02.15 |
---|---|
[Docker] Docker Container 생성, 삭제, 실행 명령어 (0) | 2023.01.11 |
[Docker] Ubuntu(20.04) Docker 설치 (1) | 2023.01.10 |