soscon2017 - backend.ai - joongi kimlablup.ai플랫폼 cloud pay-as-you-go ground bringyour...
TRANSCRIPT
Backend.AI오픈소스기반 AI 인프라프레임워크
Lablup� |��CTO��|��김준기
2017.�10.�25
목차
개발배경
프로젝트소개
프레임워크살펴보기
기술적난제와해결사례
마무리
01
02
03
04
05
Backend.AI 개발배경
오픈소스 AI의 시대
Keras
문제의식
• 오픈소스와클라우드의발달 정말로 AI 하기가쉬워졌을까?
http://kr.vonvon.me/quiz/329,http://kr.vonvon.me/quiz/1633
(사실은삽질삽질삽질삽질삽질을... 으어어)
일단오픈소스한컵붓고..
클라우드살짝얹고..딥러닝을잘부으면...다 되는건가?
신이 AI 분야를만들때
문제의식
• 팩트!
– 오픈소스생태계와이를활용한클라우드인프라가점점빠르게좋아지고있다
– Amazon�Glue�/�GluOn
– Azure�ML�Workbench�/�Studio
– Google�Cloud�Datalab�/�DialogFlow
– Naver�nsml�/�C3 DL
• 문제점
– AI 기반기술의발전속도 >>> 연구·개발자들의 AI�활용능력발전속도 >>>> 인간사회의 AI 대응속도
– 플랫폼이아무리좋아져도 data�locality 문제와규제는근본적으로피해가기어렵다
– 플랫폼이아무리쉬워져도여전히비개발자에겐어렵다
우리에게필요한것
쉽게
– 원래사용하던방식과같도록
– 최소한의환경설정만으로
빠르게
– GPU를잘활용할수있도록
– 원하는만큼연산자원을바로바로
값싸게
– 사용한만큼만지불하도록
– 비용제한에맞춰성능조정을자동으로
어디서나
– 내가가진서버를지금바로활용하거나
– 이도저도귀찮다면클라우드에맡겨서
함께
– 한번만들면누구나똑같이재현하고재사용하도록
– 다른사람들과충돌없이자원을공유할수있도록
연구말싸미 듕귁에 달아 코드로 서르 사맛띠 아니할쌔이런 젼차로 어린 학도가 니르고져 홀빼이셔도 마참내제 뜨들 시러펴디 못할 노미 하니라.
내 이랄 위하야 어엿비 너겨 새로 연구 코드 나누미와과학 공학 노리터를 맹가노니 사람마다 희여 수비니겨날로 쑤메 뼌한킈 하고져 할따라미니라.
2015년에만들려고보니까이걸받쳐줄백엔드가필요하다!지금이야좋은오픈소스가많지만그때만해도... ㅠㅠ
Backend.AI 역사 2015년
https://www.flickr.com/photos/126829363@N08/20944437966/in/album-72157657573435230/
Backend.AI 역사 2015년
Backend.AI 역사 2016년
http://www.hani.co.kr/arti/sports/baduk/734599.html
Backend.AI 역사 2016년
https://www.flickr.com/photos/126829363@N08/29442206464/in/album-72157671256038363/
feat.�이말년씨리즈
Backend.AI 역사 2017년
§ Sorna�→�Backend.AI 브랜드변경
§ 데이터분석및딥러닝을위한안정성강화
§ 단일연산세션에대한다중컨테이너지원준비
§ GPU 고려한스케줄링강화
§ Python�3.6�+�aiotools 기반
§ aiodocker 프로젝트의정식 aio-libs 승격
§ 명령줄인터페이스편의성개선
§ 단일 PC설치가능하도록매뉴얼·코드정비
§ ...
§ v1.0�release!!
Backend.AI�프로젝트소개
Lablup.AI 플랫폼
Cloud Pay-as-you-go GroundBring�YourOwn�Hardware Garden Showcases
계산기반의과학·공학연구, 딥러닝모델훈련및엄청나게간편한코딩교육환경을구축하는Scalable PaaS
자신만의 Lablup.AI서버팜을설치하고수정하고개발할수있는오픈소스버전
Lablup.AI 사용자들을위한문서, 포럼및쇼케이스들
Backend.AI codeonweb.com
Backend.AI 목표
쉽게
– 원래사용하던방식과같도록
– 최소한의환경설정만으로
빠르게
– GPU를잘활용할수있도록
– 원하는만큼연산자원을바로바로
값싸게
– 사용한만큼만지불하도록
– 비용제한에맞춰성능조정을자동으로
어디서나
– 내가가진서버를지금바로활용하거나
– 이도저도귀찮다면클라우드에맡겨서
함께
– 한번만들면누구나똑같이재현하고재사용하도록
– 다른사람들과충돌없이자원을공유할수있도록
쉽게
– Jupyter,�VS�Code,�Atom플러그인제공
– API�key만설정하면끝!
빠르게
– 컨테이너와GPU 기술을결합
– 1초이내에연산세션이뜨도록
값싸게
– 밀리초/KiB 단위까지정밀한자원사용측정
– (향후지원예정!)
어디서나
– 오픈소스버전제공 (github.com/lablup/backend.ai)
– 클라우드버전제공 (cloud.backend.ai)
함께
– 컨테이너를활용한언어별·버전별가상환경제공
– 시스템콜샌드박싱 +�Docker의자원제한고도화
Backend.AI 주요기능
• 빠른시작
– 클라우드가입만으로바로사용가능
– 사용자의요청즉시가상프로그래밍환경생성
• 다양한요구사항충족
– 모든주요프로그래밍언어와런타임지원Python,�R,�Julia,�Octave,�PHP,�Go,�C/C++,�Java,�NodeJS,�Lua,�Haskell,�Rust
– 동일한기계학습라이브러리의여러버전동시지원TensorFlow,�Caffe,�PyTorch,�Keras
• 친숙한사용자경험 +�개발자친화적프레임워크
– 기존연구·개발자들에게익숙한환경과의통합지원 (코드편집기, 웹기반연구노트)Jupyter,�VS�Code,�Atom�Editor,�IntelliJ beta
– $ backend.ai run명령줄및클라우드인터프리터·컴파일러지원
– 개발자를위한 HTTP 기반공용 API 및 언어별 SDK�제공Python,�Javascript,�PHP beta
Backend.AI 구조
Backend.AI Agent
Backend.AIManagerhttps://api.backend.ai
Python
R
TensorFlow
import tensorflow as tfimport matplotlibv1 = tf.Variable(..., name="v1")v2 = tf.Variable(..., name="v2") ...plot(...)
Java
C++
Rust
Internet Backend.AI Agent
Backend.AI Agent
클라우드또는사용자서버팜에서실행
Spark
API
Backend.AI 데모백문이불여일견!
Backend.AI�프레임워크살펴보기
Backend.AI 핵심기술
• 고성능
– 비동기 I/O�기반저지연컨테이너풀링기법 (Python�asyncio�+�Docker)
– 컨테이너에서의머신러닝 GPU�가속지원 (nvidia-docker)
• 다중사용자보안
– 다이나믹샌드박싱 : 가상환경별로특화된시스템콜제어및필터링
– 레거시소프트웨어를위한컨테이너리소스제한강제기술
• 하이퍼스케일링 Hyper-scaling
– On-premise�단독 private�cluster
– Hybrid�cloud�(on-premise�+�public�cloud)
– Public�cloud�(AWS�+�MS�Azure�+�Google�Cloud 조합)
– 계산종류·부하·설정에따라특화된클라우드로사용자요청 routing
Backend.AI 상세구조
>_
Backend.AI�Client�SDKfor�Python
HTTPSWebSocket�/�
REST�/�GraphQL
ZeroMQ
etcdRedisPostgreSQL
(private�protocols)
Backend.AI�Client�SDKfor�Javascript
TensorFlow
Backend.AI Jail
R
Backend.AI Jail
Docker
User�data�files
Cloud�Storage
Backend.AI AgentBackend.AIManagerhttps://api.backend.ai
§ 실시간터미널접속
§ Query�/�batch�/�streaming�mode§ 사용량및세션상태조회§ 멀티미디어출력렌더링
§ 사용자세션인증
§ 실시간세션별자원사용량통계§ 자동 rolling�upgrade
§ 프로그래밍할수있는시스템콜샌드박스
§ 코어개수, 메모리등컨테이너자원제한
§ 사용자별가상폴더
§ 공유·예제 dataset 제공
§ 코드실행요청 routing
§ 입출력중계§ Agent�auto-scaling§ Hybrid�cloud 지원
기술적난제와해결사례(삽질기)
주요기술적삽질과도전들
• Python�asyncio 프로그램이멀티코어활용하게하기
– aiotools로 멀티쓰레드·멀티프로세스구조로이벤트루프사용하기
– etcd�v3를 asyncio 기반으로사용하기
• 프로그래밍가능한 syscall�샌드박스만들기
• Docker�컨테이너 CPU 개수제한하기
• 유연하고효율적인 GraphQL 서버구현하기
Python�asyncio 프로그램이멀티코어활용하게하기
• asyncio�event�loop는 쓰레드또는프로세스당 1개씩만있어야함
• Backend.AI�manager와 agent에서중복되는관리코드가많고버그도많았음
• aiotools�라이브러리독립 PyCon�KR�2017�발표
– Python�3.6의 async�generator�및 이에기반한 async�context�manager�활용
– 기반구조에대한재사용성증대
– 복잡한 Backend.AI�로직없이단독유닛테스트
– https://github.com/achimnol/aiotools
• aiotools�도입효과
– 안정적인멀티쓰레드및멀티프로세스지원
– UNIX�signal�race�condition�등 많은버그발견및수정
aiotools�작동구조
extra_procindividual event loop per worker
aiotools.start_server
join
fork
user main exit
user main enter
worker enter worker enter
extra_proc
worker exit worker exit
etcd3�+�asyncio
• etcd
– Raft�분산결정알고리즘에기반한 strongly-consistent�key-value�storage
– Go�언어기반으로 ZooKeeper�등에비해쉬운설치와배포가장점
– 클라우드및컨테이너최적화 OS인 CoreOS�팀에서개발
– v2와 v3는 완전히다른 (호환되지않는)�API와 기능제공
• Python�용 클라이언트현황
– v2:�python-etcd,�python-aio-etcd
– v3:�python-etcd3�(2016년 9월 v0.1�릴리즈),aioetcd3�(2017년 8월개발시작)
– 내부에서 gRPC�라이브러리를사용하는데....
import를 먼저하고 fork하면 hang-up�[X]
fork한 후 import�해야함 [O]
프로그래밍가능한 syscall 샌드박스만들기
• Backend.AI�Jail�프로젝트
– 불편한 apparmor�(당시 Docker의 기본보안레이어)를 ptrace�+�seccomp�기반으로대체
– 프로세스개수제한,�시스템콜인자조작및검사 (예:�self-kill�방지)�등 programmable�rule�구현
– Lablup에서는 2016년 1월적용 /�Docker에서 2016년 2월부터유사한방식으로보안레이어변경
– https://github.com/lablup/backend.ai-jail
Docker container aka “Backend.AI kernel”
jail <policyname> /path/to/runtime /path/to/REPLscript
Runtime Process (Python, Julia, R, bash, NodeJS, etc.)
User code
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND1 work 20 0 8628 784 688 S 0.0 0.0 0:00.01 sh7 work 20 0 188664 3628 2992 S 0.0 0.2 0:00.39 jail
94 work 20 0 179552 14396 7516 S 0.0 0.7 0:00.10 python
Docker�컨테이너 CPU�개수제한하기
• 2016년 11월 GDG�DevFest�코드랩
– 56코어서버면 1인당코어 4개정도씩해서코어좀공유하더라도 40명정도는충분하겠지?
Docker�컨테이너 CPU�개수제한하기
• 원인분석
– 대부분연산용라이브러리는시스템코어개수를알아내기위해다음활용
ü자체적으로지정한환경변수 (OMP_NUM_THREADS, OPENBLAS_NUM_THREADS, NPROC)üsysconf(_SC_NPROCESSORS_ONLN)리턴값
– 하지만,�Docker�container�create�API의 CPU�set�인자는 affinity�mask만 설정
ü/proc/cpuinfo,�sysconf등은그대로...
ü결과는 thread�개수폭발!!�💥💥💥
• 해결책
– Docker�image�label로 내부에사용된라이브러리에따라필요한코어개수지정하는환경변수기록
– LD_PRELOAD환경변수로 libc의 sysconf함수를 affinity�mask를 읽는버전으로바꿔치기
유연하고효율적인 GraphQL 서버구현하기
• GraphQL�:�Facebook에서개발한 API 프로토콜개발용명세
– 미리정의한 schema에맞춰 query를 날리면 query의 구조그대로 JSON 응답생성
– URL 자체가 API 구조와엮이는 REST와 달리단일 endpoint 사용
– 각 field와 object를 실제로어디에서어떻게가져올것인가(resolving)는 온전히개발자몫!
• 문제점
– RDBMS와붙였을때너무너무많은 SQL�query 발생
– 라이선스이슈 (BSD+Patents)� 약 한달전해결! (MIT+OWFa)
http://graphql.org
API�버전호환성유지가용이함
유연하고효율적인 GraphQL 서버구현하기
• 해결책
– Batching을 위해 DataLoader�사용!
ü여러 resolve()메소드에서각각다른 object�ID로 loader.load()를호출하면,lazy�evaluation을 통해 "SELECT … WHERE id IN (…)" query�1번으로줄일수있다
– Python�asyncio 용으로도잘나와있음 (https://github.com/syrusakbary/aiodataloader)
• 또다른문제점
– Batching을 하기때문에같은 WHERE조건을가진경우에만적용가능
– 필터링조건을자유롭게추가할수있어야유연한 API를 만들수있음
• 또다른해결책
– DataLoader를 조건식별로생성및캐시해주는 DataLoaderManager 제작
– functools.lru_cache()처럼조건 argument를 이용한 DataLoader object�cache 사용
마무리
Backend.AI 프로젝트참여방법
• https://github.com/lablup/backend.ai
– Backend.AI 개발에참여하실분모십니다! (오픈소스기여 or�래블업지원!)
ü삽도같이뜨면낫겠죠?🤗
– 2017년 10월 v1.0 릴리즈
ü (드디어기다리고기다리던) 설치및개발매뉴얼제공!
• 향후로드맵
– 스케줄러기능강화
üHybrid�cloud 및 on-premise�연동
– 오토스케일링기능강화
ü장시간연산세션을위한 scale-in�protection
ü cpu/memory/gpu�slot 여유용량에따라 cold/hot�instance�gruop 운영
THANK�YOU질문이나채용문의는 [email protected]으로!