머신러닝 및 데이터 과학 분야의 컴퓨팅 수요는 해가 갈수록 급증하고 있습니다. 이와 더불어 분산처리 기술, 데이터 파이프라이닝 및 개발 환경 스택 관리 등의 관련된 다양한 이슈들 또한 엄청나게 늘어나고 있습니다. 머신러닝 모델의 기하급수적인 모델 복잡도 증가 추세와 마찬가지로, 모델 학습을 위한 환경 관리 또한 갈수록 복잡도가 높아지는 추세입니다.
이 세션에서는 이러한 문제를 해결하기 위해 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 )
5. 현대 과학 연구와 개선
• 기술은 21세기, 시스템은 20세기, 학계는 19세기
• 인간이 관여하는 분야의 발전 속도가 그렇지 않은 분야의 발전 속도를 따라가지 못하는 경향
• 학계와 업계, 사회의 간극
PyCon KR 2015 발표 요약
6. 연구말싸미 듕귁에 달아 코드로 서르 사맛띠 아니할쌔 이런 젼차로 어린 학도가
니르고져 홀빼이셔도 마참내 제 뜨들 시러펴디 못할 노미 하니라.
내 이랄 위하야 어엿비 너겨 새로 연구 코드 나누미와 과학 공학 노리터를 맹가노니
사람마다 희여 수비니겨 날로 쑤메 뼈한크이 하고져 할따라미니라.
• 재현 가능한 데이터 연구 플랫폼
• 논문용 코드로부터 실제 서비스까지 확장을 지원하는 클라우드 샌드박스 서비스
현대 과학 연구와 개선 PyCon KR 2015 발표 요약
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)
들어가기 전에 몇가지
짜 잔
…발표 끝날 때 쯤이면 ‘짜잔’이 ‘짠’하게 보이실 겁니다.
24. Baremetal
VM VM
• 가상 머신 (Virtual Machine)
• 하드웨어 레벨의 가상화 솔루션
• 독립된 운영체제 및 환경
• 베어메탈의 운영체제에 영향 받지 않음
• 가상화된 하드웨어를 VM 내에 제공
• 장단점
• 완벽하게 격리된 환경 / 여러 OS 실행
• 성능 저하
29. Baremetal
VM VM
OS
Container layer
Containers Containers
OS
Container layer
• 컨테이너
• 호스트 운영체제 커널을 공유
• 커널을 제외한 부분들을 격리
• 구현
• Container layer: LXC / runC / Jail…
• Namespace 기반의 가상화
• 보안 정책 및 컨트롤그룹 앨리어싱
• seccomp / cgroup
31. Cloud
클라우드 매니저
• 클러스터에 VM 또는 스토리지를 생성, 삭제, 배치, 관리하는 역할 담당
• IaaS (Infrastructure as a Service) 구축을 위한 소프트웨어
컨테이너 관리 솔루션 (컨테이너 오케스트레이터)
• 컨테이너를 생성, 삭제, 배치, 관리하는 역할 담당
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 유저 권한으로 실행됨
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 지원.
리스트에 없는 언어의 경우 비동기 지원 라이브러리들이 있음
36. 필요한 것
• 샌드박스 기반의 코드 실행 서비스
• 클라우드 기반 유저 인터페이스
• 소유자 / 그룹 / 커뮤니티 / 노트
• 공유시스템
• 서비스를 사용하기 위한 웹/앱
우공이산: 기본 설계하기
기본 테크스택 (2015 AUG. PyCon KR)
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. 우공이산: 기본 설계하기
>_
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)
40. 목표 (2015년)
• 머신러닝: Caffe와 Theano를 잘 돌려주자!
• 속도가 필요한 연구들: Julia도 돌리자!
• MATLAB 사용자: Octave를 돌리자!
• ABM 기반의 뉴럴넷도 하니까: Repast도 돌리자!
• (생물 뉴런 모델링을 위해) NEURON 도 돌려주자!
이정도면 다가올 딥러닝 시대에 대한 준비는 완벽!
우공이산: TensorFlow의 등장
일거리 산 ➜
완!벽!합니다!
41. TensorFlow (2015.12~): 머신러닝 편의성 개선에 큰 역할
• GPU 가속 지원 발표
• 초기 버전에서는 CPU 지원
• 버전업에 따라 1GPU ➜ 멀티 GPU 지원 ➜ 멀티 노드 지원이 계속 추가…
• GPU 지원을 추가하자!
• Nvidia GPU 를 컨테이너에 붙이자!
• nvidia-docker
우공이산: TensorFlow의 등장 (1)
GPU 가속 지원 멀티 GPU 지원
일거리 산 ➜
42. Speed is everything!
• 하위 호환성은 안녕 – 1.3 / 1.4, 1.9 / 1.10, 1.12 / 1.13,4…
• 빌드 체인도 안녕
• 빌드 체인도 매번 바뀌고
• 빌드 방법도 매번 바뀌고
• 빌드 도구도 매번 바뀐다…
• Protobuf, bazel …
우공이산: TensorFlow의 등장 (2)
GPU 가속 지원 멀티 GPU 지원
일거리 산 ➜
빌드 도구 / 공개 이미지 저장소
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 지원
46. Parallelism
• 데이터 병렬화Data parallelism
• 데이터 파이프라인 및 forward/backward pass 병렬화
• MPI 의 parallelism과 유사
• 모델 병렬화Model parallelism
• 모델을 잘라서 처리함
• 단일 GPU로 커버하기 힘든 경우 사용
설상가상: 병렬화 지원 (1)
GPU 가속 지원 멀티 GPU 지원
일거리 산 ➜
빌드 도구 / 공개 이미지 저장소
Nvidia-docker v1/v2 지원
PyTorch Follow-up
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
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. 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
컨테이너 독립적 컨트롤러 구현
일거리 산 ➜
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. 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. 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
컨테이너 독립적 컨트롤러 구현
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
61. Python 기반의 서버 어플리케이션 배포
• 오프라인일 때는?
고려할 점
• python 런타임
• 네트워크 억세스를 사용하지 않는 pip
• 설치 환경에 따라 달라지는 설정 변경
• 대규모 설치 요구 환경에서의 자동화
화룡점정: 오프라인 환경 (1)
Photo taken from Error message of Google Chrome
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. 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
오프라인 인스톨러
대규모 배포 시스템
65. RestructuredText 기반의 문서화
• 코드 주석 기반 + 문서 고유 설정
• Readthedocs를 통한 배포 파이프라인 구축
폴리글랏 기반의 프로젝트 문서화
• ReST 플러그인들이 다양하게 존재하지만 잘
돌아가는게 없음
• 예) JSDoc support by Mozilla – 2017년 마지막
업데이트
• 결론:
• Python: ReST + Sphinx, JavaScript: JSDoc
화룡점정: 문서화
https://docs.backend.ai
66. RestructuredText 기반의 문서화
• 코드 주석 기반 + 문서 고유 설정
• Readthedocs를 통한 배포 파이프라인 구축
폴리글랏 기반의 프로젝트 문서화
• ReST 플러그인들이 다양하게 존재하지만 잘
돌아가는게 없음
• 예) JSDoc support by Mozilla – 2017년 마지막
업데이트
• 결론:
• Python: ReST + Sphinx, JavaScript: JSDoc
화룡점정: 문서화
JSDoc 기반의 문서화
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. 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. 앱
• 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. 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. 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. 앱
• 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. 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.
76.
77.
78. 허브
• 전체 클러스터 관리용
• Django + lit-element
• Console-server 기반의
Manager 프록시
• 여러 console-server들을
도메인별로 배포
• 클러스터의 Protected
multi-tenancy 지원
79. 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
고가용성 구현
80. 기존
• 클라이언트 (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)
81. 앱 프록싱
문제
• 수많은 앱들마다 전부 외부 아답터를 지원해 줄 수가 없다!
• 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)
82. 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)
83. 화룡점정: 웹소켓 프록시 터널링 (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)
84. 화룡점정: 웹소켓 프록시 터널링 (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
폐쇄망
85. 앱 프록싱
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. 앱 프록싱
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개월이면 어떻게 될 것 같은데…
87. 앱 프록싱
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 필터 구현
……
88. 앱 프록싱
그렇게
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 필터 구현
91. 문제
• 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):
...
92. 홍익인간: GPU 가상화 (2)
CUDA 기반 라이브러리
CUDA 런타임
nvidia-docker
CUDA 드라이버
GPU
Backend.AI GPU 가상화 계층
GPU GPU
Container
Host
사용자 Application
NVML
nvidia-docker에서 제공하는 경량
가상화의 혜택을 그대로 유지
사용자 코드 변경 필요없음
모든 NGC 이미지 공식 지원 및
사용자 작성 CUDA 코드 실행 가능
컨테이너 단위 GPU 자원 제한 구현
94. 단일 GPU 가상화 구현 및 성능 테스트
어째서 멀쩡한 GPU를 쪼개서 돌렸을 때 통째로 쓰는 것보다 성능이 더 잘 나오는가?
• Bottleneck monitoring
• CPU-BUS-GPU I/O bottleneck 테스트
• GIL이 전체 시스템에 끼치는 영향 테스트
NUMA node 배치를 고려한 리소스 배치를 위한 python 프로그램 구현
• NUMA node 환경 데이터베이스 구축
• CPU / GPU 할당 시 병목 최소화
홍익인간: fGPU 구현 및 테스트
95. 오늘 이야기한 내용들
권불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 필터 구현
앱 관리 콘솔 통합 도구
통곡의 벽. 짠…
97. 과기정통부 / NIPA에서 주관하는 공개소프트웨어 컨트리뷰톤에 지원해주세요!
• Backend.AI 의 개선 및 문서화, 테스트를 함께 해보기!
• http://bit.ly/BACKENDAICBT2019
• 저희와 함께 깊게 파이썬 삽을 떠 보실 수 있습니다.
• 물론 얕게도 뜰 수 있습니다. 두려워 말고 컴온…
• 참가 신청: 8월 5일~25일
마지막으로