GPU 서버 세팅

LeeWlWL·2024년 4월 5일

GPU 서버 세팅

과제연구를 위해 받은 ubuntu 서버를 Mac에서 접속하기 위해 설정한 세팅에 대해 정리해 놓은 내용이다.

(1) 고정 IP 접근 권한 설정
  • 기숙사 IP가 유동 IP라 핀토스 서버 접속용으로 받아놓았던 VPN 고정 IP를 이용하기로 했다.
  • 해당 서버에 접속하기 전에 VPN 을 활성화시킨다. (https://vpn.postech.ac.kr/my.policy 이용)
(2) 서버 접속
  • 랩 서버는 storage server (seoul) 하나, computational gpu server 여러개로 이루어져있었다.

  • gpu server에 직접 연결은 불가능하고, seoul 서버에 접속 후 gpu 서버에 internal IP로 접속할 수 있는 형식이다.

    • 즉, seoul 서버에 접속한 상태에서 한번더 ssh를 통해 접속해주어야한다.
    • Seoul가 이외의 서버 리스트는 다음과 같고, 유저네임은 undergrad, 포트는 22로 동일했다.
    • image-20240415221837965
  • 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를 확인할 수 있다.

    • image-20240415235615133
  • 추가 서버 커맨드

    • 서버는 exit을 통해서 접속 종료할 수 있다
    • 해당 GPU 서버에서도 /ls data_seoul을 통해서 global data storage에 접속할 수 있다.
    • 리눅스 버전 확인 커맨드는 cat /etc/issue 이다.
      • image-20240416000749872

(3) Configuration 설정

  • Configuration 이란 IP, username을 일일히 입력하지 않고 접속할 수 있는 '서버 별칭 설정' 기능이다.

  • 꼭 해야할 필요는 없지만, 두 가지 장점을 가지고 있다

    • (1) ssh undergrad@141.xxx.xxx.xxx 를 계속 기억해서 입력해야하는 번거로움을 해결할 수 있다. 이를 이용하여 단순히 ssh seoul 을 통해 로그인할 수 있다.
    • (2) 이전에 우리는 direct 하게 접속할 수 없는 GPU 서버를 가지고 있다고 했다. 즉, local에서 ssh name@ip 해서 접속 후, ssh ip 해서 또 다른 서버에 접속해야한다. 여간 까다로운 것이 아니기 때문에 그냥 바로 GPU 서버에 접속시킬 수 있도록 하자.
  • 설정 방법

    • local의 ~/.ssh의 config를 변경시켜줘야한다. ~/.ssh 디렉토리나 config 파일이 존재하지 않는다면 mkdir이나 vim을 통해서 만들어주자.

      • Ssh config (local): ~/.ssh/config
    • 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
(4) SSH Key 생성
  • Config 변경을 통해 쉽게 서버에 접속할 수 있게 되었지만, 여전히 접속할 때마다 비밀번호를 입력해야한다는 번거로움이 있다. 보안 측면에서도 비밀번호만 안다면 누구나 접속할 수 있는 방식이기에 좋지 않은 방식이다. 따라서 SSH Key 생성도 진행할 수 있다.

  • SSH Key란 서버에 접속할 때마다 계속 비밀번호를 입력하는 대신 Key를 제출해서 로그인 없이 자동으로 서버에 접속할 수 있는 방식이다.

    • 이 부분은 https://opentutorials.org/module/432/3742 를 참고하여 작성하였다.
    • 공개키(public key)와 비공개 키(private key) 두개의 관계를 이용해, 비공개키를 local (ssh client)에 위치시키고 공개키를 remote server (ssh server)에 위치시켜야한다.
    • 이후 SSH 접속을 시도하면 로컬의 비공개키와 원격의 공개키를 비교하여 일치하는지를 확인하고 서버에 접속시켜준다.
    • 꼭 해야할 필요는 없지만, 보안적으로 안전하고, 해놓으면 비밀번호 계속 입력안해도 되어서 간편하다.
  • 생성 및 연결 방법은 다음과 같다.

    • (1) Local 터미널에서 ssh-keygen 프로그램을 통해서 key pair를 생성할 수 있다

      [axl@asterisk1 axl]$ ssh-keygen -t rsa
      Generating public/private rsa key pair.
    • (2) 해당 key pair를 저장할 위치를 설정한다. 엔터를 누르면 기본 경로에 저장된다. (홈의 .ssh)

      • Ssh key 위치 (local): ~/.ssh/id_rsa.pub
      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 설정을 해주어야한다고 한다. 권장 설정은 다음과 같으며, 필자는 굳이 진행하지 않았다.

        • image-20240415225056091
    • 이제 이 id_rsa.pub의 내용을 remote server의 .ssh의 authorized_keys에 붙여넣어줘야한다.

      • 일단 storage server에 접속해야 다른 서버에 접속할 수 있으므로 seoul 서버부터 연결시켜줘야한다.

      • .ssh랑 authorized_keys 파일이 존재하지 않는다면, mkdir, vim을 통해서 생성해주자. 있으면 수정하면 된다.

        • Ssh key 불여놓는 곳 (서버 컴): ~/.ssh/authorized_keys

        • image-20240415231810415

        • 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 서버 연결

      • GPU 서버에 접속해서도 마찬가지로 비밀번호를 치지 않으려면 ~/.ssh에 authorzied_keys에 local의 id_rsa.pub 내용을 추가해주어야한다.
        • image-20240415231925386
(5) VScode 연결
  • 이제 서버를 빠르게 접속할 수 있게 되었다. 하지만 코드를 터미널 상에서 작성하기엔 불편하니까 VScode의 ssh extension을 이용하여 코드를 수정할 수 있도록 하자.
    • image-20240415232445410
  • 원격탐색기 > SSH 에서 새 원격 추가를 누르면 SSH 원격 명령 입력칸이 뜰 텐데, 위의 config를 잘 진행했다면 ssh atlanta로도 잘 연결될 것이다 (ssh undergrad@141.xxx.xx.xx 로 접속해도 상관 없다)
    • image-20240415234902885
    • image-20240415235039157
  • 이후 파일 탐색기에서 폴터 열기 > 원하는 user/folder를 클릭하고 등록하면 파일을 VScode 폴더 상에서 볼 수 있고, 파일을 잘 불러 오는 것을 확인할 수 있다.
    • image-20240415235140824
    • image-20240415235259943
(6) 가상환경 설정
  • 여러 유저가 사용하는 환경, 혹은 여러 프로젝트가 공존하는 환경 등에서 원활한 관리를 위해 가상 환경을 생성하여 격리된 환경에서 코드를 작성하는 것이 좋다. 세팅 환경 버전이나 패키지 및 라이브러리가 각기 다르기 때문에 꼬일 수도 있기 때문이다.

  • 우선 다음을 통해 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이란 뜻으로, 웹 상의 파일을 다운로드 하는 명령어다.

    • image-20240416000418969

    • 이후 sh를 통해 아나콘다를 실행시킨다.

    •  sh Miniconda3-latest-Linux-x86_64.sh
    • 서버가 켜질때마다 conda 환경을 자동으로 유지하고 싶으면 다음을 진행할 수 있다.

    • source .bashrc
    • 잘 적용이 되었으면 (conda)라는 것이 입력 창 앞에 붙여질 것이다.

  • python 버전을 확인하자. 이 서버는 3.8.18을 가지고 있는 듯 하다.

    • python --version
    • image-20240416000930683

  • Cuda 정보도 확인하자. 11.6을 가지고 있는 듯하다.

    • /usr/local/cuda/bin/nvcc --version
      (혹은 nvcc --version)
    • image-20240416001216219

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

    • https://www.tensorflow.org/install/source?hl=ko#tested_build_configurations
    • image-20240416003044236
    • 좀 애매한 파이썬이랑 쿠다 버전을 갖고 있는 듯하다. 최신 버전도 아니다..
    • 그래도 쿠다 11.6과 파이썬 3.8.18을 좀 충족시키는 텐서플로우 2.12.0을 사용해보자고 결정할 수 있다.
    • (+) tensorflow가 특히 버전에 민감한 것 같다. Cuda와 tensorflow의 호환성을 잘 살펴서 다운로드해야한다. pytorch의 경우, 단순히 pip install torch를 통해서 한번에 세팅된다고 하니 버전 문제로 이슈가 생길 일은 없을 듯하다
    • (+) no module named 'torch' 에러가 나타나면 conda install jupyter, 혹은 pip install torchvision 를 실시해주자.
  • 이제 가상환경을 생성하고, 활성화시키자. => (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를 인식못하더라)

      • 혹시 몰라서 -gpu 빼고 pip install tensorflow == 2.12.0 도 깔아줬다
    • 또, 버전을 명시해서 패키지를 깔자.

    • pip install tensorflow-gpu==2.12.0
      pip install tensorflow==2.12.0
      • (++) pip freeze를 통해 아나콘다를 통해 깔려있는 모든 것들을 확인 할수있다
  • 이제 tensorflow가 잘 import 되는지, GPU도 잘 인식하는지 살펴보자

    • python
      import tensorflow as tf
      tf.config.experimental.list_physical_devices('GPU')
      • image-20240416003923353
      • tensorflow가 GPU를 잘 인식하는지 확인할 수 있다.
  • 이후에 .py파일을 만들어서 python test.py를 실행시킬 수도 있고, VScode에서 실행시킬수도 있다.

    • VScode에서 실행시킬 때, 가상환경에서 받아놓은 python 환경이 맞는지 확인하자.

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

      • 그럼 밑의 extension에서, Local 말고 SSH:ATLANTA (서버)에서 필요한 주피터가 자동으로 설치될 것이다 (설치가 자동으로 안된다면 마켓플레이스에서 찾아서 ssh에 설치해주자)
      • image-20240416004649479
    • 설치 후 주피터가 잘 돌아가는 것을 확인할 수 있다

      • image-20240416005236452
  • 이외에 추가로 설치하고 싶은 패키지가 있다면,

    • 가상환경안에서 pip install ~을 통해서 다운받을 수 있다
    • ex) Transformer 패키지 다운로드
      • pip install transformer
    • ex) Matplotlib 다운로드
      • pip install matplotlib
    • ex) KoGPT 다운로드
  • GPU의 활용률, 메모리 사용률을 보고 싶다면, 일전에 소개한 서버 자체적 사이트(141.xxx.xx.xx:50009)나, nvidia-smi를 통해서 확인할 수 있다

    • image-20240416005447803

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

profile
진화중이에요

0개의 댓글