Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발

1,153 views

Published on

머신러닝 및 데이터 과학 분야의 컴퓨팅 수요는 해가 갈수록 급증하고 있습니다. 이와 더불어 분산처리 기술, 데이터 파이프라이닝 및 개발 환경 스택 관리 등의 관련된 다양한 이슈들 또한 엄청나게 늘어나고 있습니다. 머신러닝 모델의 기하급수적인 모델 복잡도 증가 추세와 마찬가지로, 모델 학습을 위한 환경 관리 또한 갈수록 복잡도가 높아지는 추세입니다.

이 세션에서는 이러한 문제를 해결하기 위해 python 언어 기반의 분산처리 스케쥴링/오케스트레이션 미들웨어 플랫폼을 개발한 4년간의 과정에서 겪은 다양한 문제들에 대해 다룹니다. 2015년 컨테이너 기반의 고밀도 분산처리 플랫폼 설계 및 프로토타이핑 과정을 PyCon KR에서 발표한 이후, 실제 구현 및 오픈소스화, 안정화를 거치며 겪은 다양한 기술적/비기술적 문제들에 대한 경험을 공유합니다.

기술적으로는 최근 몇 년 간의 클러스터 플랫폼 관련 기술의 진보와 함께 탄생한 다양한 도구들과, 이러한 도구들을 python 기반으로 엮어내기 위해 사용하고 개발한 다양한 오픈소스들을 다룹니다. Python 기반의 컨테이너 스케쥴링 및 오케스트레이션 과정의 구현과, 다양한 프로그래밍 언어로 만든 SDK를 graphQL을 이용하여 연동하는 과정에서의 몇몇 유의점을 설명합니다. 아울러 python 기반의 SDK를 다양한 언어로 포팅했던 경험을 간단하게 안내합니다.

플랫폼을 개발하는 중 등장한 TensorFlow, PyTorch 등의 다양한 머신러닝 프레임워크들을 도입하며 겪은 문제와 해결 과정에 대해서도 나눕니다. 연구 분야에는 Python 2.7 기반의 프레임워크들이 여전히 많습니다. 이러한 프레임워크 및 라이브러리의 지원을 위하여 Python 2 기반의 프레임워크와 Python 3.7로 구현한 컨테이너 인터페이스를 단일 컨테이너 환경에 중복 빌드 및 상호 간섭 없이 공존시키기 위해 개발한 아이디어를 소개합니다.

마지막으로 Python 기반의 프레임워크를 개발, 배포 및 상용화 하는 과정에서 겪은 다양한 어려움을 소개합니다. 솔루션을 배포 및 보급할 때 겪는 다양한 런타임, 하드웨어 환경 및 개인 정보 보호를 위한 폐쇄망 대상의 디플로이 등에 대응하기 위하여 Python 응용프로그램을 단독 실행용으로 패키징하는 과정에서 겪은 팁들을 설명합니다. 또한 GUI 빌드 및 Python, Go 및 C++을 함께 사용한 드라이버 가상화 레이어 개발 등의 내용도 살짝 다룹니다.

이 슬라이드는 PyCon KR 2019의 발표 슬라이드입니다. ( https://www.pycon.kr/program/talk-detail?id=138 )

Published in: Technology

머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발

  1. 1. PyCon Korea 2019 머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발 신정규 +김준기, 박종현
  2. 2. 오늘의 발표 주제: 2015년의 발표 연장 + 그 동안의 소회 © Jeongkyu Shin
  3. 3. 4년 전…
  4. 4. https://www.slideshare.net/inureyes/pycon-kr-2015 Photo by © Jeongkyu Shin
  5. 5. 현대 과학 연구와 개선 • 기술은 21세기, 시스템은 20세기, 학계는 19세기 • 인간이 관여하는 분야의 발전 속도가 그렇지 않은 분야의 발전 속도를 따라가지 못하는 경향 • 학계와 업계, 사회의 간극 PyCon KR 2015 발표 요약
  6. 6. 연구말싸미 듕귁에 달아 코드로 서르 사맛띠 아니할쌔 이런 젼차로 어린 학도가 니르고져 홀빼이셔도 마참내 제 뜨들 시러펴디 못할 노미 하니라. 내 이랄 위하야 어엿비 너겨 새로 연구 코드 나누미와 과학 공학 노리터를 맹가노니 사람마다 희여 수비니겨 날로 쑤메 뼈한크이 하고져 할따라미니라. • 재현 가능한 데이터 연구 플랫폼 • 논문용 코드로부터 실제 서비스까지 확장을 지원하는 클라우드 샌드박스 서비스 현대 과학 연구와 개선 PyCon KR 2015 발표 요약
  7. 7. 천릿길도 한 걸음부터. ..설마 진짜 천 리 인건 아니겠지 현대 과학 연구와 개선 PyCon KR 2015 발표 요약
  8. 8. 컨테이너 기반의 고밀도 분산처리 플랫폼 및 사용자 편의 기능 구현 2015년 발표 후… 은 한 6개월이면 어떻게 될 것 같은데… (프로토타입도 만들었으니) Photo by © Jeongkyu Shin
  9. 9. 만화나 영화 보면 보통 프로토타입이 제일 좋던데…
  10. 10. Vector Graphics by Vecteezy.com
  11. 11. 4 Years Later 4 년 후
  12. 12. 권불10주 우공이산 설상가상 화룡점정 홍익인간 오늘의 이야깃거리
  13. 13. 이름이 생겼습니다 • Sorna (2015~) ➜ Backend.AI (2017~) • 뒤에선 Backend.AI 라고 부를 거에요. 오픈소스가 되었습니다. • 2016년 11월 (Sorna) 오픈소스 1.0 • 여섯 번 메이저 버전업이 있었고, • 1.1, 1.2, 1.3, 1.4, 18.12, 19.03 • 상도 몇 개 받았죠! LTS도 나왔습니다. • Backend.AI 19.03 (첫 LTS) 들어가기 전에 몇가지 짜 잔 …발표 끝날 때 쯤이면 ‘짜잔’이 ‘짠’하게 보이실 겁니다.
  14. 14. PyCon Korea 2019 권불10주 : 이 바닥은 10주마다 바뀌더라.
  15. 15. 뭐든지 빠른 세상! 24개월: Nvidia 하드웨어 generation 주기 18개월: Python의 안정 버전 주기 6개월: Docker Engine의 안정 버전 주기 6주: TensorFlow의 안정(?) 버전 주기 권불10주: 세상의 속도
  16. 16. 용어 설명
  17. 17. Bear
  18. 18. Metal Bear Photo by © Bill Ohrmann – Metal Bear Sculpture
  19. 19. Baremetal Photo by © Jeongkyu Shin
  20. 20. Cluster Photo by © Facebook Inc.
  21. 21. Baremetal
  22. 22. Cluster
  23. 23. Baremetal VM VM
  24. 24. Baremetal VM VM • 가상 머신 (Virtual Machine) • 하드웨어 레벨의 가상화 솔루션 • 독립된 운영체제 및 환경 • 베어메탈의 운영체제에 영향 받지 않음 • 가상화된 하드웨어를 VM 내에 제공 • 장단점 • 완벽하게 격리된 환경 / 여러 OS 실행 • 성능 저하
  25. 25. Cloud
  26. 26. Baremetal OS Container layer Containers
  27. 27. Baremetal VM VM OS Container layer Containers Containers OS Container layer
  28. 28. Baremetal VM VM OS Container layer Containers Containers OS Container layer Baremetal OS Container layer Containers Shared Dedicated
  29. 29. Baremetal VM VM OS Container layer Containers Containers OS Container layer • 컨테이너 • 호스트 운영체제 커널을 공유 • 커널을 제외한 부분들을 격리 • 구현 • Container layer: LXC / runC / Jail… • Namespace 기반의 가상화 • 보안 정책 및 컨트롤그룹 앨리어싱 • seccomp / cgroup
  30. 30. Cloud
  31. 31. Cloud 클라우드 매니저 • 클러스터에 VM 또는 스토리지를 생성, 삭제, 배치, 관리하는 역할 담당 • IaaS (Infrastructure as a Service) 구축을 위한 소프트웨어 컨테이너 관리 솔루션 (컨테이너 오케스트레이터) • 컨테이너를 생성, 삭제, 배치, 관리하는 역할 담당
  32. 32. Rootless 컨테이너 및 특화 컨테이너 솔루션의 등장 • Docker ➜ Podman, LXD, Singularity 컨테이너 관리 솔루션의 발전: Borg ➜ Swarm, Kubernetes, Mesos, Backend.AI 권불10주: 컨테이너 기술의 진보 이름 개발사 연도 특징 LXC IBM 2008 리눅스 컨테이너 실증 Docker Docker 2013 컨테이너 대중화 LXD Canonical 2015 데스크탑 어플리케이션 배포용도 Singularity Sylabs 2016 과학 연산 특화 Podman Containers Org. 2017 유저 권한으로 실행됨
  33. 33. 마이크로서비스 • 어플리케이션을 작은 단위로 쪼갬 • 서비스 모듈 + 통신 • 빠른 버전업 및 지속적 통합 기반 언어의 변화 • Python + Node.js + GO + C++ + PHP + JAVA… 프로토콜의 확장 • REST ➜ ZeroMQ, GraphQL, Callosum… 권불10주: microservice의 대두 Chart by © Martin Fowler. https://martinfowler.com/bliki/MicroservicePremium.html
  34. 34. Asynchronous Programming Asynchronous I/O의 도래 • 마이크로서비스: 지연 시간 예측 난도 • 많은 마이크로서비스들이 비동기로 동작 권불10주: 비동기의 시대 언어 구현체 / 문법 버전 Python asyncio 3.5 Node.js Promise / Async 7 JavaScript Promise ECMA6 GO goroutine Java @Async JDK 1.8 C++ future / promise C++11 프로그래밍 언어의 비동기 I/O 지원. 리스트에 없는 언어의 경우 비동기 지원 라이브러리들이 있음
  35. 35. PyCon Korea 2019 우공이산 : 몰랐으니까 산을 옮길 시도를 시작할 수 있었다.
  36. 36. 필요한 것 • 샌드박스 기반의 코드 실행 서비스 • 클라우드 기반 유저 인터페이스 • 소유자 / 그룹 / 커뮤니티 / 노트 • 공유시스템 • 서비스를 사용하기 위한 웹/앱 우공이산: 기본 설계하기 기본 테크스택 (2015 AUG. PyCon KR)
  37. 37. 우공이산: 기본 설계하기 Backend.AI Manager Backend.AI Agent Scaling Group Scaling Group Backend.AI Agent Backend.AI Agent Backend.AI Agent Backend.AI Agent Backend.AI Client Kernel Kernel Kernel Kernel Kernel Kernel Kernel 네트워크 스토리지 세션 DB 사용자 DB 설정 서버 Sorna (Backend.AI) 설계 (2016)
  38. 38. 우공이산: 기본 설계하기 >_ Backend.AI Client SDK for Python HTTPS WebSocket / REST / GraphQL ZeroMQ etcdRedisPostgreSQL (DB별 전용 프로토콜) Backend.AI Client SDK for Javascript Tensor Flow Backend.AI Jail R Backend.AI Jail Docker 입출력 데이터 Cloud Storage Backend.AI Agent Backend.AI Manager https://api.backend.ai § 실시간 터미널 연결 § 컨테이너 내부 서비스 연결 § 관리자용 모니터링 기능 연동 § 멀티미디어 출력 처리 § 사용자 세션 인증 § 실시간 사용량 추적 § 자동 rolling upgrade § 시스템콜 기반 샌드박싱 § CPU/GPU Core, Memory, Storage를 포함한 컨테이너별 자원 제약 강제 § 사용자별 스토리지 관리 § 권한 기반 스토리지 폴더 초대 및 공유 § 예제 데이터 집합 제공 § 요청 라우팅 § I/O 릴레이 및 프록시 § Agent 자동 스케일링 § 하이브리드 클라우드 지원 Backend.AI component roles (2016)
  39. 39. 일거리 산 ➜ 이제 여기에 산이 쌓입니다.
  40. 40. 목표 (2015년) • 머신러닝: Caffe와 Theano를 잘 돌려주자! • 속도가 필요한 연구들: Julia도 돌리자! • MATLAB 사용자: Octave를 돌리자! • ABM 기반의 뉴럴넷도 하니까: Repast도 돌리자! • (생물 뉴런 모델링을 위해) NEURON 도 돌려주자! 이정도면 다가올 딥러닝 시대에 대한 준비는 완벽! 우공이산: TensorFlow의 등장 일거리 산 ➜ 완!벽!합니다!
  41. 41. TensorFlow (2015.12~): 머신러닝 편의성 개선에 큰 역할 • GPU 가속 지원 발표 • 초기 버전에서는 CPU 지원 • 버전업에 따라 1GPU ➜ 멀티 GPU 지원 ➜ 멀티 노드 지원이 계속 추가… • GPU 지원을 추가하자! • Nvidia GPU 를 컨테이너에 붙이자! • nvidia-docker 우공이산: TensorFlow의 등장 (1) GPU 가속 지원 멀티 GPU 지원 일거리 산 ➜
  42. 42. Speed is everything! • 하위 호환성은 안녕 – 1.3 / 1.4, 1.9 / 1.10, 1.12 / 1.13,4… • 빌드 체인도 안녕 • 빌드 체인도 매번 바뀌고 • 빌드 방법도 매번 바뀌고 • 빌드 도구도 매번 바뀐다… • Protobuf, bazel … 우공이산: TensorFlow의 등장 (2) GPU 가속 지원 멀티 GPU 지원 일거리 산 ➜ 빌드 도구 / 공개 이미지 저장소
  43. 43. nvidia-docker • (당연하게도) 하드웨어 의존성이 큼 • 버전업이 되면서 구현 방법 자체가 바뀜 • V2: runC 기반의 앨리어스 덩어리 • V1 / V2 : 실질적으로 다른 구현체 • CUDA 10은 V2를 요구함 • CUDA-X는 CUDA 10.1을 요구함 • 다중 구현 필요 • 그런데 • Docker 19.03부터 v2와 유사하게 자체 지원 • Docker 하위호환때문에 버릴 수도 없음 우공이산: 왜 슬픈 예감은… GPU 가속 지원 멀티 GPU 지원 일거리 산 ➜ 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원
  44. 44. PyTorch (2017.1) • Torch + Python 프론트엔드 • 역시 GPU를 지원함 • 멀티 노드 및 멀티 GPU 지원은 이후에 추가 간단하지 않음 • CPU-GPU 메모리 복사: 기존 Python 패키지와의 광범위한 호환성 (이 문제가 됨) • 버전별 호환성 문제 • PyTorch도 버전 별로 사실상 다른 프레임웍임… 우공이산: PyTorch의 등장 GPU 가속 지원 멀티 GPU 지원 일거리 산 ➜ 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up Photo from © bgr.com Steve Jobs (2010)
  45. 45. PyCon Korea 2019 설상가상 : 문제를 해결하면 문제들이 따라온다.
  46. 46. Parallelism • 데이터 병렬화Data parallelism • 데이터 파이프라인 및 forward/backward pass 병렬화 • MPI 의 parallelism과 유사 • 모델 병렬화Model parallelism • 모델을 잘라서 처리함 • 단일 GPU로 커버하기 힘든 경우 사용 설상가상: 병렬화 지원 (1) GPU 가속 지원 멀티 GPU 지원 일거리 산 ➜ 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up
  47. 47. 데이터 병렬화 지원 • 데이터 파이프라인 구성 • 싱글 노드 – 싱글 GPU • 싱글 노드 – 멀티 GPU • tf.distribute.MirroredStrategy, torch.nn.DataParallel • 멀티 노드 – 싱글 GPU (X) • 멀티 노드 – 멀티 GPU • tf.distribute.CollectiveAllReduceStrategy 설상가상: 병렬화 지원 (2) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O
  48. 48. 연구분야: 세상의 속도가 다르게 흐르는 곳 • 수치해석 라이브러리들 • Python 2 기반 / 2to3로 3 지원 • Python 3의 장점을 희생함 • NLP: 주요 라이브러리들이 전부 Python 2 기반 • 포트란 기반 라이브러리들도 잊지 말라고! • TensorFlow Extended: Python 2 의존성 • 6월에 드디어 해결됨! 설상가상: Python 2/3 지원 (1) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O 파이썬 래퍼가 처리했으니 안심하라구! (진짜?) Photo from © Debra Bardowicks
  49. 49. Backend.AI 구현체 • Python 3.4로 시작 ➜ Python 3.6 요구 • 컨테이너별로 사용하는 Python이 전부 상이함 • Nvidia GPU Cloud 이미지는 Python 3.5 • 제어: 컨테이너 내부와의 통신 필요 • 자원 측정 • 앱 실행 • 어떻게 컨테이너 내부의 다양한 환경을 그대로 놓아두고 내외부 인터페이스를 만들어야 하나? 설상가상: Python 2/3 지원 (2) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter
  50. 50. ZeroMQ • 거의 모든 언어로 구현체가 존재하는 메세지 전달 도구 Unified message queue with ZeroMQ (2016~2017) • 컨테이너 드라이버용으로 컨테이너 내부 환경에 맞는 구현체를 각자 구현하자 문제점 • ZeroMQ를 사용하는 부분은 해당 언어로 구현해야 함 • 지원 언어가 15가지를 넘어가게 되면서 바벨탑 쇼크가 옴 설상가상: 컨테이너 컨트롤러 구현 (1) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 일거리 산 ➜
  51. 51. pkg load zeromq ... function clear (varargin) ... endfunction function result = execute_code(_sorna_insock, _sorna_outsock, _sorna_code) ... try _sorna_stdout = evalc (_sorna_code, '_sorna_stderr = lasterror.message;'); if strfind (_sorna_code, 'plot') || strfind (_sorna_code, 'figure') gobjs = findall (0, 'type', 'figure'); for i = 1:length(gobjs) tmpf = tmpname (); print (gobjs(i), tmpf); fstr = fileread (tmpf); ... _sorna_media{i} = {'image/svg+xml', fstr}; unlink (tmpf); endfor endif catch end_try_catch ... Endfunction ... _sorna_insock = zmq_socket (ZMQ_PULL); _sorna_outsock = zmq_socket (ZMQ_PUSH); zmq_bind (_sorna_insock, 'tcp://*:2000'); zmq_bind (_sorna_outsock, 'tcp://*:2001'); Octave implementation (2017)
  52. 52. {-# LANGUAGE DeriveGeneric #-} ... data ExecResult = ExecResult { ... } deriving (Generic) instance ToJSON ExecResult instance FromJSON ExecResult data ExceptionInfo = ExceptionInfo { ...} main :: IO () main = do let runZMQ $ do skt <- socket Rep bind skt port printInZMQ "serving at port 2001..." loop skt putStrLn "exit." where port = "tcp://*:2001" loop skt = do code_id <- receive skt code <- receive skt let (out, err, exceptions) = executeCode (show code_id) (U.toString code) let result = lazyToStrict . encode $ ExecResult out err exceptions send skt [] result loop skt ... Haskell implementation (2016)
  53. 53. Photo by © Junghoon Lee
  54. 54. Kernel Runner: superposed Python controller (2018) • 컨테이너 환경 언어에 상관 없도록 단일 인터페이스를 이용한 구현 • 컨테이너의 운영체제만 영향을 줌 • Volume mount로 Python 컨트롤러 구현체를 /opt 하위에 탑재 • https://github.com/lablup/backend.ai-kernel-runner 장단점 • 언어별 별도 구현 및 중복 구현이 없어짐 • REPL 지원 ➜ jupyter_client를 우리의 백엔드로 사용 • 컨테이너 내부 언어/프레임워크와 kernel runner 실행환경의 분리가 가능해짐 • kernel runner는 asyncio로 짰지만 사용자는 Python 2 코드도 돌릴 수 있음 설상가상: 컨테이너 컨트롤러 구현 (2) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현
  55. 55. from jupyter_client import KernelManager from jupyter_client.kernelspec import KernelSpecManager ... kernelspec_mgr = KernelSpecManager() kernelspec_mgr.ensure_native_kernel = False kspecs = kernelspec_mgr.get_all_specs() for kname in kspecs: if jupyter_kspec_name in kname: kernel_mgr = KernelManager(kernel_name=kname) kernel_mgr.start_kernel() ... kernel_client = kernel_mgr.client() kernel_client.start_channels(shell=True, iopub=True, stdin=True, hb=True) kernel_client.wait_for_ready(timeout=10) ... async def query(code_text) -> int: msg_id = kernel_client.execute(code_text, ...) ... poller = zmq.asyncio.Poller() iopub_socket = kernel_client.iopub_channel.socket stdin_socket = kernel_client.stdin_channel.socket poller.register(iopub_socket, zmq.POLLIN) poller.register(stdin_socket, zmq.POLLIN) while True: events = dict(await poller.poll(timeout_ms)) if iopub_socket in events: msg = kernel_client.iopub_channel.get_msg(timeout=0) await output_hook(msg) ... async def query(code_text) -> int: ensure_inproc_runner() await input_queue.async_q.put(code_text) while True: try: msg = await output_queue.async_q.get() except asyncio.CancelledError: break output_queue.async_q.task_done() if msg is sentinel: break outsock.send_multipart(msg) ... class PythonInprocRunner(threading.Thread): def run(self): sys.stdout = ConsoleOutput(...) sys.stderr = ConsoleOutput(...) while True: code_text = self.input_queue.get() self.input_queue.task_done() try: code_obj = code.compile_command( code_text, symbol='exec') except ...: ... 모든 언어마다 개별 구현 (컴파일 언어는 대체로 힘듬) Jupyter 지원 모든 언어 사용 가능
  56. 56. Kernel Runner: superposed Python controller • 배포의 귀찮음: Kernel Runner 이미지가 항상 필요함 • pip 기반의 인스톨 파이프라인에서 벗어난 설치 과정 Embedded Kernel Runner (2019) • 아예 파일 시스템을 에이전트에 배포하고 중복마운트하면? • https://github.com/lablup/backend.ai-krunner-ubuntu • https://github.com/lablup/backend.ai-krunner-alpine • https://github.com/lablup/backend.ai-krunner-centos 설상가상: 컨테이너 컨트롤러 구현 (3) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현
  57. 57. #! /bin/sh rm -rf /root/volume/* tar xJf /root/archive.tar.xz -C /root/volume/ echo "$KRUNNER_VERSION" > /root/volume/VERSION https://github.com/lablup/backend.ai-kernels https://github.com/lablup/backend.ai-agent/tree/master/src/ai/backend/runner https://github.com/lablup/backend.ai-krunner-ubuntu/blob/master/src krunner-extractor.shkrunner-python.ubuntu16.04.dockerfile FROM ubuntu:16.04 ARG PREFIX=/opt/backend.ai ENV PATH=${PREFIX}/bin:$PATH ENV LANG=C.UTF-8 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates netbase && rm -rf /var/lib/apt/lists/* ENV GPG_KEY 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D ENV PYTHON_VERSION 3.6.8 RUN mkdir -p ${PREFIX}; echo "${PREFIX}/lib" > /etc/ld.so.conf.d/backendai.conf && ldconfig RUN set -ex && savedAptMark="$(apt-mark showmanual)" && apt-get update && apt-get install -y --no-install-recommends dpkg-dev gcc libbz2-dev libc6-dev
  58. 58. PyCon Korea 2019 화룡점정 : 눈 찍는게 의외로 중요한 일이다.
  59. 59. GraphQL • API를 위한 쿼리 언어 / 페이스북 개발 • JSON 기반: 구현을 위해 별도의 모듈등이 필요하지 않음. • RESTful API 대체에 용이 화룡점정: 마이크로서비스 API GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API
  60. 60. 화룡점정: 언어별 SDK 구현 type ComputeSession implements Item { id: ID sess_id: String role: String image: String registry: String domain_name: String group_id: UUID user_uuid: UUID access_key: String status: String status_info: String created_at: DateTime terminated_at: DateTime agent: String container_id: String service_ports: JSONString occupied_slots: JSONString occupied_shares: JSONString num_queries: BigInt live_stat: JSONString last_stat: JSONString group_name: String lang: String mem_slot: Int cpu_slot: Float gpu_slot: Float tpu_slot: Float cpu_used: BigInt cpu_using: Float mem_max_bytes: BigInt mem_cur_bytes: BigInt net_rx_bytes: BigInt net_tx_bytes: BigInt io_read_bytes: BigInt io_write_bytes: BigInt io_max_scratch_size: BigInt io_cur_scratch_size: BigInt tag: String workers(status: String): [ComputeWorker] } query: "query($ak:String, $status:String) { compute_sessions(access_key:$ak, status:$status) { sess_id lang created_at terminated_at status occupied_slots }}" variables: {status: "RUNNING", ak: null} {"compute_sessions": [{ "sess_id": "oKVQNwG4-jsSDK", "lang": "index.docker.io/lablup/ngc-tensorflow:19.02-py3", "created_at": "2019-08-16T07:33:19.232425+00:00", "terminated_at": null, "status": "RUNNING", "occupied_slots": "{"cpu": "4", "mem": "12884901888", "cuda.shares": "1"}” }]} 요청 응답
  61. 61. Python 기반의 서버 어플리케이션 배포 • 오프라인일 때는? 고려할 점 • python 런타임 • 네트워크 억세스를 사용하지 않는 pip • 설치 환경에 따라 달라지는 설정 변경 • 대규모 설치 요구 환경에서의 자동화 화룡점정: 오프라인 환경 (1) Photo taken from Error message of Google Chrome
  62. 62. Installer Builder Builder 만들기 • Docker 이미지 빌더 • Python 번들 • Python 필요 패키지 ➜ 단일 wheel (wheelset) 빌더 • Binary wheel 이 든 이미지 패키저 패키징 • 각 프로그램별 패키저 • manager, agent, console, console-server, wsproxy, client, ML runtimes… • 모든걸 담은 단일 바이너리 설치 파일 화룡점정: 오프라인 환경 (2) python utils docker cli bin files context Packager agentbootstrap console client hub manager halfstack wsproxy Wheelsets (CentOS) Wheelsets (Ubuntu)
  63. 63. Ansible • 설치 및 배포과정 자동화 도구 • 설치 노드가 두 자릿수를 넘어가는 경우에 매우 유용 • Playbook 작성 ➜ 실행의 순서 적용 • 다양한 조건에 해당하는 yml 파일 생성 • 해당 yml 에 적용한 변수를 playbook으로 작성 화룡점정: Ansible 기반 배포 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템
  64. 64. 화룡점정: Ansible 기반 배포 ansible-playbook -i custom_host install_backend_ai_rolebased.yml -K -e "branch_name=19.03 manager_service_ip=127.0.0.1" 3.배포 1.설치 pip install ansible all: hosts: host1: ansible_host: 192.168.0.10 vars: project_name: ‘test_distribution’ ansible_user: test_dev ansible_connection: ssh branch_name: master db_port: 5432 redis_port: 6379 etcd_port: 2379 … db_data_location: ‘{{ target_directory_path }}/data/postgres’ etcd_data_location: '{{target_directory_path }}/data/etcd’ kernels_to_install: - "lablup/python:3.6-ubuntu18.04" - "lablup/python-tensorflow:1.14-py36-cuda9" … children: … 2.설정
  65. 65. RestructuredText 기반의 문서화 • 코드 주석 기반 + 문서 고유 설정 • Readthedocs를 통한 배포 파이프라인 구축 폴리글랏 기반의 프로젝트 문서화 • ReST 플러그인들이 다양하게 존재하지만 잘 돌아가는게 없음 • 예) JSDoc support by Mozilla – 2017년 마지막 업데이트 • 결론: • Python: ReST + Sphinx, JavaScript: JSDoc 화룡점정: 문서화 https://docs.backend.ai
  66. 66. RestructuredText 기반의 문서화 • 코드 주석 기반 + 문서 고유 설정 • Readthedocs를 통한 배포 파이프라인 구축 폴리글랏 기반의 프로젝트 문서화 • ReST 플러그인들이 다양하게 존재하지만 잘 돌아가는게 없음 • 예) JSDoc support by Mozilla – 2017년 마지막 업데이트 • 결론: • Python: ReST + Sphinx, JavaScript: JSDoc 화룡점정: 문서화 JSDoc 기반의 문서화
  67. 67. 화룡점정: GUI (1)
  68. 68. GUI: 빼먹은 조각 • 다들 연구하다 온 사람들이라 필요성을 몰랐음 • 4년 동안 몰랐음… 아는 만큼만 보인다 • 박사들이 모여 만들다 보니: 아니 GUI가 왜 필요해? • SDK+API 를 완전하게 지원합니다! • 설치 방법도 다양하게 지원합니다!! • 그런데 GUI가 필요한가요? ➜ “그래서 있어요 없어요?” 화룡점정: GUI (2) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI
  69. 69. GUI 만들기 (2019) • CLI가 할 수 있는 모든 작업을 직관적으로 제공 필요한 것 • 앱 • 데스크탑에서 편리하게 사용할 수 있음 • 별도의 파이썬 클라이언트를 설치하지 않고 사용 가능 • 웹 • 앱을 설치하거나 관리하기 귀찮은 경우 • 브라우저만 있으면 사용할 수 있도록 화룡점정: GUI (3) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI
  70. 70. 앱 • Webcomponent 기술 기반 • Node.js + Electron 웹 • 앱의 코드를 거의 그대로 쓸 수 있게 해 보자! • 문제: 웹은 뭘로 접속해올 지 알 수가 없다… 화룡점정: GUI (4) GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI
  71. 71. Backend.AI ES6 SDK Console App component LitElement Router Summary Redux Runtime / session Storage Maintenance Settings Resources Users Pipeline Experiments Statistics Pipeline App component 코어 • Webcomponent 기술 기반 • 언어: JavaScript (ES6) ➜ TypeScript • Polymer + lit-element • State 관리: Redux • 빌드체인: PolymerCLI ➜ rollup.js + Karma • Polyfill: webcomponentsjs ➜ polyfill.app 메인 앱 • 사용부터 관리까지 모두 담당 • 클러스터 관리는 Django 기반의 전용 프로그램 별도 제작 (hub) 파이프라인 앱 • 별도 개발 • 이후 통합? 사용자 기능 관리기능
  72. 72. Electron Main processRenderer process Backend.AI ES6 SDK Console App component LitElement Router Summary Redux Runtime / session Storage Maintenance Settings Resources Users Pipeline Experiments Statistics Pipeline App component Backend.AI WebSocket Proxy (standalone) Backend.AI Node.js SDK 앱 • Electron 기반 • 코어를 그대로 사용 • node.js 기반의 프록시 구현체 • JavaScript ES6 코드 서빙 • Electron 의 File 모드로 JavaScript를 서빙할 수 없다! • 별도의 프로토콜 (es6)을 정의 후, 해당 프로토콜에 커스텀 파서를 붙여 해결
  73. 73. 앱 • Electron 기반 • 코어를 그대로 사용 • node.js 기반의 프록시 구현체 • JavaScript ES6 코드 서빙 • Electron 의 File 모드로 JavaScript를 서빙할 수 없다! • 별도의 프로토콜 (es6)을 정의 후, 해당 프로토콜에 커스텀 파서를 붙여 해결 protocol.registerSchemesAsPrivileged([ { scheme: 'es6', privileges: { standard: true, secure: true, bypassCSP: true } } ]); protocol.registerBufferProtocol('es6', (req, cb) => { nfs.readFile( npjoin(es6Path, req.url.replace('es6://', '')), (e, b) => { cb({ mimeType: 'text/javascript', data: b }) } ) }); 임의의 프로토콜 (es6) scheme 등록 (Electron V5/6) 임의의 버퍼 프로토콜 (es6) 의 동작등록 (Electron V5/6)
  74. 74. WebSocket Proxy Server Console server Backend.AI ES6 SDK Console App component LitElement Router Summary Redux Runtime / session Storage Maintenance Settings Resources Users Pipeline Experiments Statistics Pipeline App component Backend.AI WebSocket Proxy (service) Backend.AI Node.js SDK Backend.AI Manager Backend.AI Manager Proxy Redis 웹 콘솔 모드 • Console-server와 결합 • aiohttp 기반의 python 서버 • 세션 기반의 로그인 제공 • Manager 프록시 • 클러스터의 노출을 막음 • 웹소켓 프록시 서버 • 컨테이너 안의 앱 실행 라우팅
  75. 75. 허브 • 전체 클러스터 관리용 • Django + lit-element • Console-server 기반의 Manager 프록시 • 여러 console-server들을 도메인별로 배포 • 클러스터의 Protected multi-tenancy 지원
  76. 76. Python asyncio 기반의 코드 • 뻗지는 않는데 엄청 잘 뻗는다? • 수많은 예외 고가용성 • 로드 밸런서 구현 • 매니저 레벨에서의 스케쥴러 및 큐잉 • 관리 모드를 예약한 노드의 큐잉 대상 제외 • Python 어플리케이션의 레플리케이션 모드 구현 • Fleet 운영시 Voting 알고리즘 화룡점정: 고가용성 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현
  77. 77. 기존 • 클라이언트 (PC쪽)에서 호출하는 REPL 부분 및 Language server를 Backend.AI SDK 기반으로 구현해서 원격 처리 • 컴파일이 필요한 경우 파일을 전송하고, TTY 를 포함한 I/O 포트를 후킹해서 그대로 터널링 화룡점정: 웹소켓 프록시 터널링 (1) User PC Jupyter ipykernel Backend.AI Python SDK Web Browser 상호작용 방향 HTTP REST/GraphQL API + Query mode execution API Computing Node Backend.AI Agent Container Kernel Runner User Program Master Node Backend.AI Manager server-sideclient-side Backend.AI Jupyter Notebook 구현체 (2017)
  78. 78. 앱 프록싱 문제 • 수많은 앱들마다 전부 외부 아답터를 지원해 줄 수가 없다! • Jupyter랑 JupyterLab은 kernelspec을 맞춰서 아답터를 구현 • IntelliJ (PyCharm), VS Code 및 ATOM은 IDE용 플러그인을 SDK 기반으로 구현 • 근데 끝이 없다 : TensorBoard, TFX, AirFlow, DIGITS… • 클라이언트를 사용자 쪽에 꼭 깔아야 함 대안 • 웹서비스 UI가 있는 앱들은 컨테이너 안에서 실행, 웹 포트를 사용자에게 제공 • Jupyter REPL을 지원하는 경우, KernelSpec을 맞춰서 REPL 구현체 제공 • 모두 다 아닌 경우 기존처럼 제공 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현 화룡점정: 웹소켓 프록시 터널링 (2)
  79. 79. User PC Web Browser Computing Node Backend.AI Agent Container Kernel Runner User Program Jupyter TensorBoard Master Node(s) Web Console wsproxy Backend.AI JS SDK client-side Backend.AI Manager Backend.AI Console Server server-sidemiddleware 화룡점정: 웹소켓 프록시 터널링 (3) 프록시 터널링 설계 (2018)
  80. 80. 화룡점정: 웹소켓 프록시 터널링 (4) API Client Backend.AI Agent Backend.AI Manager Computing Node Container Jupyter(2) 컨테이너 서비스로 첫 패킷 전송 (5) 컨테이너 서비스로 첫 패킷 전송 (1) 세션 생성 (1) 세션 생성 (4) 서비스 시작 (3) 컨테이너 서비스를 위한 스트림 프록시 오픈 (4') 시작됨! (5') 서비스로 부터 첫 응답 발송 User Client (e.g., browser) $ backend.ai start –t mysess ... $ backend.ai app mysess juypter –p 9000 세션 “mysess”에서 제공되는 "jupyter" 어플리케이션으로의 로컬 프록시를 http://127.0.0.1:9000 에서 제공 Service Proxy :9000 :443 :6001 :8080 :31023 (6) 컨테이너 서비스로 가는 패킷 (6') 컨테이너 서비스에서 오는 패킷 APIRequest: HTTP/1.1 GET /stream/kernel/mysess/httpproxy?app=jupyter payload: HTTP/1.1 GET /tree HTTP/1.1 GET /tree APIRequest: (other) 프록시 터널링 구현 상세 (2019)
  81. 81. 화룡점정: 웹소켓 프록시 터널링 (5) User PC Web Browser Computing Node Backend.AI Agent Container Kernel Runner User Program Jupyter TensorBoard Master Node(s) Web Console wsproxy Backend.AI JS SDK client-side User PC Electron Shell Chromium Computing Node Backend.AI Agent Container Kernel Runner User Program Jupyter TensorBoard Master Node(s) HTTP REST/GraphQL API + WebSocket stream tunneling API Backend.AI Manager Backend.AI Console Server Backend.AI Manager Backend.AI Console Server Web Console Backend.AI JS SDK wsproxy server-sidemiddleware Cloud 폐쇄망
  82. 82. 앱 프록싱 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현
  83. 83. 앱 프록싱 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현 …은 한 6개월이면 어떻게 될 것 같은데…
  84. 84. 앱 프록싱 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현 ……
  85. 85. 앱 프록싱 그렇게 4년이 흘렀습니다. GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현
  86. 86. PyCon Korea 2019 홍익인간 : 내 고생을 남도 하게 하지는 말자
  87. 87. 홍익인간: GPU 가상화 (1) Backend.AI GPU GPUGPU GPU GPUGPU GPU GPUGPU GPU GPUGPU Backend.AI GPU GPU GPU GPU GPU GPU GPUGPU GPU 클러스터 구축 GPU 노드 공유 Backend.AI GPU GPUGPU GPU GPUGPU 클라우드 동적 확장 Cloud ➜ 이게 항상 골머리를 썩게 만듦.
  88. 88. 문제 • GPU 할당이 너무 귀찮다 • GPU 종류가 너무 많다… • 비싼 GPU를 샀는데 노는 경우가 많다. GPU를 어떻게 좀 잘 쓸 수 없을까? • ➜가상화를 해버리자! 홍익인간: GPU 가상화 (1) Backend.AI GPU GPUGPU GPU GPUGPU GPU GPUGPU GPU GPUGPU Backend.AI GPU GPU GPU GPU GPU GPU GPUGPU GPU 클러스터 구축 GPU 노드 공유 Backend.AI GPU GPUGPU GPU GPUGPU 클라우드 동적 확장 Cloud with tf.device('/gpu:0'): ... for d in ['/gpu:2', '/gpu:3']: with tf.device(d): ...
  89. 89. 홍익인간: GPU 가상화 (2) CUDA 기반 라이브러리 CUDA 런타임 nvidia-docker CUDA 드라이버 GPU Backend.AI GPU 가상화 계층 GPU GPU Container Host 사용자 Application NVML nvidia-docker에서 제공하는 경량 가상화의 혜택을 그대로 유지 사용자 코드 변경 필요없음 모든 NGC 이미지 공식 지원 및 사용자 작성 CUDA 코드 실행 가능 컨테이너 단위 GPU 자원 제한 구현
  90. 90. 홍익인간: GPU 가상화 (3) Container 2 Backend.AI GPU Virtualizer Container 1 Container 3 Container 4 nvidia-docker + CUDA Driver PCIE/0 PCIE/1 PCIE/2 PCIE/3 PCIE/4 PCIE/5 PCIE/0PCIE/1PCIE/0 PCIE/0 PCIE/1 PCIE/0 PCIE/1 PCIE/2 /device:GPU:0 /device:GPU:0 /device:GPU:1 /device:GPU:0 /device:GPU:0 /device:GPU:1 /device:GPU:2/device:GPU:1 /device:GPU:0 /device:GPU:1 /device:GPU:2 /device:GPU:3 /device:GPU:4 /device:GPU:5 Host-side view:
  91. 91. 단일 GPU 가상화 구현 및 성능 테스트 어째서 멀쩡한 GPU를 쪼개서 돌렸을 때 통째로 쓰는 것보다 성능이 더 잘 나오는가? • Bottleneck monitoring • CPU-BUS-GPU I/O bottleneck 테스트 • GIL이 전체 시스템에 끼치는 영향 테스트 NUMA node 배치를 고려한 리소스 배치를 위한 python 프로그램 구현 • NUMA node 환경 데이터베이스 구축 • CPU / GPU 할당 시 병목 최소화 홍익인간: fGPU 구현 및 테스트
  92. 92. 오늘 이야기한 내용들 권불10주: 이 바닥은 10주마다 바뀌더라. 우공이산 : 몰랐으니까 산을 옮길 시도를 시작할 수 있었다. 설상가상 : 문제를 해결하면 문제들이 따라온다. 화룡점정 : 눈 찍는게 의외로 중요한 일이다. 홍익인간 : 내 고생을 남도 하게 하지는 말자 앱 프록싱 GPU 가속 지원 멀티 GPU 지원 빌드 도구 / 공개 이미지 저장소 Nvidia-docker v1/v2 지원 PyTorch Follow-up DataParallel Pipeline I/O Co-existing in-container Python adapter 컨테이너 독립적 컨트롤러 구현 GraphQL 기반의 API 오프라인 인스톨러 대규모 배포 시스템 GUI 고가용성 구현 CUDA 드라이버 레이어 추상화 Programmable syscall 필터 구현 앱 관리 콘솔 통합 도구 통곡의 벽. 짠…
  93. 93. 오늘 이야기한 내용들 Photo by © Jaepil Koh 권불10주: 이 바닥은 10주마다 바뀌더라. 우공이산 : 몰랐으니까 산을 옮길 시도를 시작할 수 있었다. 설상가상 : 문제를 해결하면 문제들이 따라온다. 화룡점정 : 눈 찍는게 의외로 중요한 일이다. 홍익인간 : 내 고생을 남도 하게 하지는 말자
  94. 94. 과기정통부 / NIPA에서 주관하는 공개소프트웨어 컨트리뷰톤에 지원해주세요! • Backend.AI 의 개선 및 문서화, 테스트를 함께 해보기! • http://bit.ly/BACKENDAICBT2019 • 저희와 함께 깊게 파이썬 삽을 떠 보실 수 있습니다. • 물론 얕게도 뜰 수 있습니다. 두려워 말고 컴온… • 참가 신청: 8월 5일~25일 마지막으로
  95. 95. 감사합니다. 재미있으셨나요? inureyes inureyes jeongkyu.shininureyes@gmail.com 끝!

×