과제연구를 위해 받은 ubuntu 서버를 Mac에서 접속하기 위해 설정한 세팅에 대해 정리해 놓은 내용이다.
랩 서버는 storage server (seoul) 하나, computational gpu server 여러개로 이루어져있었다.
gpu server에 직접 연결은 불가능하고, seoul 서버에 접속 후 gpu 서버에 internal IP로 접속할 수 있는 형식이다.

GPU 사용 현황은 http://141.xxx.xx.xx:xxxxx/ 에서 확인 가능했고, 마찬가가지로 허용된 IP에서만 접속이 가능하다.
모든 계정은 Seoul에서 관리되고, ypasswd를 통해 초기비밀번호에서 개인비밀번호로 변경하였다.
/data_seoul 이라는 폴더는 모든 서버에서 접속가능하므로, 큰 용량을 차지하는 파일/코드는 여기에 저장하고 GPU서버에서 실행시키는 것을 권장한다. (필자는 그냥 local storage(각 GPU 서버)를 사용했다. 이렇게 하면 안된다)
(base) wiwlee@ijihyeon-ui-MacBookAir ~ % ssh undergrad@141.xxx.xx.xx
(undergrad@141.xxx.xx.xx) Password:
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-202-generic x86_64)
(base) undergrad@seoul:~$ ssh 10.x.x.x
undergrad@10.x.x.x's password:
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-187-generic x86_64)
GPU 서버에 잘 접속했다면 nvidia-smi 을 통해서 사용할 수 있는 GPU를 확인할 수 있다.

추가 서버 커맨드

(3) Configuration 설정
Configuration 이란 IP, username을 일일히 입력하지 않고 접속할 수 있는 '서버 별칭 설정' 기능이다.
꼭 해야할 필요는 없지만, 두 가지 장점을 가지고 있다
설정 방법
local의 ~/.ssh의 config를 변경시켜줘야한다. ~/.ssh 디렉토리나 config 파일이 존재하지 않는다면 mkdir이나 vim을 통해서 만들어주자.
config에 seoul 정보를 입력함으로써 별칭 설정이 가능하고, GPU 서버 이름도 별칭을 설정한 뒤에 ProxyJump seoul을 통해서 local에서 seoul 건너뛰고 바로 atlanta (GPU 서버)에 접속할 수 있다.
Host seoul
HostName 141.xxx.xx.xx
User undergrad
Port 22
Host atlanta
HostName 10.x.x.x
User undergrad
ProxyJump seoul
Port 22
그럼 이제 local 터미널에서 다음 명령어를 입력하면 바로 gpu 서버에 direct하게 접속할 수 있게 된다. (ssh seoul을 통해서 storage server에만 연결할 수도 있다)
ssh atlanta
Config 변경을 통해 쉽게 서버에 접속할 수 있게 되었지만, 여전히 접속할 때마다 비밀번호를 입력해야한다는 번거로움이 있다. 보안 측면에서도 비밀번호만 안다면 누구나 접속할 수 있는 방식이기에 좋지 않은 방식이다. 따라서 SSH Key 생성도 진행할 수 있다.
SSH Key란 서버에 접속할 때마다 계속 비밀번호를 입력하는 대신 Key를 제출해서 로그인 없이 자동으로 서버에 접속할 수 있는 방식이다.
생성 및 연결 방법은 다음과 같다.
(1) Local 터미널에서 ssh-keygen 프로그램을 통해서 key pair를 생성할 수 있다
[axl@asterisk1 axl]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
(2) 해당 key pair를 저장할 위치를 설정한다. 엔터를 누르면 기본 경로에 저장된다. (홈의 .ssh)
Enter file in which to save the key (/home/axl/.ssh/id_rsa): <return>
(3) passphrase 를 입력한다. passphrase는 일종의 비밀번호로 비공개키를 입력한 값으로 암호화한다. (자동 로그인을 원하면 이 부분도 엔터를 통해 생략해야한다고 한다) 이후 비밀번호 확인을 위해 한번더 입력해주자.
Enter passphrase (empty for no passphrase): <Type the passphrase>
Enter same passphrase again: <Type the passphrase>
Your identification has been saved in /home/axl/.ssh/id_rsa.
Your public key has been saved in /home/axl/.ssh/id_rsa.pub.
The key fingerprint is:
0b:fa:3c:b8:73:71:bf:58:57:eb:2a:2b:8c:2f:4e:37 axl@myLocalHost
(4) 이후 .ssh 파일을 ls 진행해주었을 때, id_rsa, id_rsa.pub가 생성되어있다면 성공한 것이다. (이외에도 known_hosts, authorized_keys가 있을 수도 없을 수도 있다)
id_rsa : private key로, 타인에게 노출되면 안되는 키이다. local의 해당 위치에 존재해있으면 된다.
id_rsa.pub : public key로, 이를 복사해서 접속하려는 remote 머신의 authorized_keys에 입력되어있으면 된다.
authorized_keys : remote 머신의 .ssh 디렉토리에 위치하면서 client와 서버를 연결해준다.
이 로컬 .ssh 디렉토리는 보안 상 매우 중요한 디렉토리여서 permission 설정을 해주어야한다고 한다. 권장 설정은 다음과 같으며, 필자는 굳이 진행하지 않았다.

이제 이 id_rsa.pub의 내용을 remote server의 .ssh의 authorized_keys에 붙여넣어줘야한다.
일단 storage server에 접속해야 다른 서버에 접속할 수 있으므로 seoul 서버부터 연결시켜줘야한다.
.ssh랑 authorized_keys 파일이 존재하지 않는다면, mkdir, vim을 통해서 생성해주자. 있으면 수정하면 된다.
Ssh key 불여놓는 곳 (서버 컴): ~/.ssh/authorized_keys

mkdir .ssh
vim .ssh/authorized_keys
SSH Server의 authorized_keys 의 내용이 SSH Client의 id_rsa.pub 파일의 내용을 포함해야한다. (복붙했으니까 같을 것이다. 이미 존재하고 있는 public key가 있다면 지우지말고 추가하면 된다.) 그래서 ssh 접속을 할 때 id_rsa 파일과 authorized_keys 파일의 내용을 비교 할 수 있다.
+이렇게 복붙하는 방법 말고, scp을 통해서 로컬 -> 서버로 파일을 전송할 수 있다고 한다. 형식은 [scp $HOME/.ssh/id_rsa 리모트 머신의 아이디@리모트 머신의 호스트 주소:저장할 파일] 이고, 예시는 다음과 같다. 이후 cat을 통해 파일의 내용을 화면에 출력하고, >>를 통해 cat이 출력한 내용을 authorized_keys 파일에 추가할 수 있다.
scp $HOME/.ssh/id_rsa.pub egoing@egoing.net:id_rsa.pub cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
만약 여러개의 로컬 머신에서 하나의 리모트 머신으로 접속해야한다면, 각 로컬 머신의 id_rsa .pub 파일의 내용을 authorized_keys 에 추가해주면 된다. (멀티 접속하는 법을 몰라서 아는 언니한테 내 개인키 줘서 그냥 접속하라고 했었는데, 그냥 추가하면 되는구나..)
(5) ssh key 이용해서 seoul (storage server) 접속
ssh seoul 입력시 비밀번호를 입력해야했지만, 그냥 바로 접속되는 것을 확인할 수 있다.
ssh seoul -> 접속!
만약 id_rsa 파일은 ~/,ssh/id_rsa가 아니라 다른 디렉토리에 만들었으면 ssh -i ~/auth (server)를 통해서 접속할 수 있다고 한다.
(6) computationa GPU 서버 연결






여러 유저가 사용하는 환경, 혹은 여러 프로젝트가 공존하는 환경 등에서 원활한 관리를 위해 가상 환경을 생성하여 격리된 환경에서 코드를 작성하는 것이 좋다. 세팅 환경 버전이나 패키지 및 라이브러리가 각기 다르기 때문에 꼬일 수도 있기 때문이다.
우선 다음을 통해 miniconda를 다운로드 받는다.
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
해당 미니콘다는 miniconda download를 검색해서 나온 https://docs.anaconda.com/free/miniconda/ 사이트에서 Linux(ubuntu) latest version의 .sh파일을 링크 주소 복사를 통해 가져온 repo이다.
wget은 web get이란 뜻으로, 웹 상의 파일을 다운로드 하는 명령어다.

이후 sh를 통해 아나콘다를 실행시킨다.
sh Miniconda3-latest-Linux-x86_64.sh
서버가 켜질때마다 conda 환경을 자동으로 유지하고 싶으면 다음을 진행할 수 있다.
source .bashrc
잘 적용이 되었으면 (conda)라는 것이 입력 창 앞에 붙여질 것이다.
python 버전을 확인하자. 이 서버는 3.8.18을 가지고 있는 듯 하다.
python --version

Cuda 정보도 확인하자. 11.6을 가지고 있는 듯하다.
/usr/local/cuda/bin/nvcc --version
(혹은 nvcc --version)

이제 tensorflow를 다운받기에 앞서, 텐서플로우-파이썬-쿠다가 모두 호환되는 버전을 찾아야한다.

이제 가상환경을 생성하고, 활성화시키자. => (base) 앞에 가상환경 (tf-2.12.0)이 뜰 것이다
여기선 파이썬 3.8를 이용하는 tf-2.12.0이라는 이름의 가상환경을 생성했다.
conda create -n tf-2.12.0 python=3.8
conda activate tf-2.12.0
(+) 가상환경 제거는 conda env remove -n tf-2.12.0
(+) 가상환경 비활성화는 가상환경 상태에서 conda deactivate
아나콘다 prompt로 Tensorflow를 설치하자
단, tensorflow의 경우, cpu를 위한 tensorflow, gpu를 위한 tenworflow가 다른 듯 하다. (뒤의 gpu 조건을 달지 않으니 tensorflow가 GPU를 인식못하더라)
또, 버전을 명시해서 패키지를 깔자.
pip install tensorflow-gpu==2.12.0
pip install tensorflow==2.12.0
이제 tensorflow가 잘 import 되는지, GPU도 잘 인식하는지 살펴보자
python
import tensorflow as tf
tf.config.experimental.list_physical_devices('GPU')

이후에 .py파일을 만들어서 python test.py를 실행시킬 수도 있고, VScode에서 실행시킬수도 있다.
VScode에서 실행시킬 때, 가상환경에서 받아놓은 python 환경이 맞는지 확인하자.

또한 Vscode에서 ipynb 파일도 실행시키고 싶으면, ipynb 파일 만들어서 실행시키려고 하면 에러가 뜨면서 아마 서버에서 주피터 확장팩을 설치하라고 나올 것이다. 확인을 누르면

설치 후 주피터가 잘 돌아가는 것을 확인할 수 있다

이외에 추가로 설치하고 싶은 패키지가 있다면,
GPU의 활용률, 메모리 사용률을 보고 싶다면, 일전에 소개한 서버 자체적 사이트(141.xxx.xx.xx:50009)나, nvidia-smi를 통해서 확인할 수 있다

(+) 작성하면서 알게 된 사실인데, history 명령어를 통해서 그동안 작성한 명령어를 모두 볼 수 있는 듯 하다. 모르겠으면 찾아보면서 하자.