본문 바로가기
연구실

[docker][Ubuntu 22.04] 딥러닝 서버 초기 셋팅하기 A to Z

by 오늘도 작심삼일 2023. 11. 15.

0. 우분투 설치하기

꺼져있는 컴퓨터에 우분투 부팅 디스크를 꽂고 전원버튼을 누름과 동시에 F2 or F12 or del 키를 연타한다. 한치의 망설임도 있어서는 안된다 (망설였다가 실패한 적 있음). BIOS에 진입하면 내가 꽂은 디스크를 클릭해 부팅 1순위로 끌어올려놓고 exit 하면 우분투 설치 및 설정이 시작된다. disk 포맷을 선택하고 새 우분투를 설치해준다. 언어는 영어로 두는 것이 매우 중요하다.

1. 그래픽 드라이버 설치

$ sudo ubuntu-drivers devices

위의 명령어를 ($ 는 빼고) 입력하면 많은 driver가 나올텐데 보통 recommended를 설치하면 될 것이다. 하지만 그 보통이 아닌 경우도 많다. 이 다음에 나오는 명령어들을 이용해 설치했는데 nvidia-smi명령어에서 driver가 잘 잡히지 않는다면 마음을 비우고 driver를 다 제거하고 (혹은 ubuntu 재설치 후..) recommended가 아닌 조금 더 낮은 버전의 driver를 설치해보면 되는 경우가 있다. (꽤 흔하다. 나도 알고싶지 않았다..)

$ sudo apt install nvidia-driver-535 (본인에 맞게)
$ sudo reboot
$ nvidia-smi

나는 nvidia-driver-535가 recommended로 떠서 설치했고 다행히 한번에 작동했다. 

2. docker 설치

여기 공식 사이트에서 제시하는 대로 따라하는 것이 제일 좋다. sudo docker run hello-world가 잘 실행된다면 성공한 것이다. 위 페이지 제일 하단에 나와있는 post-installation steps를 잊지말고 해주자. sudo 없이 docker를 실행시킬 수 있게 하는 과정인데 안 하면 vscode에서 docker extension이 작동하지 않는다. 

2.1. 딥러닝 할 때 docker가 왜 필요할까?

역시나 나도 이 귀찮은 과정을 가고 싶진 않았다.. 처음에는 사수 선배님이 시키니까 속으로 투덜거리며 사용하기 시작한 도커와 컨테이너였다. 처음 도커를 써서 다행이다라는 생각이 들었을 때는 apt install로 gpustat이라는 걸 설치를 했는데 설치 과정에서 cuda가 뭔가 업데이트가 된건지 뭔지 갑자기 해당 container 내부에서 그래픽 드라이버가 잡히지 않고 nvidia-smi 명령어도 작동하지 않게되었다. pytorch에서 cuda를 잡지 못하게 되었고 잘 쓰고 있던 환경이 순식간에 망가졌다. 고치는 것 보다 우분투는 미는게 빠르고 후환이 없기 때문에 이 사고가 우분투 본체에서 발생한 것이라면 우분투부터 재설치를 해야했을 것이다.

하지만 우리는 docker container 내부에서 일어난 일이므로 작업중이던 코드는 git에 올려두고 고장난 container는 삭제해버리면 끝 이다. 미리 백업해둔 cuda가 잘 작동하는 docker image를 실행시켜서 새 container를 만들면 순식간에 환경을 복구 할 수 있다. 

물론 본인이 사용하는 코드들이 서로 다른 python 버전을 필요로 한다거나, 서로 다른 pytorch 버전을 필요로 한다거나, 서로 다른 cuda 버전을 필요로 할 때에도 각 코드를 위해 개별적인 container를 운영하면 된다는 장점도 있다. (그래픽 드라이버의 경우는 다르다. 로컬에 설치되어 한 버전을 모든 container가 공유한다.)

3. cuda & cudnn 포함된 docker image 다운로드 & container 실행하기

여기에서 Tag 부분에 자신에게 맞는 ubuntu 버전을 입력하면 사진과 같이 여러 image들의 목록이 뜬다. 

####### 꼭 devel 이라고 써있는 이미지를 선택해야 한다. #######
cudnn , devel , ubuntu22.04 3가지가 모두 있는지 확인하고 선택하도록 한다. 

맨 앞의 숫자는 cuda 버전이다. 원하는 cuda 버전에 맞게 고르면 된다.
tag 복사 버튼을 클릭해서 복사해온다. 

$ docker pull 복사해온 이미지 태그

docker pull 명령어로 원하는 이미지를 다운받을 수 있다. 이제 이 이미지로 container를 실행시켜보자. 
image와 container는 무슨 차이일까. 내가 느끼기에는 class와 instance의 관계라고 느꼈는데 아니라면 지적 바란다. 

$ docker run -itd --name 원하는컨테이너이름 --device /dev/snd:/dev/snd -v /home/hyuns/mydir:/root/mydir -e TZ=Asia/Seoul --ipc=host --gpus all --privileged --restart=always 이미지태그

위의 명령어를 입력하면 실제 컴퓨터의 /home/hyuns/mydir 디렉토리가 container의 /root/mydir에 매핑되며 container가 생성된다. 

만일 docker: Error response from daemon: could not select device driver with capabilities: [[ gpu ]] 이런 에러가 난다면nvidia-smi 가 잘 나온다는 가정 하에 다음 코드를 차례대로 실행하니 고쳐졌다.

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker

 

3.5 vscode 설치해서 docker 쓰기

여기에서 본인의 운영체제에 맞는 vscode 설치 파일을 다운받자. Ubuntu의 경우에는 .deb 파일을 다운받았다. 

다운받은 파일의 경로(/로 시작하는)를 복사해서 다음과 같이 실행하거나

$ sudo apt install 경로

Download 폴더에 들어가 다음과 같이 실행해준다.

$ sudo apt install ./파일명

터미널에서 code 라고 입력하면 vscode가 실행된다.

이제 도커를 사용하기 위한 extension을 설치하자. vscode의 extension 탭에 들어가 Docker 라고 된 extension과 Remote Development 라는 extension을 설치해주자. 그러면 vscode의 사이드바에 도커 아이콘이 생긴다.

이를 클릭하면 사이드에 실행중인 컨테이너와 현재 가지고 있는 이미지를 볼 수가 있다.

원하는 컨테이너에 마우스 우클릭을 해서 Attatch visual studio code를 클릭하면 새 vscode 창이 뜨며 container 안에 들어가서 코딩을 할 수 있다. 

4. container 내부에서 miniconda 설치 & 가상환경 생성

container를 처음 실행하면 안되는 명령어들이 많다. 다음의 명령어(#는 빼고 입력. #이 붙은 부분들은 container 내부 터미널에서 입력)로 update를 한번 해주고 가자.

# apt update

여기에서 다음 사진에 표시된 곳에 커서를 올려놓고 링크 주소를 복사한다. 그냥 클릭하면 로컬에 다운로드 되어버리니 꼭 주소 복사를 하자.

# apt install wget
# wget 복사한주소

위 명령어를 입력하면 .sh 확장자가 붙은 파일이 container에 다운로드 된다.

# sh 다운받은파일.sh

위 명령어를 입력하면 miniconda가 설치되기 시작한다.
miniconda의 설치는 매우 조심스럽게 해야한다. 엔터를 계속 누르며 약관을 넘겨야 하는데 약관이 끝나고 Yes | no 를 입력하는 순간에 실수로 엔터를 누르면 설치를 처음부터 다시 해야하기 때문이다.... 거짓말 안하고 10번정도 실패끝에 miniconda 설치에 성공한 사람으로서 줄 수 있는 작은 꿀팁은 약관을 쭉 내리다가 cudnn 어쩌고 라는 제목이 나오면 끝부분에 다다른 것이니 이때부터 한줄 한줄 엔터를 신중하게 쳐나가길 바란다. 

다 설치했다면 열려있는 터미널을 삭제하고 새로 켜 보자. 셸의 맨 앞에 (base) 라는 표시가 뜨면 성공이다. 그럼 이제 default로 실행되는 base 가상환경을 끄고 나만의 새 가상환경을 만들 차례다. 다음의 명령어를 순서대로 입력하면 된다. 

# conda deactivate
# conda config --set auto_activate_base false
# conda create -n 가상환경이름
# conda activate 가상환경이름

5. pytorch 설치

여기 또는 여기에서 본인의 환경과 cuda 버전에 맞는 pytorch를 container 내부에서 설치해준다.
이때 반드시 본인이 새로 만든 가상환경이 activate 되어있는 상황에서 할 것. shell 왼쪽에 (가상환경이름) 이 떠있으면 된다.

앞으로 파이썬 라이브러리 설치를 할 때에는 conda install (라이브러리) 를 먼저 시도해보고 없다고 하면 pip install (라이브러리) 로 설치해보는 것을 추천한다.

설치 후 터미널에서 다음과 같이 python을 실행하고 cuda 사용 가능 상태인지 확인하자.

# python
>>> import torch
>>> torch.cuda.is_available()

True 가 출력되면 매우 다행이다. False라면.... 본인 cuda 버전을 다시 확인하고 그에 맞는 pytorch를 설치했는지 확인하자. container 태그에 쓰여있는 버전을 확인하거나 docker container를 쓰지 않는 사람이라면 nvcc -V 명령어로 cuda 버전을 확인해보자. 

5.1. pytorch가 무사히 돌아가는 container image를 commit 해두기 (미리 백업)

이 포스트를 참고해서 실행중인 container를 멈춘 후 image로 commit 해두자.

6. ssh 원격 접속

원본 서버에 ssh로 원격 접근해서 어디서든 쓸 수 있도록 셋팅하고 싶다면 다음 명령어로 openssh-server라는 것이 설치되어있는지 확인해보자

$ rpm -qa | grep openssh-server

없다면 openssh-server를 설치하고 22번 포트를 열어주자. 

$ sudo apt install openssh-server
$ sudo ufw allow 22/tcp

서버의 ip 주소를 확인한 다음 외부 컴퓨터 터미널에서 다음과 같은 명령어로 서버에 접근할 수 있다. 

> ssh 서버사용자이름@서버아이피주소 -p 서버포트번호

혹은 외부 컴퓨터에서 vscode를 켜고 다음과 같은 config 파일을 적절한 위치에 저장해두고 어찌어찌 잘 하면 된다. 이건 따로 찾아보시라.

Host 서버사용자이름@서버아이피주소:포트번호
    HostName 서버아이피주소
    User 서버사용자이름
    Port 포트번호

 

'연구실' 카테고리의 다른 글

[tmux] 아주 간단한 사용법  (1) 2024.01.15
[Docker] container volume 잘못 연결 & 추가 연결  (0) 2023.11.29

댓글