조대 협의 블로그 : : ' CloudML ' 태그 의 글 목록 
 total 8 , 457 , 493 
 yesterday 4 , 957 
 ' CloudML ' 에 해당 되 는 글 2 건 
 2017 . 06 . 26 텐서 플로우 에서 모델 export 시 그래프 를 다시 그리 는 이유 
 2017 . 06 . 22 얼굴 인식 모델 을 만들 어 보 자 # 4 - 클라우드 를 이용 하 여 학습 시키 기 
 텐 서 플로우 에서 모델 export 시 그래프 를 다시 그리 는 이유 
 빅 데 이타 / 머신 러닝 | 2017 . 6 . 26 . 23 : 03 | Posted by 조대 협 
 텐 서 플로우 에서 checkpoint 와 saved model 의 차이 와 
 모델 을 export 할 때 그래프 를 다시 그리 는 이유 
 Check point vs Saved model 
 텐 서 플로우 튜토리얼 들 을 보 면 모델 을 저장 하 고 리스 토어 하 는데 , check point 를 사용 하 도록 가이드 하 고 있 다 . 
 그런데 , Tensorflow Serving 이나 CloudML 등 에 학습 된 모델 을 올려서 inference 를 하 고자 할 때 는 check point 파일 을 사용 하 지 않 고 , 별도 로 모델 을 Saved model 로 export 하 여 사용 한다 . 그렇 다면 check - point 와 saved model 의 차이 가 무엇 일까 ? 
 check - point 를 학습 을 하 다가 학습 내용 을 중간 에 저장 하 고 나중 에 학습 을 연달 아서 하 기 위한 용도 로 check point 에 의해서 저장 되 는 값 을 모델 그래프 의 변수 ( Variable ) 만 이 저장 된다 . 모델 의 그래프 자체 는 저장 되 지 않 는다 . 그래서 check - point 를 리스 토어 하 는 예제 를 보 면 , 다시 그래프 를 코드 로 그 정의 한 후 에 , check - point 에 저장 된 데 이타 를 리스 토어 하 는 것 을 볼 수 있 다 . 
 Saved model 은 inference 를 위해서 모델 을 저장 하 는 것 으로 , check - point 와 는 다르 게 변수 뿐 만 아니 라 모델 의 그래프 도 같이 저장 한다 . Tensorflow serving 이나 cloud ml 등 에서 inference 를 위해서 는 당연히 변수 뿐 아니 라 모델 의 그래프 도 필요 하 기 때문 에 이 를 같이 넘기 는 것 이 다 . 
 모델 을 Export 할 때 , 그래프 를 다시 그리 는 이유 는 ? 
 다음 은 모델 을 export 하 는 코드 의 예제 인데 , 코드 를 보 면 모델 을 위한 그래프 를 다시 정의 하 는 것 을 볼 수 있 다 . 
 # Define API inputs / outputs object 
 for key , val in inputs . iteritems ( ) : 
 for key , val in outputs . iteritems ( ) : 
 tf . add _ to _ collection ( ' inputs ', json . dumps ( inputs _ name ) ) 
 tf . add _ to _ collection ( ' outputs ', json . dumps ( outputs _ name ) ) 
 # Restore the latest checkpoint and save the model 
 input _ signatures , output _ signatures , 
 signature _ constants . PREDICT _ METHOD _ NAME ) 
 build . add _ meta _ graph _ and _ variables ( 
 build . save ( ) 
 기존 의 학습 부분 에 그래프 가 그려져 있 는 데 도 불구 하 고 , export 할 때 그래프 를 다시 그려서 저장 하 는 이유 는 , training 용 그래프 와 inference 용 그래프 가 다르 기 때문 이 다 . 
 training 그래프 는 , 중간 중간 test ( evaluation ) 에 사용 되 는 코드 가 들어간다 . 즉 test 코드 가 들어간다 . 
 또는 training 그래프 는 dropout 계층 이 있 지만 , inference 에 는 dropout 계층 이 필요 없 기 때문 에 그래프 가 달라진다 . 
 데 이타 를 피딩 하 는 경우 에 도 training 에서 는 속도 를 위해서 placeholder 를 없애 고 바로 Queue runner 에서 데 이타 를 읽 어서 모델 에 읽 도록 할 수 도 있 지만 , inference 에 는 queue runner 를 통해서 데 이타 를 읽 는 것 이 아니 라 예측 을 할 값 을 입력 받 아야 하 기 때문 에 , 이 경우 에 는 placeholder 가 필요 하 다 . 
 이런 이유 로 training 그래프 와 inference 그래프 가 달라지 는데 , 텐서 플로우 1 . 0 버전 이후 에서 부 터 는 model export 를 SavedModel 을 이용 하 여 저장 하 도록 가이드 하 는데 , 구현 복잡도 가 다소 높 고 아직 까지 가이드 가 부족 하 다 . 이 를 단순 화 하 기 위해서 Experiment 클래스 를 이용 하 면 자동 으로 training 그래프 와 inference graph 를 분리 해 주 기 때문 에 , 코드 가 단순 화 될 수 있 기 때문 에 모델 을 만들 때 처음 부터 Experiment 클래스 를 사용 하 기 를 권장 한다 . 
 Wide and deep network 모델 활용 하 기 ( 0 ) 
 텐 서 플로우 에서 모델 export 시 그래프 를 다시 그리 는 이유 ( 0 ) 
 텐 서 플로우 에서 array index 를 문자열 로 변환 하 는 방법 ( 0 ) 
 얼굴 인식 모델 을 만들 어 보 자 # 4 - 클라우드 를 이용 하 여 학습 시키 기 ( 0 ) 
 얼굴 인식 모델 을 만들 어 보 자 # 3 - 학습 된 모델 로 예측 하 기 ( 2 ) 
 TAG check point , CloudML , experiment , export model , Graph , model save , savedmodel , tensorflow , tensorflow serving , tf . contrib , 모델 , 저장 , 조대 협 , 체크 포인트 , 텐서 플로우 
 얼굴 인식 모델 을 만들 어 보 자 # 4 - 클라우드 를 이용 하 여 학습 시키 기 
 빅 데 이타 / 머신 러닝 | 2017 . 6 . 22 . 22 : 14 | Posted by 조대 협 
 얼굴 인식 모델 을 만들 어 보 자 # 4 클라우드 를 이용 하 여 학습 시키 기 
 ( 머신 러닝 학습 및 예측 시스템 의 운영 환경 화 ) 
 앞 에서 모델 을 만들 고 학습 도 다 했 다 . 이제 , 이 모델 을 실제 운영 환경 에서 운영 할 수 있 는 스케일 로 포 팅 을 하 고자 한다 . 
 로컬 환경 대비 실제 운영 환경 으로 확장 할 때 고려 해야 하 는 사항 은 
 대 규모 학습 데 이타 를 저장 할 수 있 는 공간 
 대 규모 학습 데 이타 를 전처리 하 기 위한 병렬 처리 환경 
 이 내용 은 이미 http : / / bcho . tistory . com / 1177 에서 다루 었 다 . 
 대 규모 학습 데 이타 를 빠르 게 학습 시킬 수 있 는 컴퓨팅 파워 
 학습 된 데 이타 를 이용 한 대 규모 예측 서비스 를 할 수 있 는 기능 
 위 의 요건 을 만족 하 면서 텐서 플로우 로 환경 을 올리 는 방법 은 여러 가지 가 있 지만 , 클라우드 를 선택 하 기 로 한다 . 
 첫 번 째 모델 개발 에 집중 하 고 , 텐서 플로우 의 설치 및 운영 등 에 신경 쓰 지 않 도록 한다 . 단순 한 텐 서 플로우 설치 뿐 만 아니 라 여러 장비 를 동시 에 이용 하 여 분산 학습 을 하 려면 , 클러스터 구성 및 유지 가 부담 이 된다 . 
 클라우드 컴퓨팅 파워 를 이용 하 여 , 대 규모 데 이타 에 대한 전처리 를 수행 하 고 개개 별 학습 속도 를 높이 는 것 은 물론 이 고 , 모델 을 튜닝 하 여 동시 에 여러 모델 을 학습 시킬 수 있 다 . 
 대용량 학습 데 이타 를 저장 하 기 위한 스토리지 인프라 에 대한 구성 및 운영 비용 을 절감 한다 . 
 즉 설정 이나 운영 은 클라우드 에 맏 겨 놓 고 , 클라우드 의 무한 한 자원 과 컴퓨팅 파워 를 이용 하 여 빠르 게 모델 을 학습 하 기 위함 이 다 . 
 아무래도 일 하 는 성격 상 구글 클라우드 를 먼저 볼 수 밖 에 없 는데 , 구글 클라우드 에서 는 텐서 플로우 의 매니 지드 서비스 인 CloudML 을 제공 한다 . 
 CloudML 은 별도 의 설치 나 환경 설정 없이 텐서 플로우 로 만든 모델 을 학습 시키 거나 학습 된 결과 로 예측 을 하 는 것 이 가능 하 다 . 주요 특징 을 보 면 다음 과 같 다 . 
 학습 시 에 , 별도 의 설정 없이 텐서 플로우 클러스터 크기 조절 이 가능 하 다 . 싱글 머신 에서 부 터 GPU 머신 그리고 여러 대 의 클러스터 머신 사용 이 가능 하 다 
 하이퍼 패러 미터 튜닝 이 가능 하 다 . DNN 의 네트워크 의 폭 과 깊이 도 하이퍼 패러 미터 로 지정 할 수 있 으며 , CloudML 은 이런 하이퍼 패러 미터 의 최적 값 을 자동 으로 찾 아 준다 . 
 예측 서비스 에서 는 Tensorflow Serv 를 별도 의 빌드 할 필요 없이 미리 환경 설정 이 다 되 어 있 으며 ( bazel 빌드 의 끔직 함 을 겪 어 보 신 분 들 은 이해 하 실 듯 ) gRPC 가 아닌 간단 한 JSON 호출 로 예측 ( PREDICTION ) 요청 을 할 수 있 다 
 분당 과금 이 다 . 이게 강력 한 기능 인데 , 구글 클라우드 는 기본 적 으로 분당 과금 으로 CPU 를 사용 하 던 , GPU 를 사용 하 던 정확히 사용 한 만큼 만 과금 하 기 때문 에 , 필요 할 때 필요 한 만큼 만 사용 하 면 된다 . 일부 클라우드 의 경우 에 는 시간 당 과금 을 사용 하 기 때문 에 , 8 대 의 GPU 머신 에서 1 시간 5 분 을 학습 하 더라도 8 대 에 대해서 2 시간 요금 을 내 야 하 기 때문 에 상대 적 으로 비용 부담 이 높 다 . 
 가장 큰 메리트 는 TPU ( Tensorflow Processing Unit ) 을 지원 한다는 것 인데 , 딥 러닝 전용 GPU 라고 생각 하 면 된다 . 일반 적 인 CPU 또는 GPU 대비 15 ~ 30 배 정도 빠른 성능 을 제공 한다 . 
 현재 는 Close Alpha 로 특정 사용 자 에게 만 시범 서비스 를 제공 하 고 있 지만 곧 CloudML 을 통해서 일반 사용 자 에게 도 서비스 가 제공 될 예정 이 다 . 
 CloudML 을 이용 하 여 학습 하 기 
 CloudML 에서 학습 을 시키 려면 약간 의 코드 를 수정 해야 한다 . 수정 해야 하 는 이유 는 학습 데 이타 를 같이 올릴 수 없 기 때문 인데 , 여기 에 는 두 가지 방법 이 있 다 . 
 학습 데 이타 를 GCS ( Google Cloud Storage ) 에 올려놓 은 후 , 학습 이 시작 되 기 전 에 로컬 디렉 토리 로 복사 해 오 거나 
 또는 학습 데 이타 를 바로 GCS 로 부 터 읽 어 오 도록 할 수 있 다 . 
 첫 번 째 방법 은 gsutil 이 라는 GCS 명령어 를 이용 하 여 학습 시작 전 에 GCS 에서 학습 데 이타 를 카피 해 오 면 되 고 , 
 두 번 째 방법 은 학습 데 이타 의 파 일 명 을 GCS 로 지정 하 면 된다 . 
 예 를 들 어 텐서 플로우 코드 에서 이미지 파일 을 아래 와 같이 로컬 경로 에서 읽 어 왔 다면 
 GCS 에서 읽 어 오 려면 GCS 경로 로 바꿔 주 면 된다 . GCS 버킷 명이 terrycho - training - data 라고 하 면 
 첫 번 째 방법 의 경우 에 는 데 이타 가 아주 많 지 않 고 , 분산 학습 이 아닌 경우 매우 속도 가 빠르 다 . 두 번 째 방법 의 경우 에 는 데 이타 가 아주 아주 많 아서 분산 학습 이 필요 할 때 사용 한다 . 아무래도 로컬 파일 억세 스가 GCS 억세 스 보다 빠르 기 때문 이 다 . 
 다음 은 첫 번 째 방식 으로 학습 데 이타 를 로컬 에 복사 해서 학습 하 는 방식 의 코드 이 다 . 
 https : / / github . com / bwcho 75 / facerecognition / blob / master / CloudML % 20 Version / face _ recog _ model / model _ localfile . py 
 코드 내용 은 앞서 만들 모델 코드 와 다를 것 이 없 고 단지 아래 부분 과 , 파일 경로 부분 만 다르 다 
 def gcs _ copy ( source , dest ) : 
 print ( ' Recursively copying from % s to % s ' % 
 ( source , dest ) ) 
 subprocess . check _ call ( [ ' gsutil ', '- q ', '- m ', ' cp ', '- R '] 
 + [ source ] + [ dest ] 
 gcs _ copy 함수 는 GCS 의 source 경로 에서 파일 을 dest 경로 로 복사 해 주 는 명령 이 다 . 
 def prepare _ data ( ) : 
 # load training and testing data index file into local 
 gcs _ copy ( ' gs : //'+ DESTINATION _ BUCKET +'/'+ TRAINING _ FILE , '.') 
 gcs _ copy ( ' gs : //'+ DESTINATION _ BUCKET +'/'+ VALIDATION _ FILE , '.') 
 # loading training and testing images to local 
 if not os . path . exists ( FLAGS . local _ image _ dir ) : 
 os . makedirs ( FLAGS . local _ image _ dir ) 
 gcs _ copy ( image _ url , FLAGS . local _ image _ dir ) 
 그리고 prepare _ data 를 이용 해서 , 학습 과 테스트 용 이미지 목록 파일 을 복사 하 고 , 이미지 들 도 로컬 에 복사 한다 . 
 로컬 에 데 이타 복사 가 끝나 면 main ( ) 함수 를 호출 하 여 모델 을 정의 하 고 학습 을 시작 한다 . 
 코드 를 수정 하 였으면 , CloudML 을 이용 하 여 학습 을 하 려면 , 파일 들 을 패 키 징 해야 한다 . 별 다를 것 은 없 고 
 [ 작업 디렉 토리 ] 
 식 으로 디렉 토리 를 구성 하 면 된다 . 
 얼굴 학습 모델 을 model _ localfile . py 라는 이름 으로 저장 하 였 다 
 이제 학습 용 모델 이 준비 되 었 으면 , 이 모델 을 CloudML 에 집 어 넣 으면 된다 . 
 명령어 가 다소 길 기 때문 에 , 쉘 스크립트 로 만들 어 놓 거나 또는 파이썬 노트북 에 노트 형식 으로 만들 어 놓 으면 사용 이 간편 하 다 . 다음 은 파이썬 노트북 으로 만들 어 놓 은 내용 이 다 . 
 리모트 로 구글 클라우드 의 CloudML 을 호출 하 기 때문 에 , GOOGLE _ APPLICATION _ CREDIENTIALS 에 서비스 어카운트 파일 을 지정 한다 . 
 그리고 CloudML 에 학습 을 실행 하 면 , 각 학습 은 JOB 으로 등록 되 는데 , 손쉽 게 JOB 을 찾 아서 모니터링 하 거나 중지 할 수 있 도록 , JOB ID 를 현재 시간 으로 생성 한다 . 
 print job _ name 
 # Job name whatever you want 
 # the directory of folder that include your source and init file 
 # format : folder _ name . source _ file _ name 
 # bucket you created 
 # I recommand " europe - west 1 " region because there are not enough GPUs in US region for you . .... 
 # Default is CPU computation . set BASIC _ GPU to use Tesla K 80 ! 
 # Submit job with these settings 
 ! gcloud ml - engine jobs submit training $ JOB _ NAME \ 
 다음 은 cloudml 명령어 를 실행 하 면 된다 . 각 인자 를 보 면 
 JOB _ NAME 은 학습 JOB 의 이름 이 다 . 
 package - path 는 __ init __. py 와 학습 모델 및 관련 파일 들 이 있 는 디렉 토리 가 된다 . 
 module - name 은 package - path 안 에 있 는 학습 실행 파일 이 다 . 
 staging - bucket 은 CloudML 에서 학습 코드 를 올리 는 임시 Google Cloud Storage 로 , Google Cloud Storage 만든 후 에 , 그 버킷 경로 를 지정 하 면 된다 . 
 region 은 CloudML 을 사용 한 리전 을 선택 한다 . 
 마지막 으로 scale - tier 는 학습 머신 의 사이즈 를 지정 한다 . 
 스케일 티어 
 싱글 머신 . CPU 
 싱글 머신 + K 80 GPU 
 분산 머신 
 대 규모 분산 머신 
 사용 자 가 클러스터 크기 를 마음대로 설정 
 일반 적 인 모델 은 BASIC _ GPU 를 사용 하 면 되 고 , 모델 이 분산 학습 이 가능 하 도록 개발 되 었 으면 STANDARD _ 1 이나 PREMIUM _ 1 을 사용 하 면 된다 . 
 이렇게 명령 을 수행 하 면 모델 코드 가 CloudML 로 전송 되 고 , 전송 된 코드 는 CloudML 에서 실행 된다 . 
 학습 모니터링 
 학습 이 시작 되 면 JOB 을 구글 클라우드 콘솔 의 CloudML 메뉴 에서 모니터링 을 할 수 있 다 . 
 다음 은 CloudML 에서 의 JOB 목록 이 다 . ( 진짜 없 어 보인다 … ) 
 실행 중 인 JOB 에서 STOP 버튼 을 누르 면 실행 중 인 JOB 을 정지 시킬 수 도 있 고 , View Logs 버튼 을 누르 면 , 학습 JOB 에서 나오 는 로그 를 볼 수 있 다 . ( 텐서 플로우 코드 내 에서 print 로 찍 은 내용 들 도 모두 여기 나온다 . ) 
 여기 까지 간단 하 게 나마 CloudML 을 이용 하 여 모델 을 학습 하 는 방법 을 알아보 았 다 . 
 본인 의 경우 연예인 인식 모델 을 MAC PRO 15 ” i 7 ( NO GPU ) 에서 학습 한 경우 7000 스텝 가지 약 8 시간 이 소요 되 었 는데 , CloudML 의 BASIC _ GPU 를 사용 하 였을 때 는 10 , 000 스탭 에 약 1 시간 15 분 정도 ( GCS 를 사용 하 지 않 고 직접 파일 을 로컬 에 복사 해 놓 고 돌린 경우 ) 가 소요 되 었 다 . ( 빠르 다 ) 
 여기 서 사용 된 전체 코드 는 https : / / github . com / bwcho 75 / facerecognition / tree / master / CloudML % 20 Version 에 있 다 . 
 model _ gcs . py 는 학습 데 이타 를 GCS 에서 부 터 읽 으면서 학습 하 는 버전 이 고 
 model _ localfile . py 는 학습 데 이타 를 로컬 디스크 에 복사 해 놓 고 학습 하 는 버전 이 다 . 
 다음 글 에서 는 학습 된 모델 을 배포 하 여 실제로 예측 을 실행 할 수 있 는 API 를 개발 해 보 도록 하 겠 다 . 
 연예인 얼굴 인식 모델 을 만들 어 보 자 - # 2 . CNN 모델 을 만들 고 학습 시켜 보 자 ( 15 ) 
 머신 러닝 시스템 프로세스 와 아키 텍 쳐 ( 7 ) 
 TAG cloud , CloudML , Deep learning , distributed learning , google , GPU , Intro , Overview , tensorflow , TPU , Training , Tutorial , 강좌 , 구글 , 길 고 긴 여정 , 딥 러닝 , 분산 러닝 , 분산 학습 , 언제 다 끝내 지 ? , 조대 협 , 초보 , 클라우드 , 텐서 플로우 , 트레이닝 , 학습