본문 바로가기

Trouble Shooting

[주피터노트북/jupyter notebook] 커널 죽는 문제 the kernel appears to have died. it will restart automatically

728x90

 

모델을 jupyter lab에서 돌리는데 어느 순간부터 위 그림같이 커널이 죽는 문제가 발생했다

 

커널이 죽는 이유는 주어진 메모리 할당량을 초과했기 때문이다. 

 

보통의 경우에는 방법 1(config파일 내 비트수 할당을 늘리는 방법)로 문제가 해결되지만,
해결되지 않는 경우에는 해결방법 2(메모리를 잡아먹는 코드를 찾아 수정하는 방법)을 해보는 것을 추천한다. 
반응형

해결방법 1.  config 파일 내 비트수 할당 코드 추가

1) jupyter_notebook_config.py에서 다음 코드를 복붙해준다.

  • jupyter_notebook_config.py 파일은 ./jupyter 폴더 내에 있다
  • 기존에 디폴트로 설정된 버퍼 값보다 많은 비트수를 할당하면 문제가 해결된다
c.NotebookApp.max_buffer_size = 10000000000000000000000

 

2) config 파일이 제대로 적용될 수 있도록 jupyter notebook 혹은 jupyter lab을 다시 실행한다

jupyter notebook

or

jupyter lab

 

이제, 커널이 죽지 않고 돌아가는지 다시 한번 확인해보자

혹시나, 똑같은 문제가 발생한다면 해결방법 2로 넘어가보자

 

해결방법 2. 코드 내에 메모리를 불필요하게 잡아먹는 코드를 수정하자

비트수를 할당했음(해결방법 1) 커널이 똑같이 죽는 문제가 발생한다면, 코드 내 메모리를 잡아먹는 부분을 수정하는 방법밖에 없다. 

문제를 해결하기 위해서는 우선 어떤 코드에서 메모리가 과도하게 사용되는지를 알아봐야한다. 

 

메모리 할당량을 초과하게 하는 원인 코드가 무엇인지 알아보는 2가지 방법이 있다. 

jupyter를 사용한다면 1번 방법으로 다 될 것으로 예상되지만,

필자는 2번 방법을 먼저 해보았기 때문에,,,(적어놓은게 아까워서) 남겨두겠다

 

1) 커널이 끊긴 후에 코드가 돌아간 숫자를 확인해보기

jupyter를 사용하다보면 아래 사진처럼 대괄호 [ ] 내에 실행된 순서가 표시되는 것이 익숙할 것이다. 

커널이 끊긴 이후에, 어느 코드가 실행되다가 멈춰졌는지 실행되지 않은, 즉 대괄호가 비어있는 ( [ ] ) 첫번째 코드가 메모리를 많이 잡아 먹는 코드이다. 

따라서, 해당 블록에 작성된 코드 중 메모리 사용량을 줄일 수 있는 방법을 찾아 수정해보자. 

 

2) 코드를 돌려가며, 직접 메모리 사용량을 확인하기

메모리 사용량을 확인하는 터미널에서 아래의 명령어를 통해 어느 코드에서 메모리 사용량이 급격히 늘어나는지 확인해볼 수 있다. 

free -mh

 

필자의 경우에는, 코드를 돌려보며, 아래 명령어를 반복해 사용했고, 실시간으로 메모리 사용량을 알아보니

다음과 같이, 메모리 사용량이 어느 순간, total 메모리를 넘어가더니, 커널이 끊겼다. 

 

 

* Pandas의 DataFrame을 자주 사용한다면

  • 필자의 사례에서는 끊긴 시점의 코드를 살펴보니, pandas의 read_csv에서 데이터를 불러올 때, 문제가 발생했다. 
  • 사용하지도 않을 전체 데이터를 불러온 것이 메모리를 잡아먹는 원인으로 예상되었다.  
  • 따라서, 아래처럼 usecols 를 사용해 사용할 column만 불러올수 있도록 설정하니
# use_col은 str형식의 column 이름이 담긴 list
data = pd.read_csv(f"{file_name}.csv", usecols = use_col)

 

메모리 사용량이 초과하지 않고 커널도 죽지 않고 모델이 잘 돌아가기만 했다,,,! 성공,,,!

 

 

 

반응형