가이드 · 시작하기

원격 GPU 서버에서 JupyterLab 쓰기

서버에서 jupyter lab --no-browser --port 8888로 실행하고, 내 컴퓨터에서 ssh -N -L 8888:localhost:8888로 터널을 연 뒤 http://localhost:8888에 접속하면 돼요. 포트를 외부에 열지 않아서 안전해요.

업데이트
읽는 시간
약 7분

SSH 터널로 여는 게 기본이에요

JupyterLab에 들어올 수 있으면 서버에서 코드를 실행하고 터미널까지 열 수 있어요. 그래서 서버의 localhost에만 열어 두고, 키로 인증된 SSH 연결을 통해 내 컴퓨터로 가져와요.

SSH 키 등록과 ~/.ssh/config 설정이 아직이라면 SSH 키로 GPU 서버에 접속하는 법부터 보세요.

서버에서 JupyterLab 실행하기

bash
python -m pip install jupyterlab   # 설치돼 있지 않을 때
tmux new -s jupyter
jupyter lab --no-browser --port 8888

tmux 안에서 실행해 두면 SSH 접속이 끊겨도 JupyterLab과 커널이 살아 있어요. Ctrl+b를 누른 뒤 d로 빠져나오고, tmux attach -t jupyter로 돌아와 로그를 봐요.

로그에 나오는 http://localhost:8888/lab?token=...의 토큰이 비밀번호 역할을 해요. 8888 포트를 다른 프로그램이 쓰고 있으면 8889처럼 다음 포트로 열리니, 로그의 포트 번호를 확인하세요.

내 컴퓨터에서 SSH 터널 열기

bash
ssh -N -L 8888:localhost:8888 <user>@<host> -p <port>

내 컴퓨터의 8888 포트를 서버 안의 localhost:8888로 연결해요. 아무것도 출력하지 않고 멈춘 것처럼 보이면 정상이에요. 이 터미널을 켜 둔 채로 브라우저에서 http://localhost:8888을 여세요.

토큰을 물으면 로그의 token= 뒤 값을 붙여 넣으세요. 로그를 놓쳤다면 서버에서 아래 명령으로 다시 볼 수 있어요.

bash
jupyter server list

내 컴퓨터에서도 8888 포트를 쓰고 있다면 -L 8890:localhost:8888처럼 앞의 로컬 포트만 바꾸고 http://localhost:8890으로 접속하세요. config에 별칭을 만들어 뒀다면 ssh -N -L 8888:localhost:8888 gpu-server로 줄여 써요.

0.0.0.0으로 공개하면 안 되는 이유

검색하면 많이 나오는 대로 --ip 0.0.0.0으로 열면, 그 포트에 닿는 누구나 로그인 화면까지 올 수 있어요. 열린 Jupyter 포트를 찾아다니는 자동 스캐너가 많고, GPU 서버는 몰래 채굴 프로그램을 돌리려는 공격의 표적이 되기도 해요.

꼭 공개 포트로 열어야 한다면 토큰이나 비밀번호를 유지하고, HTTPS를 적용하고, 방화벽으로 접속할 수 있는 IP를 제한하세요. 비밀번호는 서버에서 jupyter server password로 정해요.

가상환경을 커널로 추가하기

프로젝트마다 가상환경을 만들어 커널로 등록하면, JupyterLab 하나에서 환경을 골라 쓸 수 있어요.

bash
python3 -m venv ~/venvs/myenv
source ~/venvs/myenv/bin/activate
python -m pip install ipykernel
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"

--display-name이 커널 선택 메뉴에 보이는 이름이에요. 등록한 뒤 브라우저를 새로 고침하면 목록에 나타나요. Ubuntu에서 가상환경 생성이 실패하면 python3-venv 패키지를 먼저 설치하세요.

bash
jupyter kernelspec list
jupyter kernelspec uninstall myenv
등록된 커널 목록 보기와 지우기예요.

노트북에서 패키지를 설치할 때는 !pip 대신 %pip install 패키지이름을 쓰세요. !pip은 다른 환경의 pip이 잡힐 수 있지만, %pip은 지금 커널의 파이썬에 설치해요.

노트북에서 GPU 확인하고 메모리 비우기

python
import sys
import torch

print(sys.executable)
print(torch.cuda.is_available())
if torch.cuda.is_available():
    print(torch.cuda.get_device_name(0))

sys.executable은 커널이 어느 환경의 파이썬인지 알려 줘요. is_available()이 False라면 그 환경에 CPU 전용 PyTorch가 설치된 경우가 많아요. 해결 방법은 PyTorch에서 GPU를 인식하지 못할 때에 있어요.

text
!nvidia-smi
셀 앞에 !를 붙이면 셸 명령을 실행해요.

커널은 자기가 잡은 GPU 메모리를 종료될 때까지 들고 있고, 노트북 탭을 닫아도 계속 돌아가요. 노트북 몇 개를 열어 둔 것뿐인데 CUDA out of memory가 난다면 대부분 이 경우예요.

왼쪽 사이드바의 실행 중인 터미널과 커널(Running Terminals and Kernels) 패널이나 Kernel > Shut Down Kernel 메뉴로 안 쓰는 커널을 종료하세요. 커널을 유지한 채 메모리만 줄이려면 변수를 지우고 캐시를 비워요.

python
import gc
import torch

del model  # 더 이상 쓰지 않는 모델이나 텐서
gc.collect()
torch.cuda.empty_cache()

CUDA 컨텍스트가 쓰는 메모리는 커널을 종료해야 돌아와요. 셀 출력으로 텐서를 표시했다면 출력 기록(Out, _)이 참조를 붙잡고 있어서 줄지 않기도 하니, 그럴 때는 커널을 재시작하세요. 다른 원인은 CUDA out of memory 오류 해결하기를 보세요.

VS Code에서 노트북 쓰기

VS Code를 쓰면 터널과 토큰이 필요 없어요. Remote-SSH로 접속해 원격 쪽에 Python과 Jupyter 확장을 설치하고 .ipynb 파일을 열면, 오른쪽 위 커널 선택에서 서버의 가상환경을 고를 수 있어요. ipykernel이 없으면 VS Code가 설치를 안내해요.

VS Code 창을 닫거나 연결이 끊기면 커널도 종료될 수 있어요. 몇 시간씩 걸리는 학습은 스크립트로 만들어 tmux 안에서 실행하세요.

Shelf에서 JupyterLab 쓰기

예시 환경 ‘PyTorch 2.4 Notebook (CUDA 12.4, JupyterLab, Python)’에는 JupyterLab이 들어 있어서 따로 설치하지 않아도 돼요.

노트북과 데이터는 영구 볼륨에 두세요. 기본 로컬 디스크는 서버를 삭제하면 함께 지워지지만, 볼륨은 다른 GPU 서버에 연결해 그대로 이어 쓸 수 있어요. Shelf는 백업 서비스가 아니니 중요한 결과는 다른 곳에도 보관하세요.

패키지를 맞춰 둔 환경은 저장 이미지로 남길 수 있어요. 실행 중인 커널의 메모리 상태는 저장되지 않아요. 서버는 중지해도 요금이 계속 나가니, 작업이 끝나면 삭제하세요.

자주 묻는 질문

jupyter notebook과 jupyter lab 중 무엇을 써야 하나요?

둘 다 같은 Jupyter 서버와 커널 위에서 동작해요. JupyterLab은 파일 탐색기, 터미널, 여러 노트북을 한 화면에서 다룰 수 있어서 원격 GPU 서버 작업에 더 편해요.

SSH 터널이 끊기면 실행 중인 셀도 멈추나요?

JupyterLab을 tmux 안에서 실행했다면 커널은 계속 돌아가고, 터널을 다시 열면 이어서 쓸 수 있어요. 다만 끊긴 동안 셀이 출력한 내용은 화면에 남지 않을 수 있으니 긴 작업은 로그를 파일로 남기세요.

커널을 추가했는데 목록에 보이지 않아요.

--user로 등록한 커널은 등록한 사용자 계정의 JupyterLab에서만 보여요. JupyterLab을 같은 계정으로 실행했는지, 그 계정에서 jupyter kernelspec list에 나오는지 확인하세요.

GPU 서버가 필요할 때

필요한 GPU와 개발 환경을 골라 시간 단위로 시작해요.