상세 컨텐츠

본문 제목

[Conda-Jupyter] Conda 가상환경과 Jupyter Kernel 연동/생성/삭제

개발 이야기/Python

by 리치윈드 - windFlex 2022. 12. 6. 20:17

본문

반응형

2022.06.17 - [분류 전체보기] - Python 가상 환경 관리 4종 - venv / virtualenv / ipykernel

2022.12.06 - [개발 이야기/Python] - [Jupyter Kernel 추가] conda 가상환경을 jupyter Kernel로 추가하기

2022.09.19 - [개발 이야기/Python] - [주피터노트북 커널] jupyter lab/notebook kernel

2022.06.17 - [분류 전체보기] - Python 가상 환경 관리 4종 - venv / virtualenv / ipykernel

2020.06.04 - [개발 이야기/Python] - [파이썬] Anaconda x Jupyter notebook 설치 및 설정 방법 - 가상환경으로 파이썬 개발환경 구성

2020.03.10 - [IT 이야기] - Python x Jupyter Notebook 설치 및 환경 구성

2022.09.19 - [IT 이야기/IT 상식] - [Python 가상환경] conda 설치 및 가상환경 (feat. 내부 로직 & cheat sheet)

 

python / Conda 가상환경과 Jupyter Kernel의 관계는 어떻게 될까? 왜 Kernel을 새롭게 만들어도 설치된 패키지가 다르게 인식될까?


[요약]

  • conda 명령어
    • 가상환경 생성 : `conda create -n <가상환경 이름> python=<python버전>`. ex) conda create -n env_test python=3.9
    • 가상환경 삭제 : `conda env remove --name <가상환경 이름>` ex) conda remove -n env_test
    • 가상환경 활성화/비활성화 : `conda activate <가상환경 이름>` / `conda deactivate`
    • 가상환경 목록 : `conda env list` or `conda info --envs`
-n 옵션은 `--name` 옵션과 동일합니다.

 

  • jupyter kernel 명령어
    • 현상 / 원인파악 : 기본환경에서 jupyter notebook/ jupyterlab kernel과 conda 가상환경은 연동되지 않음.
    • Jupyter 커널 목록 확인 : `jupyter kernelspec list`
    • conda-Jupyter 연동 패키지 설치 :  `conda install nb_conda_kernels`
    • 연동 : 1) 가상환경 활성화 , 2) Jupyter 커널 생성, 3) 결과 확인
      • 1) 가상환경 활성화 : conda activate <가상환경 이름>
      • 2) 커널 생성
        • `pip install ipykernel`
        • `ipython kernel install --user --name=<가상환경 이름>`
          혹은 `python -m ipykernel install --user --name=<가상환경 이름>`
      • 3) 결과 확인
        • pip list 또는 import <library> 확인
        • kernel.json 확인 ( kernel.json은 해당 kernel의 경로에 위치함. 해당 kernel경로는 `jupyter kernelspec list` 명령으로 확인)
        • 결과적으로 Jupyter kernel에 대한 설정은, `nb_conda_kernels`은 kernel.json 내용을 conda env list 내용에 맞게 수정하는 것임
    • jupyter 커널 삭제 : `jupyter kernelspec uninstall env_test` 또는 `jupyter kernelspec remove env_test` 
ipykernel이 없는 경우, `pip install ipykernel` 실행
jupyter의 kernel생성 할 때 기본 설정(nb_conda_kernel이 없는 경우)은  "os 기본 python 환경에서 실행됨"

 

 

Conda 가상환경 vs. Jupyter Kernel

conda를 이용해서 가상환경 생성 (아래 명령줄)을 생성해 보자. 그리고, 필요한 라이브러리를 설치해 보자. 아래는 예제로 torch를 설치한다.

$ conda create -n env_test python=3.9

$ conda activate env_test
$ pip install torch
$ conda deactivate

 

Jupyter Kernel 확인을 위해서 아래와 같이 `jupyter kernelspec list` 를 실행해 보면, 당연하게도 conda에서 추가한 가상환경은 kernel에 등록되어 있지 않다. conda package manager와 Jupyter는 아무런 연관이 없다. (연동같은거 안 해준다.)  Google 검색으로 "Jupyter Kernel 추가하기"라고 찾아보자. 아래와 같이 ipykernel을 통해서 커널을 추가하는 내용 결과를 얻을 수 있다. 그러나, 이 명령어는 conda 및 가상환경과는 무관하게 말 그대로 Jupyter Kernel을 생성해 준다. 기본값을 사용하여 환경을 살펴보면, 생성된 Kernel로 실행되는 Python 환경은 OS 기본 Python이거나 (base) 가상환경 이다. 

 

빈번하게 발생하는 실수 중 하나는 conda를 통해서 생성한 가상환경과, Jupyter kernel의 이름이 동일하다고 하여 동일한 가상환경으로 착각하는 것이다. 기본적으로, 이 둘은 단지 표기되는 문자열만 동일할 뿐이다. 이번 포스팅에서는 conda 가상환경 설정과, Jupyter kernel을 살펴보고,  Conda 가상환경과 Jupyter의 커널을 동기화하는 것이다.

 

Jupyter의 Kernel로 코드를 작성....
....
....이 아니라 
에러가 난다.

Jupyter Web UI에서 새로 생성한 Kernel을 선택할 수 있다(좌), 그러나 앞서 설치한 라이브러리는 import 되지 않은다.(우)

$ conda activate env_test
$ pip list

conda 가산환경 (env_test)를 활성화 하고, 설치 패키지를 확인하면, torch는 정상 설치되어 있다. (좌), Jupyter Notebook에서 `pip list`를 실행하면 무엇인가 설치된 패키지가 다르다. (우)

 

무엇인가 잘못된것 같다.
무슨일이 일어난 것일까?

 

우선 conda 가상환경 목록을 먼저 살펴보자. `conda env list` 명령을 통하여 생성되어 있는 가상환경 목록을 나열할 수 있다. 다음으로 Jupyter Kernel 목록을 나열하기 위해 `jupyter kernelspec list`명령어를 사용하자.  각 명령어를 사용하면, 가상환경과 가상환경이 설치된 경로를, Jupyter Kernel 과 Kernel의 설정파일 경로를 확인할 수 있다.  명령을 실행 후 알 수 있듯이, conda 가상환경은 Anaconda 패키지 하위에, jupyter Kernel은 Users home 하위 Jupyter/kernels 하위에 위치해 있다. 두 경로간의 연계성은 전혀 존재하지 않는다. 

다음은 conda env와 jupyter kernelspec 을 통해서 각각 가상환경이 설치된 위치를 확인한다.

$ conda env list
# conda environments:
#
# base                  *  /Users/richwind/opt/anaconda3
# env_test                 /Users/richwind/opt/anaconda3/envs/env_test

$ jupyter kernelspec list
#  env_test    /Users/richwind/Library/Jupyter/kernels/env_test
#  python3     /Users/richwind/Library/Jupyter/kernels/python3

conda 가상환경의 위치와 Jupyter Kernel의 위치가 서로 상이함을 알 수 있다. 즉, conda 가상환경과 이름이 동일한 또다른 Jupyter 가상환경이 생성되었을 뿐을 의미한다. 따라서, 이전 섹션에서 살펴본 봐와 같이 conda에서 설치한 패키지가 Jupyter Notebook의 Kernel에서는 동작하지 않는 것이다.  ( 가상환경 이름 : env_test, Kernel name : env_test를 가정)

  • conda 가상환경 : /Users/richwind/opt/anaconda3/envs/env_test
  • jupyter kernel : /Users/richwind/Library/Jupyter/kernels/env_test

 

 

 


[ Jupyter kernel 목록 보기 ]

$ jupyter kernelspec list
# Available kernels:
#  python3    /Users/richwind/Library/Jupyter/kernels/python3

 

[ Jupyter kernel 추가하기 ]

$ pip install ipykernel
$ python -m ipykernel install --user --name=env_test --display-name=env_test

# Installed kernelspec env_test in /Users/richwind/Library/Jupyter/kernels/env_test

 

Jupyter 커널 추가후, 다시 커널 목록을 확인하자. env_test 라는 이름의 커널이 추가 되어 있는것을 확인 할 수 있다. 

$ jupyter kernelspec list

# Available kernels:
#  env_test    /Users/richwind/Library/Jupyter/kernels/env_test
#  python3     /Users/richwind/Library/Jupyter/kernels/python3
따라서, JupyterLab 혹은 Jupyter Notebook UI에서 이제 "env_test"라는 이름의 커널/가상환경을 선택할 수 있다.  

 

conda 가상환경과 Jupyter Kernel을 연동하고, 패키지 설치/관리는 conda 환경으로 하면 동시에 Jupyter에 반영되도록 하는 방법을 추가 설명한다. 

 

가상환경 연동 Jupyter Kernel 생성 (기존 존재 경우 Overwrite)

기존 conda 환경에서 Jupyter Notebook Kernel을 연결해 주는 패키지 (nb_conda_kernels)를 설치한다. 

conda install -c conda-forge nb_conda_kernels
구글검색에 의하면, `pip install nb_conda` 설치도 가능하다고 한다. 필자의 환경에서는 동작하지 않았다.

 

패키지(nb_conda_kernels)를 설치 후, 가상환경을 활성화(activate)하고, `ipython kernel install`을 통해서 Jupyter Kernel을 생성해 준다. 이 때 `--name=<가상환경 이름>`으로 선택해 주어 conda 가상환경과 Jupyter Kernel을 연결해 준다. 

$ conda activate env_test
$ ipython kernel install --user --name=env_test
#Installed kernelspec env_test in /Users/richwind/Library/Jupyter/kernels/env_test


# 위 경우가 안될 경우,
$ conda activate env_test
$ conda install ipykernel
$ python -m ipykernel install --user --name=env_test
#Installed kernelspec env_test in /Users/richwind/Library/Jupyter/kernels/env_test
jupyter kernel 삭제 : `jupyter kernelspec uninstall <커널이름>`. ex) jupyter kernelspec uninstall env_test

 

다음으로 Jupyter Notebook을 리프레시 or 재시작 해 주자. 다음 처럼 패키지가 설치된 가상환경으로 동작하는지 점검 해 볼 수 있다. 다음 예는 타겟 가상환경에만 `joblib`를 설치한 경우 Jupyter Notebook에서 joblib 설치 여부를 확인하는 경우이다. 

%pip list | grep joblib

좀 더 상세하게, 이러한 행위는 결과적으로 Jupyter 커널 설정파일 (kernel.json)의 argv값을 변경해 주는 것이다. kernel.json 파일은  Jupyter 설치 폴더 아래 `kernels/<kernel name>/kernel.json`에 위치한다. 다음은 kernel.json의 내용이다.

 

$ cat  ~/Library/Jupyter/kernels/env_test/kernel.json

{
 "argv": [
  "/Users/richwind/opt/anaconda3/envs/env_test/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "env_test",
 "language": "python",
 "metadata": {
  "debugger": true
 }
}

 

앞서 거론한 바와 같이, conda 가상환경 파일과, Jupyter Kernel의 경로는 다르게 지정되어 있으므로, jupyter kernel.json에서는 가상환경 아래 python 파일 위치를 지정함으로써 해당 가상환경으로 동작하도록 설정해주는 작업니다. 

  • 기본적으로, argv의 첫번째 매개변수가 base의 python이다. PATH가 제대로 걸려 있으면, 단순히 "python"이 기본값이다.  "display_name"등도 여기에 설정되어 있다. 만약, 이런 저런것이 번거롭다면, `kernel.json`을 수동으로 설정 해 주어도 된다. 
  • python 가상환경은 결국, 다른 python root directory에 패키지 설치를 다시 한 환경이므로, 가상환경용 python 실행 파일로 실행하면, 가상환경으로 동작할 수 있다. 

Linux 환경 등에서 jupyter kernel.json 기본설정은 아래와 같다. 

cat /usr/local/share/jupyter/kernels/python3/kernel.json 
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3 (ipykernel)",
 "language": "python",
 "metadata": {
  "debugger": true
 }

2022.06.17 - [분류 전체보기] - Python 가상 환경 관리 4종 - venv / virtualenv / ipykernel

2022.12.06 - [개발 이야기/Python] - [Jupyter Kernel 추가] conda 가상환경을 jupyter Kernel로 추가하기

2022.09.19 - [개발 이야기/Python] - [주피터노트북 커널] jupyter lab/notebook kernel

2022.06.17 - [분류 전체보기] - Python 가상 환경 관리 4종 - venv / virtualenv / ipykernel

2020.06.04 - [개발 이야기/Python] - [파이썬] Anaconda x Jupyter notebook 설치 및 설정 방법 - 가상환경으로 파이썬 개발환경 구성

2020.03.10 - [IT 이야기] - Python x Jupyter Notebook 설치 및 환경 구성

2022.09.19 - [IT 이야기/IT 상식] - [Python 가상환경] conda 설치 및 가상환경 (feat. 내부 로직 & cheat sheet)

반응형

관련글 더보기

댓글 영역