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.

[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기

7,255 views

Published on

빅데이터를 위한 분산 딥러닝 플랫폼 만들기

Published in: Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기

  1. 1. 빅데이터를 위한 Distributed Deep Learning 플랫폼 만들기 유승현 Search System
  2. 2. CONTENTS Deep Learning 플랫폼 탄생 배경 새로운 요구사항 설계 및 검토 C3DL 기반으로 만들기
  3. 3. Deep Learning 플랫폼 탄생 배경
  4. 4. Deep Learning 플랫폼 초기 요구사항 다수의 연구원들이 GPU자원을 사용하고 싶어함 제한된 GPU 자원
  5. 5. Deep Learning 플랫폼 초기 요구사항 Caffe, TensorFlow, Theano, Torch Deep Learning Frameworks
  6. 6. C3DL 기반 기술 ­ Docker 다양한 딥러닝 프레임워크를 깔끔하게 지원 가능 패키지 표준화 하면서 동시에 개인 환경에 맞도록 셋팅 가능 Why Docker? naver/c3_dl-caffe naver/c3_dl-tensorflow user/pytorch naver/c3_dl-base
  7. 7. C3DL 기반 기술 ­ Docker GPU isolation 지원 NVIDIA-Docker https://github.com/NVIDIA/nvidia-docker
  8. 8. C3DL 기반 기술 ­ Hadoop YARN A framework for job scheduling and cluster resource management. Hadoop YARN https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html
  9. 9. DL Application C3 Deep Learning Cluster Zookeeper Dev. Environment Dev. Server Resource Manager YARN Node Manager YARN Docker Registry C3 HDFS Storage YARN with GPU Scheduling Node Manager YARN Node Manager YARN . . . C3 Distributed Shell NVIDIA Docker GPU Device ID Manager Input Output DL App Toolset dlapp-launcher dlapp-shell dlapp-run https://deview.kr/2016/schedule#session/170
  10. 10. 새로운 요구사항
  11. 11. Deep Learning Workflow Batch Serving Streaming Datasets Training Model Inference
  12. 12. 새로운 요구사항 Distributed inference - training이 완료된 모델로 inference를 하고 싶다. - 배치 작업, 오래 걸리는 작업들은 2~3개월 필요 사례: 웹 이미지 adult test Distributed inference 를 구현했는데, GPU할당만 해주면 돌릴께요
  13. 13. 새로운 요구사항 Distributed training - 여러 장비에서 GPU할당 받아서 training을 하고 싶다 - 사실상 Distributed tensorflow 사용하고 싶다는 문의 Distributed tensorflow 사용하고 싶어요
  14. 14. 새로운 요구사항 Serving (long live) 웹서버를 실행해서 request, response 방식으로 처리 1000시간 넘게 실행하고 있네?? 서버를 계속 실행해두면 되겠군.
  15. 15. 새로운 요구사항 CPU만 사용해서 실행 - training이 끝난 모델을 사용해서 inference만 하고 싶은데, CPU가 가성비가 더 좋은 경 우가 있음. - 단, 기존 C3DL와 같은 방식으로 사용하고 싶다. DL Application
  16. 16. Distributed Deep Learning 솔루션 검토 Tensorflow on Spark - https://github.com/yahoo/TensorFlowOnSpark DSSTNE - https://github.com/amzn/amazon-dsstne Caffe on Spark - https://github.com/yahoo/CaffeOnSpark Deeplearning4j on spark - https://deeplearning4j.org/spark torch-distlearn - https://github.com/twitter/torch-distlearn Distributed Keras - https://github.com/cerndb/dist-keras Apache SINGA - http://www.comp.nus.edu.sg/~dbsystem/singa/ BigDL - https://github.com/intel-analytics/BigDL Distributed Deep Learning 솔루션
  17. 17. Distributed Deep Learning 솔루션 검토 Tensorflow On Spark http://yahoohadoop.tumblr.com/post/157196317141/open-sourcing-tensorflowonspark-distributed-deep
  18. 18. Distributed Deep Learning 솔루션 검토 DSSTNE Amazon ECS SparkAmazon ECS GPU task GPU slave CPU https://aws.amazon.com/ko/blogs/big-data/generating-recommendations-at-amazon-scale-with-apache-spark-and-amazon-dsstne/
  19. 19. 설계 및 검토
  20. 20. YARN application 변경 한개의 JOB에 한개의 container만 실행 BATCH JOB이라고 가정하고 만들어져 있음 기존 C3DL Distributed - 여러 container 동시 실행할때 장비 다운등 에러처리 Serving - Long-live JOB도 지원해야함 변경 & 구현 해야하는것
  21. 21. YARN application 개발 Resource Manager, Application Master, Node Manager, Container … YARN API 예외 처리 Container가 죽었을때…, 장비가 다운되었을때.. 예제 프로그램이 1000줄 이상… Distributed Shell
  22. 22. Apache Slider Slider is a YARN application to deploy existing distributed applications on YARN https://deview.kr/2016/schedule#session/168 Apache Slider 를 이용한 멀티테넌트 하둡 클러스터
  23. 23. Apache Slider - 쉽다
  24. 24. Apache Slider ­ container 구분 몇번째 container 인지 구분해줌 app_container_tag Slider Application Master Agent (app_container_tag=1) Agent (app_container_tag=2) app app
  25. 25. Apache Slider ­ container 구분 몇번째 container 인지 구분해줌 app_container_tag Slider Application Master Agent (app_container_tag=1) Agent (app_container_tag=2) app app Agent (app_container_tag=1) app
  26. 26. Apache Slider - serving Availability - Application 자동으로 재시도 Flexibility - container 개수를 증가/감소 시킬수 있음 원래 계속 실행하는 작업을 위해 만들어 졌음
  27. 27. Apache Slider ­ contributor https://issues.apache.org/jira/browse/SLIDER-1239 https://issues.apache.org/jira/browse/SLIDER-494 Batch 모드 개발 문서가 부족함 옆에 물어봄…
  28. 28. Apache Slider ­ contributor https://issues.apache.org/jira/browse/SLIDER-1239 https://issues.apache.org/jira/browse/SLIDER-494 Batch 모드 개발 문서가 부족함 옆에 물어봄…
  29. 29. Apache Slider ­ contributor https://issues.apache.org/jira/browse/SLIDER-1239 https://issues.apache.org/jira/browse/SLIDER-494 Batch 모드 개발 문서가 부족함 옆에 물어봄…
  30. 30. REST API Resource Manager YARN DL App Toolset dlapp-launcher
  31. 31. REST API Resource Manager YARN DL App Toolset REST API Server
  32. 32. REST API REST API 선택한 이유 버그 수정, 배포시 빠르게 대응 가능 REST API를 공개하면 사용자가 직접 응용이 가능
  33. 33. REST API 성능은 고려사항이 아님 à 빨리 개발 REST-API에 대한 구현이 직관적임 Swagger 문서화 Flask-RESTPlus선택
  34. 34. REST API Flask-RESTPlus swagger https://swagger.io/
  35. 35. CPU만 사용 CPU만 사용하고 싶음, C3DL에 제출 요구사항
  36. 36. C3DL 기반으로 만들기
  37. 37. DL(Deep Learning) App 구현 Concept • DL App 구성 요소 • Deep Learning Framework 환경 (Caffe, TensorFlow …) • User Program ( Source Code ) • Input Data • Output Data Input Output DL Framework 환경 Source Code
  38. 38. DL(Deep Learning) App 구현 Concept /User_Dev_Workspace /DL_App_Workspace Deep Learning App Input Output User Container
  39. 39. Distributed API 설계 전략 쉬운 API 자유도 높은 API
  40. 40. Distributed API 설계 전략 - 자유도 높은 API { "username": "testuser", "queue": "test", "worker": { "config": [ { "sms": { "employee_id": "kr00000" }, "docker": { "expose_tcp_port": [ 6006 ], "workdir": "/root/c3_workspace", "image": "naver/c3_dl-tensorflow", "args": "", "command": "./run.sh", "registry": "dregistry.navercorp.com" }, "user_package_uri": "hdfs://c3/user/c3dl_admin/user-package/testuser/20170918162225.651323.tar.gz", "data": { "to_hdfs": [ {
  41. 41. Distributed API 설계 전략 - 쉬운 API { "username": "test1", "worker_count": 2, "ps_count": 1, "distributed_tensorflow": true, "appname": "distributed_training", "queue": "test", "docker": { "image": "naver/c3_dl-tensorflow:r1.2", "workdir": "/root/c3_workspace", "command": "python cifar10_main.py", "registry": "dregistry.navercorp.com", "args": "--data-dir=hdfs://c3/user/test1/cifar-10-data --job-dir=hdfs://c3/user/test1/model_dir --num-gpus=1 --train- steps=100" }, "user_package_uri": "hdfs://c3/user/test1/cifar10_estimator.tar.gz”, "resource": { "memory_mb": 15360, "vcores": 1, "gcores": 1 } }
  42. 42. 분산 처리를 위한 구현 Concept /User_Dev_Workspace User /DL_App_Workspace Deep Learning App Input Output Containe r/DL_App_Workspace Deep Learning App Input Output Containe r /DL_App_Workspace Deep Learning App Input Output Containe r /User_Dev_Workspace /User_Dev_Workspace
  43. 43. Distributed Inference 대용량 배치 작업, 오래 걸리는 작업들은 2~3개월 필요 Map-reduce 처럼 input, output만 지정하면 자동으로 나누어졌으면 좋겠다 GPU자원이 남으면 최대한 사용하고 싶다 요구사항
  44. 44. Distributed Inference /User_Dev_Workspace User /DL_App_Workspace DL App Input Output /DL_App_Workspace DL App Input Output /DL_App_Workspace DL App Input Output /input_dir |- data_01 |- data_02 |- data_03 /output_dir |- out_01 |- out_02 |- out_03
  45. 45. Distributed Inference /User_Dev_Workspace User /DL_App_Workspace DL App Input Output /DL_App_Workspace DL App Input Output /DL_App_Workspace DL App Input Output /input_dir |- data_01 |- data_02 |- data_03 /output_dir |- out_01 |- out_02 |- out_03
  46. 46. Distributed Inference 여러 디렉토리에서 입력을 받고 싶은 경우에는 직접 작성 직접 INPUT을 작성할 수도 있음 /DL_App_Workspace DL App Input Output /input_dir |- data_01 |- data_02 |- data_03 /output_dir |- out_01 |- out_02 |- out_03Input /input_dir2 |- data_01 |- data_02 |- data_03
  47. 47. Distributed Inference ­ example json { "partition_count": 12, "data": { "from_hdfs": [ { "excludes": ["_complete"], "type": "dironly", "input_path": "data", "hdfs": "/user/blog/blogdatal/2017" }], "to_hdfs": [ { "hdfs": "/user/blog/prediction/2017/result- {{ partition_num }}", "output_path": "result", "overwrite": false }], "auto_partition": true, "format": "%2d" } } { "data_list": [ { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/01", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-01", "output_path": "result", "overwrite": false }] }, { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/02", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-02", "output_path": "result", "overwrite": false}] }, …
  48. 48. Distributed Inference ­ example json { "partition_count": 12, "data": { "from_hdfs": [ { "excludes": ["_complete"], "type": "dironly", "input_path": "data", "hdfs": "/user/blog/blogdatal/2017" }], "to_hdfs": [ { "hdfs": "/user/blog/prediction/2017/result- {{ partition_num }}", "output_path": "result", "overwrite": false }], "auto_partition": true, "format": "%2d" } } { "data_list": [ { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/01", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-01", "output_path": "result", "overwrite": false }] }, { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/02", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-02", "output_path": "result", "overwrite": false}] }, …
  49. 49. Distributed Inference ­ example json { "partition_count": 12, "data": { "from_hdfs": [ { "excludes": ["_complete"], "type": "dironly", "input_path": "data", "hdfs": "/user/blog/blogdatal/2017" }], "to_hdfs": [ { "hdfs": "/user/blog/prediction/2017/result- {{ partition_num }}", "output_path": "result", "overwrite": false }], "auto_partition": true, "format": "%2d" } } { "data_list": [ { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/01", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-01", "output_path": "result", "overwrite": false }] }, { "from_hdfs": [{ "hdfs": "/user/blog/blogdata/2017/02", "input_path": "data"}], "to_hdfs": [{ "hdfs": "/user/blog/prediction/2017/result-02", "output_path": "result", "overwrite": false}] }, …
  50. 50. Distributed Inference 스케쥴링 "partition_count": 5, "concurrency": 2 Task 2 Task 1 Task 3 Task 4 Task 5
  51. 51. Distributed Inference 스케쥴링 "partition_count": 5, "concurrency": 2 Task 2 Task 1 Task 3 Task 4 Task 5
  52. 52. Distributed Inference 스케쥴링 "partition_count": 5, "concurrency": 2 Task 2 Task 1 Task 3 Task 4 Task 5 Task ATask B
  53. 53. Distributed Inference 스케쥴링 "partition_count": 5, "concurrency": 2 Task 2 Task 3 Task 4 Task 5 Task A Task B
  54. 54. Distributed Inference 스케쥴링 GPU자원이 남을 때 많이 사용가능 장비 장애 발생할 때 자동으로 재시작 사용자가 얻는건
  55. 55. Distributed Training Distributed Tensorflow 실행하게 해주세요 Tensorflow on Spark 지원 해주세요 요구사항
  56. 56. Distributed Tensorflow 실행 https://cloud.google.com/ml-engine/docs/concepts/trainer-considerations
  57. 57. Distributed Tensorflow 실행
  58. 58. Distributed Tensorflow 실행
  59. 59. Distributed Tensorflow 실행
  60. 60. Distributed Tensorflow 실행 { "environment": "cloud", "cluster": { "worker": ["worker1.example.com:2222, "worker2.example.com:2222""], "ps": ["ps0.example.com:2222"], "master": ["worker0.example.com:2222"] }, "task": {"index": 0, "type": "master"} } TF_CONFIG
  61. 61. Distributed Tensorflow 실행 Distributed Tensorflow 실행전에 실행하는 host, port를 알아야함 필요한것 cluster 어디에서 실행될지 알 수 없음
  62. 62. Docker Overlay Network Distributed Tensorflow 실행전에 hostname을 알 수 있음 Hostname을 고정 Network isolation 다른 distributed deep learning도 지원 가능
  63. 63. Docker Overlay Network HOST1 10.113.183.76 HOST2 10.2.83.112
  64. 64. Docker Overlay Network HOST1 10.113.183.76 HOST2 10.2.83.112 $ docker network create testnet --driver=overlay --subnet=192.168.0.0/16 Overlay name: testnet, Subnet: 192.168.0.0/16
  65. 65. Docker Overlay Network HOST1 10.113.183.76 HOST2 10.2.83.112 $ docker run -it --net testnet -h worker1 --network-alias worker1 Overlay name: testnet, Subnet: 192.168.0.0/16 worker1 192.168.0.2
  66. 66. Docker Overlay Network HOST1 10.113.183.76 HOST2 10.2.83.112 $ docker run -it --net testnet -h worker2 --network-alias worker2 Overlay name: testnet, Subnet: 192.168.0.0/16 worker1 192.168.0.2 worker2 192.168.0.3
  67. 67. Distributed Tensorflow 실행중 Overlay Node Manager Node Manager Slider Application Master YARN Container YARN Container YARN Container YARN Container
  68. 68. 변경된 C3DL 구조 Resource Manager YARN dlapp-submit /apps/submit Resource Manager YARN
  69. 69. 삽질 & 팁
  70. 70. Docker Overlay Network 설정 삽질.. Zookeeper 여러개 설정은 ‘,’ 를 사용해서 zk://zk01.example.com:2181,zk02.example.com:2181,zk03.example.com:218 1 --cluster-store 설정
  71. 71. Docker Overlay Network 설정 삽질.. • --add-host --ip • IP가 중복되면 안되서 IP관리가 필요함 • --link 옵션을 • --add-host와 비슷하게 동작하는데, deplicated 된 옵션 Docker 문서를 잘읽자
  72. 72. Distributed Tensorflow 삽질… PS는 자동 종료가 안되서 수동으로 종료해주어야함 SERVICE type으로 설정하면 다른 BATCH 작업 종료후에 종료 Parameter Server는 종료 안됨 인터넷에 있는 Distributed Tensorflow 예제를 실행해 볼때 버전 확인 Tensorflow 버전이 빠르게 변하기 때문에 예전 버전의 예제들도 있음 Tensorflow 예제 코드의 버전 확인
  73. 73. Slider 개발 팁 stdout, stderr 출력 로그는 재시작할때마다 로그가 리셋됨. {app_log_dir} 밑에 두는게 좋음 Log는 stdout, stderr 사용 안하는게 좋음 Install, start, stop, status는 모두 구현 status 무조건 0을 리턴하도록 구현해두어서 종료가 안되는 문제 있었음
  74. 74. To Do Resource Scheduling 고도화 예약기능 짧은 시간동안 많은 GPU사용 성능 개선 Container 재활용 Tensorflow외에 다른 Distributed training 지원
  75. 75. Thank you Merci bien

×