본문 바로가기
컴퓨터 사이언스/딥러닝

[딥러닝 뉴비의 좌충우돌 일기] Jupyter notebook 딥하게 사용하기(feat. 아나콘다 가상환경 주피터에서 돌리기)

by 제크와 죠세핀 2021. 1. 28.
반응형

최근 연구실 선배의 연구를 도와드리게 되었다. nlp로 따지면, 선배가 만드신 새로운 단어를 이용해서 language modeling을 해서 generation을 하는 부분을 내가 맡게 되었다. 문제는.. 선배님이 모든 코딩을 jupyter notebook에서 돌리고 계셨기에 내가 사용하는 모든 코드를 jupyter notebook에 올려야 하는 상황이었다. 난감하긴 하지만, 따로따로 코드 돌려서 정신없이 하는 것 보다는 어쨋든 하나에서 다 돌리는 게 낫겠다는 생각이 들어서 과감하게(?) 잘 쓰지도 않았던 jupyter notebook를 좀 더 딥하게 사용해볼 기회를 얻었다. 오늘의 프로그레스는 다음과 같다.

 

Progress

- Run jupyter notebook with Anaconda virtual environment(succeed)

- Run python file in jupyter notebook (failed)

- GPU Flush issue (not completely succeed)

 

갑자기 영어 써보고 싶어서 그냥 써봤다. 일단 이게 중요한 건 아니고, 각 단계별로 있었던 일을 써보려고 한다.

 

Run jupyter notebook with Anaconda virtual environment(succeed)

선배가 쓰시는 환경이 pytorch 1.6.0., python 3.8.2였고, 내가 쓰는 코드는 굉장히 dependency가 낮게 설정되어 있어서 pytorch 1.0.2, python 3.7을 사용했다. 파이토치 버전이 안맞아서 가상환경의 세팅이 필수였다. 그냥 파이썬 파일 실행하는 건 아나콘다 가상환경을 그냥 깔면 되니까 금방 하는데, 주피터 노트북에서 아나콘다 가상환경을 인식하려면 별도의 절차가 필요했다. 그래서 처음엔 아주 나이브하게 아나콘다 가상환경을 주피터에서 사용하는 법을 쳐보니, 대부분의 한국어 블로그들은 커널 등록하는  코드를 알려줬다. 그래서 그냥 아나콘다 가상환경을 만들고 커널 등록하고 커널을 바꿔줬는데 바로 문제가 발생했다.

방금 새로 만든 가상환경에 왜 torch가 깔려 있어..?

새로 만든 가상환경에 이미 torch가 깔려있다는 것이었다. 뭔가 이상했다. 그래서 이때부터 구글링을 시작했는데 스택 오버플로우를 정독하며 알아낸 결과는 커널에서 파이썬 인터프리터를 제대로 잡고 있지 못하다는 내용이었다. 셀 내에서 다음을 입력해보면 어떤 파이썬 실행파일이 실행되고 있는 지 알 수 있다. 이게 가상환경에 설치된 파이썬이 아니면 제대로 가상환경을 인식하지 못하는 것이고, 새 가상환경에서 설치한 적 없는 패키지가 import 되는 현상이 발생한다.

# 다음 코드를 conda activate 한 상태에서 python 실행해서 입력해보고, jupyter notebook 안에서도 해보자.
# 두 개가 다르다면 ipython에서 바뀐 커널을 제대로 인식하지 못한다는 의미이다.
import sys
sys.executable

참고) 나처럼 jupyter notebook 접근 권한만 받았다면 폴더에서 new를 눌러서 terminal을 누르면 jupyter notebook 내에서도 New > Terminal 을 통해 터미널 사용이 가능하다. 

 

어쨋든, 이걸 바로 잡는 방법 중 하나는 jupyter kernelspec list를 입력하여 등록된 kernel의 디렉토리로 이동한 뒤 kernel.json 파일에 적힌 파이썬 인터프리터 경로를 바꿔주는 것이다. 잘못 적힌 파이썬 인터프리터 경로를 수정해주면서 해결이 될 수 있다고 한다. 근데 난 그렇게 해도 안되었다.

jupyter kernelspec list
# 가령 transformer-xl의 커널 주소가 /home/usr/.local/share/jupyter/kernels/transformer-xl 라면
cd /home/usr/.local/share/jupyter/kernels/transformer-xl
vim kernel.json


## kernel.json 파일 내부
{
 "argv": [
  "/home/usr/anaconda3/envs/transformer-xl/bin/python", # 이 부분이 이렇게 되어 있으면 됨.
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "transformer-xl",
 "language": "python"
}
~
~

그래서, 그냥 이번에는 영어 구글링을 해서 다음 포스팅이(따봉도 1000개 넘게 받음) 지시하는 대로 그대로 따라했다.

medium.com/@nrk25693/how-to-add-your-conda-environment-to-your-jupyter-notebook-in-just-4-steps-abeab8b8d084

 

How to add your Conda environment to your jupyter notebook in just 4 steps

In this article I am going to detail the steps, to add the Conda environment to your Jupyter notebook.

medium.com

알고 보니, 가상환경을 새로 설치한 상태에서 conda install -c anaconda ipykernel을 설치하고, 등록하는 것이었다.

기존에 다른 블로그 글들을 대충 읽었을 때 가상환경 설치하기 전에 ipykernel을 설치해야하는 줄 알고 반대로 깔아서 생긴 사단이었다. 해라는 대로 하니 어쨋든 .. 허무하게 해결이 되었다. Complete!

최종적으로 내가 어떻게 했는지 대충 보여주면 다음과 같다.

 

### 가상환경 세팅
- conda create -n transformer-xl python=3.7 -y
- pip install torch==1.0.1.post2 torchvision==0.2.2.post3

 

### 커널 설치와 등록
- conda install -c anaconda ipykernel
- python -m ipykernel install --user --name transformer-xl --display-name transformer-xl 

 

### jupyter notebook의 커널을 transformer-xl로 바꾸고 코드 실행하기
- Kernel > Change kernel > transformer-xl

 

가상환경의 파이토치 버전을 잘 인식한다.

 

Run python file in jupyter notebook (failed)

그렇게 안심하며 내가 쓰던 코드를 !python train.py 하려던 나.. 자꾸 학습 도중 에러가 발생해서 다시 쎄한 마음에 파이썬 버전을 확인해보는데.. python 파일(.py) 자체를 실행할 때와 ipython에서 실행할 때 파이썬 버전이 다른 것을 확인할 수 있었다. 

왜 때문에 다른가..

결국 이건 구글링해도 큰 답을 찾을 수 없어서 결국.. python 파일을 실행하지 않고 전체 코드를 main()안에 다 넣는 괴상한 짓을 통해 해결이라기엔 애매한 땜빵을 했다.

 

GPU Flush issue (not completely succeed)

학습을 이제야 할 수 있겠지 하며 안도하던 나는 CUDA OUT OF MEMORY 에러를 맞이한다. jupyter notebook은 블록 단위로 실행하다보니 모든 데이터가 flush 혹은 clear 버튼을 누르지 않으면 지워지지 않는다. 그런데 학습 코드 실행 도중에 에러를 맞이하면 GPU는 방출도 안되고, nvidia-smi에서 프로세스 id를 알 수도 없는 그런 상황을 맞이하게 된다. 커맨드 창에 ps -aux | grep python를 누르면 어떤 파이썬 프로세스가 실행되고 있는 지 알 수 있긴 하지만, 뭐가 뭔지 잘 알 수는 없었다. 선배가 ipython에서 돌리는 게 있을 수도 있으니 아무거나 지울 수 없는 노릇이었다. 그래서 그냥 jupyter notebook 내부에서 다음 코드를 돌려서 플러쉬 했다. 완전히 다 비워진 건 아니지만 어쨋든 학습에 문제 없는 선까지는 지워졌다. 내 서버였다면 gpu가 안 비워지면 컴퓨터를 그냥 재부팅 했을 것이다. 

# When cuda out of memory... run this or do kernel restart..
import torch
torch.cuda.empty_cache()
%reset

 

이런 우여곡절 끝에 결국 학습 코드를 돌릴 수 있게 되었다. jupyter notebook은 잘 활용하면 남에게 튜토리얼을 설명하기에 굉장히 편리한 도구이지만 답한 학습에는 불편함이 많기 때문에 시각화 등 그래프를 만들기 위해 사용하시는 경우가 대부분인 것 같다. 나도 앞으로는 자주 사용할 계획은 전혀 없다. 뭔가 그냥 python 파일을 돌리는 것보다 더 복잡하면 복잡했지, 간단하다고는 여겨지지 않는다. 예전에도 수업 과제를 하는데 주피터에서 가상환경을 대충 세팅해두니 타 가상환경에서 사용하는 torch와 버전이 꼬여서 결국 도커를 새로 깔아서 가상환경을 팠던 기억이 난다. 그래도 내가 불편하다는 말만 해도 jupyter notebook만의 이득이 있으니 꾸준히 사랑받는 게 아닐까 라는 생각도 들고.. 무튼 이런 뻘짓 프로그레스가 누군가에게 도움이 되길 바라며.. 오늘의 글은 이것으로 마무리 하겠다.

반응형

댓글