ml-workspace 그리고 ml-hub 1편

Evolution of Jupyter notebook, JupyterHub and ml-workspace

Damianos
12 min readApr 24, 2021

Jupyter notebook 사용을 해 본 사람이라면 그 편리함에서 벗어나지 못하고 계속 사용할 수 밖에없는 필수 툴이라 생각할 것이다. 여러가지 개선되었으면 하는 것들이 많지만 그래도 데이터 분석부터 여러가지 실험과 리서치에 사용하는데 이만큼 도움을 줬던 개발 도구는 또 없을 것이다.

Jupyter Notebook example from https://jupyter.org/

편집이나 UI의 개선을 위해 JupyterLab도 있고 여러가지 확장팩들도 있어서 이마 Jupyter 생태계가 있다고 말해야 할 정도이다. 그러나 여러 사용자가 Jupyter notebook이나 JupyterLab을 사용하기에는 한계가 있었다. 그래서 JupyterHub에서는 Spawner라는 기능을 통해 여러 사용자의 Authentication과 해당사용자에게 표준화된 Jupyter notebook/JupyterLab을 제공할 수 있는 편리함을 제공해왔다.

JupyterLab example from https://jupyter.org/

이 정도면 Jupyter 생태계에 필수 기능들이 완성되었다고 생각할 수 있겠으나 Data Science 분야가 ML과 함께 급속도로 발전해 가면서 기존의 Jupyter만으로는 해소해지 못하던 불편함 들이 있었고 그 중 가장 크게 느끼는 부분은 다음과 같다.

대량의 데이터를 분석하다보면 고성능 CPU나 GPU 및 대량의 메모리를 필요로 한다 1인당 한 대씩 이런 장비를 갖고 있으면 좋겠지만 고가의 장비를 모든 엔지니어나 리서처에게 제공할 수 없다 보니 해당 장비를 공유해가면서 사용할 수 있는 기능이 필요해졌다.

Jupyter 생태계에 이런 부분을 보완할 JupyterHub가 있지만 GPU 연계와 할당등이 수작업으로 이루어져야 하는 점은 여전히 불편하다.

JupyterHub service Architect from https://jupyterhub.readthedocs.io/en/stable/

내 PC나 노트북에서 Jupyter notebook 실행할 때는 큰 불편함이 없었지만 공유된 장비에 원격으로 접근해 내 장비에서 작업하는 것과 큰 차이 없이 작업을 할 수 있어야 하고, 다른 사람과의 작업에 충돌이 없어야 하며, 공유 장비 내에 있는 CPU, 메모리, GPU등의 상태도 관찰해 가면서 사용할 수 있어야 한다. 게다가 노트북으로 작업한 후 혹시라도 별도의 프로그램으로 재 조합해 배치 형태로 학습을 해야 하는 경우에는 백그라운드에서 실행할 수 있도록 별도의 프로그램으로 코딩을 해야 하는데 우리 모두 알다시피 Notebook에서는 편집도 편리하지 않고 실행 환경도 불편하다고 이야기 할 수 있을 정도이다.

이런 부분을 보완해주는 오픈 소스 프로젝트가 있는데 바로 ml-workspaceml-hub 이다. 소프트웨어라기 보다는 도움이 되는 툴들을 모아 놓은 배포판 정도로 이해 하는 게 맞을 것 같다. 5개월 가량 ml-workspace를 사용해보고 개인적으로 만족도가 높았고 이제 회사 여러 동료들과 고가의 장비를 공유할 방안을 고민하는 시기가 되니 JupyterHub에 ml-workspace의 모든 기능을 연계할 수 없어 어려움을 느끼던 중 ml-hub까지 알아보게 되었다.

이번 글에서는 ml-workspace를 먼저 소개하고 ml-hub에 연계하는 방법을 차례대로 담고자한다. 너무 기능이 많아서 주요 기능만 먼저 살펴볼 예정이며 특히 해당 프로젝트에서 제공하는 설치 방법이나 간단한 소개는 사이트 링크로 대체하고자 한다. 이 글에서 집중해서 다룰 부분은 1월에 릴리즈된 JupyterLab 3.0을 담고 있는 우리 팀만의 최신 ml-workspace환경을 만드는 것이다.

팀원끼리 사이좋게 사용할 수 있는 ml-hub를 활용하는 아이디어는 다음편에서 다루려고 한다. 아마도, ml-workspace를 설치하고 나면 이것 저것 써본라 시간 가는 줄 모를 것이기 때문에 한꺼번에 ml-workspace와 ml-hub를 접해보는 것은 많은 체력을 소모하게 될 것이다.

ml-workspace는 다음의 링크를 방문하면 확인할 수 있다.

이 프로젝트에서 제공하는 배포판의 장점은 다음과 같다.

  1. SSH를 웹UI가 아닌 iTerm2 등 본인이 익숙한 터미널로 연결할 수 있는 쉬운 방법을 제공
  2. 혹시라도 Desktop UI에서 처리해야할 작업이 있다면 쉽게 접근할 수 있도록 VNC제공
  3. JupyterLab이 동작하는 장비의 컴퓨팅 자원 점검이 가능한모니터링 툴 제공
  4. 보다 편리한 텍스트 에디팅이 가능하도록 웹 기반의 VS Code제공
  5. 텐서보드, 파일 탐색기등을 포함한 각종 데이터 처리에 필수적인 다양한 라이브러리와 툴 기본 제공.
  6. docker를 빌드할 수있도록 Dockerfile이 있기 때문에 우리 팀에서 사용할 기본 라이브러리나 환경은 얼마든지 커스텀 제작하여 배포 가능.
  7. 소소하지만 작업 환경에 기본적인 notebook/lab 튜토리얼 포함

그러나 ml-workspace 마지막 버전에서는 JupyterLab 3.0을 포함하고 있지 않다. 그래서 이왕 소개하는 김에 어떻게 하면 JupyterLab3.0을 포함하여 Docker Image를 만들수 있는 지 살펴본다. 혹시 굳이 최신 버전의 JupyterLab이 필요없다면 바로 ml-workspace를 본인이 자주 사용하는 리모트 장비에 설정해 보길 권한다. 본인이 사용하는 로컬 장비에 설치해보려고 한다면 한 번 더 생각해 볼 필요가 있다. 리모트 사용에 불편함을 해소할 수 있는 툴들을 제공하는 것이 ml-workspace의 의도인데 내 PC에 설치할 필요가 있을까?

마음의 정리가 됐다면 먼저 Docker image 빌드를 위해 ml-workspace 소스코드를 clone 하는 것부터 시작해보겠다.

git clone ml-workspace with tag ubuntu20.04

Dockerfile 이 있기 때문에 docker build를 하면 될 것 같지만, 이미 build.py를 제공하고 있다 이 스크립트를 실행하여 빌드하면 쉽게 마칠 수 있으며 추가로 제공하는 flavor들이 있어 원하는 docker image가 있다면 추가로 해당 폴더로 이동하여 빌드할 수 있다.

이 이미지들의 가장 기본이 되는 minimal flavor를 빌드하기위해서는 아래의 Docker 파일을 참고하여 수정해야 한다. 이 빌드에서 신경을 쓴 부분은 ubuntu20.04, python 3.8.x, JupyterLab 3.0 이 설치되도록 하는 것이다. 그래서 Dockefile 수정이 필요하며 전체 내용은 아래와 같다.

주의할 부분은 code-server install 과정에서 vsix 파일이 다운로드 되지 않는 현상이 있어서 해당 파일들은 구글 드라이브에 개인 계정의 파일을 공유해두었기 때문에 추후 언젠가 해당 계정이 없어지면 위 스크립트는 작동하지 않을 수도 있다. 본인의 구글 드라이브계정에 해당 파일을 올려두고 링크를 바꾸면 언제는 문제 없다. 혹은 코드라인 904, 921, 886 부근의 vsix 파일 설치를 위한 커맨드 라인들을 제거 해도 ml-workspace 를 사용하는데 문제가 없다.

docker가 설치되어 있지 않다면 아래와 같이 먼저 docker와 image 빌드에 필요한 py package를 준비 한다.

docker installation and build preparation in Ubuntu

이제 티타임을 갖을 시간이다. docker image 빌드를 위해 다음의 명령어를 실행한다. ml-workspace는 flavor라는 개념으로 배포 이미지의 여러 종류별 빌드를 지원하며 minimal, light, full, gpu,r, r-gpu, spark 등이 있다. 이름에서도 직관적으로 느끼겠지만. 원하는 언어나 개발 환경으로 노트북을 생성할 수 있도록 R 과 Spark도 지원하고 있다. 기본 python환경을 제공하나 Data 분석에 도움이 되는 라이브러리들을 얼마나 포함하고 있느냐에 따라 minimal, light, full 의 단계가 결정이 된다. gpu는 full flavor를 기반으로 cuda 관련 드라이버들을 함께 설치하여 gpu를 활용할 수 있도록 도와주는 배포버전이다.

따라서 빌드시에 아래와 같은 형태로 flavor를 조정하며 이미지 빌드가 가능하다.

$ python3 build.p --make --flavor minimal
$ python3 build.p --make --flavor light
$ python3 build.p --make --flavor full
$ python3 build.p --make --flavor gpu
$ docker images

위 명령어들을 실행하여 빌드가 모두 성공하면 아래와 같이 네 개의 guest image들을 보게 된다.

사실 ml-workspace는 아직까지 ubuntu 20.04를 제대로 공식 지원하지 않는 다 그래서 많은 시행착오끝에 minimal, light, full, gpu 까지 빌드에 성공했다.

빌드가 끝나면 ml-workspace container가 자동 시작된다. 바로 접근해 볼 수 있는데 로컬에서는 문제 없겠지만 포트가 막혀있는 리모트 환경에서는 별도로 포트 매핑하는 과정을 거쳐 컨테이너가 생성되도록 해야 한다. 다음의 명령들을 참조해서 container를 올리고 내려 가면서 host와 guest os간의 포트매핑과 작업 폴더 마운팅을 조정하면 된다.

ml-workspace start script

앞서 설명한 7가지 ml-workspace 가 도움을 주는 기능들은 설치한 이후 천천히 살펴 보면 발견할 수 있다. 이번 글을 마치기 전이들 중 중요한 몇가지를 설명하자면 다음과 같다.

우선 ml-workspace에 포함되어 있지 않지만 유용할 것 같은 extension들을 포함하여 Dockerfile을 구성했기 때문에 본 배포판과는 다소 차이가 있다. JupyterLab3.0을 기본으로 여러 언어를 시험해 볼 수 있도록 했고 monaco editor extension을 포함하여 찾기나 바꾸기 기능이 vs-code수준으로 될 수 있도록 설정했다. 이 외에도 여러 기능을 확인해 볼 수 있다.

SSH는 화면 우측의 버튼을 눌러 선택하면 guest os로 public key 기반의 authentication을 할 수 있도록 .ssh 폴더에 Openssh private key를 저장해주는 명령어 라인을 제공한다. 이 명령줄을 복사하여 본인이 사용하는 터미널에서 실행하면 .ssh 에 저장할파일명을 물어오는데 나중에 연결할 때 기억할 수 있는 서버명이나 의미있는 임의의 값을 넣어주면 된다.

ml-workspace로 ssh하기 쉽도록 제공되는 실행할문자열
ml-workspace docker container로 ssh 연결해 들어가는 예

VNC는 host 와 guest os간 clipboard의 내용 공유가 자연스럽게 되지는 않지만 UI가 필요한 경우 바로바로 사용할 수 있어 도움이 된다. 많이 사용하지는 않지만 아쉬울 때 가려운 곳을 긁어주는 수준은 되기 때문에 마음 한 편을 든든하게 해주는 도구라고 할 수 있다.

ml-workspace의 vnc연결 화면 예시

VS Code 도 빼놓을 수 없는 기능이다. code-server 를 포함 시켜 배포 한 것으로 보이는데 당장 쓰기에 무리 없도록 python 관련 extesion은 포함이 되어 있다. notebook으로 실험을 마치고 배치 프로그램이나 서비스할 앱을 개발할 때 또는 대량의 문자열을 핸들링할 때 함께 사용하면 생산성이 많이 올라간다.

VS Code 를 jupyter notebook 화면에서 실행할 때 보이는 code-server UI

이 외의 기능들은 스스로 언박싱 하는 기분으로 살펴보면 재미가 쏠쏠하다. 다음 편에서는 이 ml-workspace를 리모트 장비에서 여러명의 Scientist들이 함께 사용할 수 있도록 관리하는 데 요긴한 ml-hub를 빌드하여 사용해볼 예정이다. 50~60명 수준의 분석가들이라면 간단히 docker만으로도 지원할 수 있지만 100명 에 가까운 Scientist들을 지원하려면 k8s 에 올린다면 지원이 가능할 것 같다. 그런데 마침 ml-hub는 kubernetes와 연계하는 기능도 지원하고 있어 한 번 살펴 보는 의미가 있을 것 같다.

--

--

Damianos

I believe wisely utilizing software makes our lives zesty and present relief, Amen