컴퓨터 사양을 레버리지하자.
이 글은 구글 클라우드 머신러닝 튜토리얼을 따라해본 글이다. 따라하면서 약간의 MSG를 첨가했다.
클라우드를 사용하는 이유는 서버를 관리하는 노력을 레버리지하기 위함이다. 서버 컴퓨터를 구비하려면 우선 서버 컴퓨터를 운용할 인력, 서버 컴퓨터를 놓을 자리, 냉각에 들어가는 비용, 서버가 소모하는 전기 등 생각 이상으로 관리를 해줘야하며 만약 서버가 있는 건물이 전기가 나가면? 인터넷이 갑자기 끊기면? 이런 만약을 대비하여 구비해놓는 것들이 너어무 많다.
이런 서버 관리를 레버리지해주는 서비스( LaaS (Leverage As A Service) ) 가 바로 클라우드 플랫폼이다. 해외에는 아마존 웹서비스, 구글 클라우드 플랫폼이 있고 국내에는 네이버 클라우드 플랫폼이 있다. 이 글에서는 텐서플로우를 사용할 것이기에 텐서플로우의 발원지 구글의 클라우드를 사용한다.
머신러닝의 역사를 알면 좋겠지만 몰라도 삶에 지장이 없기에 적지 않겠다. 그저 머신러닝 알고리즘의 라이브러리는 다양하고 그 중 텐서플로우라는 것이 있다. 그리고 그 텐서플로우가 대세다. 정도만 알면 되겠다.
위에서 언급한 아마존, 구글, 네이버 모두 머신러닝을 서비스로 제공한다. 성능과 편리함, 가격 등을 모두 고려하여 딱 맞는 서비스를 선택하길 바란다.
아무래도 세계에서 아마존과 구글보다 네이버가 인지도가 낮지 않겠는가? 네이버 클라우드 플랫폼을 활용하여 텐서플로우 서버를 구동하는 것은 나중에 살펴보도록하고 우선 구글 클라우드 플랫폼을 사용하겠다.
아마존도 다양한 머신러닝 툴을 제공한다. 그 중 세가메이커는 구글 클라우드 플랫폼의 ML엔진과 비슷한 서비스를 제공한다. 이용에 참고하시면 좋겠다.
우리가 이 글에서 다뤄볼 구글 클라우드 플랫폼의 ML엔진이다. 가입이나 신용카드 등록은 따로 설명하지 않겠다. 글을 짧게 쓰고싶기 때문이다. 절대 귀찮아서가 아니다.
작업환경은 맥이다. 윈도우, 리눅스 등 어디에서 작업해도 상관없다. 어차피 클라우드를 이용할 것이기 때문에. 물론 약간 다르겠지만.
첫 계정 생성이라면 1년간 사용할 수 있는 무료 크레딧 300달러가 있을 것이다. 이번 글에서 하라는대로 다해도 300달러를 넘을 수 없으니 걱정마시라.
우선 머신러닝은 학습을 해야한다. 그리고 실제 적용할 때는 학습된 모델을 바탕으로 예측을 하는 것이다. 우리는 학습시킬 데이터가 없다. 친절하게도 튜토리얼에서 데이터까지 제공해준다. 그럼 시작해보자.
우선 구글 클라우드 플랫폼에서 프로젝트를 생성해야한다. 이 링크 를 클릭하고 프로젝트를 하나 생성한다. 그리고 ML 엔진 API 사용을 허가한다.
다음 이 링크 를 클릭하고 새 서비스 계정을 만든다. 이름은 상관없고 역할을 프로젝트 - 소유자로 설정한다. 그리고 키 유형은 JSON그대로 받는다.
이 파일이 당신이 지금 생성한 서비스 계정의 키역할을 한다.
서비스 계정이란 구글에 로그인할 때 쓰는 이메일이 아니고 클라우드 플랫폼에서 가상의 계정을 생성해서 권한을 제한하여 사용하기위해 사용한다. 권한을 제한해서 사용하는 이유는 만약 서비스를 실질적으로 활용할 때 로그인을 허가해주는 서비스가 게시물을 등록할 수 있는 권한이 있다면 악용을 할 수 있기 때문에 권한을 제한하여 로그인 허가는 로그인을 허가할 만큼만의 권한을 보안의 목적으로 제한하는 것이다. 당신은 지금 서비스계정을 생성할 때 프로젝트 소유자로 설정했기 때문에 보안따위는 개나 줘버렸다. 물론 테스트니까 상관없다.
방금 받은 JSON 형식의 키 파일을 PATH에 등록을 한다. PATH에 등록한다는 것은 말그대로 경로에 등록을 한다는 것인데 우리가 파일을 실행할 때 C드라이브 프로그램파일에 어떤 폴더를 들어가서 실행하지 않고 주로 바탕화면의 바로가기나 시작을 클릭하여 실행하지 않는가? PATH에 등록한다는 것은 우리 컴퓨터가 요긴하게 쓸 수 있도록 바로가기를 등록해주는 것과 비슷하다.
참고로 키파일은 말그대로 키다. 다른사람에게 주거나 빼앗긴다면 좋지 않은 일들이 발생할 것이다.
PATH 등록 (맥, 리눅스)
export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
PATH 등록 (윈도우 파워쉘)
$env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
PATH 등록 (윈도우 명령 프롬프트)
set GOOGLE_APPLICATION_CREDENTIALS=[PATH]
[PATH] 를 당신의 키파일이 있는 경로를 입력해주면된다.
"[PATH]" = "C:\Users\username\Downloads\[FILE_NAME].json"
이런식으로 대입해주면 된다. json까지 적어야한다.
https://cloud.google.com/sdk/docs/ 이 페이지에 접속하여 구글 클라우드 sdk를 자신의 운영체제에 맞는 설치파일로 받고 설치하라는대로 설치하도록 하자. 그리고 init까지 했다고 믿겠다.
sdk는 개발자 키트로 쉽게 개발을 할 수 있게 도와주는 툴이라고 생각하면 되겠다. 예를들면 학습할 때 마다 서버를 생성하고 학습할 데이터를 업로드하고 모델을 생성하고 학습을 하는 과정을 거쳐야 하는데, 미리 코드로 짜놓아서 간단한 코드 몇줄로 실행해주는 것이다.
지난 글에서 python 설치와 venv 를 설정하는 것을 해보았는데, 이 링크를 통해 venv를 실행하여 tensorflow 까지 설치하길 바란다. ( 이 글에서는 1.8버전을 이용한다. ) ( pip install -I tensorflow==1.8 특정 버전 설치 -I는 설치되어있어도 무시하고 설치)
만약 구글 클라우드 sdk가 정상적으로 설치되었다면
gcloud ml-engine models list
를 터미널에 입력했을 때 Listed 0 items를 볼 수 있을 것이다.
만약 gcloud라는 명령어를 처음본다거나 뭔 소린지 모르겠다 그런 문구가 당신의 눈에 보인다면 sdk를 다시 차근차근 읽어보고 설치하거나 gcloud init을 했는지 살펴보도록 하자. 참고로 맥이나 리눅스에서 구글 클라우드 sdk를 설치하고 설치한 폴더의 위치를 옮겼다면 자동으로 등록되었을 구글 클라우드 sdk의 PATH를 재설정 해줘야한다. 아마 ~/.bash_profile 에 추가 되었을 것이다. PATH를 수정하고 source ~/.bash_profile 을 해준 다음 터미널을 재실행 해주자.
https://github.com/GoogleCloudPlatform/cloudml-samples/archive/master.zip
이 링크를 다운받고 압축을 풀어주자. 압축을 풀고 cd cloudml-samples-master/census/estimator 로 이동하자.
그리고 data 폴더를 생성하자 ( mkdir data )
그리고 다음 명령어를 실행하자.
gsutil -m cp gs://cloud-samples-data/ml-engine/census/data/* data/
gsutil 은 구글 클라우드에서 돌아갈 명령어들을 실행해줄 명령어이다. cp A B는 A를 B로 복사하는 명령어인데 gsutil이 붙었기에 gs:// 가 붙은 주소에서 복사를 해서 data폴더에 붙여넣기를 할 것이다. 기다리면 데이터가 data 폴더안에 안착했을 것이다. 안된다면 gcloud init이 되었는지 확인하고 PATH가 잘 등록되었는지 확인하길 바란다.
데이터를 확인해보면 csv 파일이 있는데 학습용과 평가용을 나눴다. 그 이유는 평가용으로 학습을 하면 진짜 필드에서의 데이터가 잘 적용될지 모르기 때문이다. 매우 중요하다. 평가용은 절대 학습에 들어가서는 안된다.
자 이제 클라우드에 저장장소를 만들자 그것은 버킷이라고 부른다.
PROJECT_ID=$(gcloud config list project --format "value(core.project)")
BUCKET_NAME=${PROJECT_ID}-mlengine
REGION=us-central1
gsutil mb -l $REGION gs://$BUCKET_NAME
gsutil cp -r data gs://$BUCKET_NAME/data
TRAIN_DATA=gs://$BUCKET_NAME/data/adult.data.csv
EVAL_DATA=gs://$BUCKET_NAME/data/adult.test.csv
gsutil cp ../test.json gs://$BUCKET_NAME/data/test.json
TEST_JSON=gs://$BUCKET_NAME/data/test.json
JOB_NAME=census_single_1
OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir $OUTPUT_PATH \
--runtime-version 1.8 \
--module-name trainer.task \
--package-path trainer/ \
--region $REGION \
-- \
--train-files $TRAIN_DATA \
--eval-files $EVAL_DATA \
--train-steps 1000 \
--eval-steps 100 \
--verbosity DEBUG
위의 명령어들을 입력했을 때 state: QUEUED. 가 나타난다면 성공이다. 구글 클라우드 플랫폼 웹에서 ML엔진으로 접속해보면 당신의 작업이 큐에 등록된 것을 볼 수 있다. 클라우드기 때문에 당신의 순서를 기다렸다가 학습을 한다. 완료되면 구글 클라우드 플랫폼 웹에서 Storage 에 브라우저에서 해당 버킷을 누르면 당신의 결과를 볼 수 있다.
완료가 된 후 이제 학습한 모델로 예측을 할 수 있는 모델을 만들어보자.
MODEL_NAME=census
gcloud ml-engine models create $MODEL_NAME --regions=$REGION
gsutil ls -r $OUTPUT_PATH/export
를 입력했을 때 나타나는 문자들 중 $OUTPUT_PATH/export/census/<timestamp> 이런 형식의 <timestamp> 있을 것이다. 그 숫자를 그대로 대입하여 다음 명령어를 계속 입력하자.
MODEL_BINARIES=gs://$BUCKET_NAME/census_single_1/export/census/1532272049/
뒤에 붙은 숫자를 바꿔줘야한다. 그대로 복붙하면 안된다.
그 다음 아래 명령어를 입력한다.
gcloud ml-engine versions create v1 \
--model $MODEL_NAME \
--origin $MODEL_BINARIES \
--runtime-version 1.8
이제 모델이 생성되었다.
gcloud ml-engine models list 를 하면 당신의 모델이 보일 것이다. 이제 이 모델로 예측을 해보자.
gcloud ml-engine predict \
--model $MODEL_NAME \
--version v1 \
--json-instances \
../test.json
test.json안에 있는 테스트 데이터를 예측을 했다. 그 결과 당신의 모델이 예측한 결과가 나타난다.
더불어 당신의 학습한 결과를 텐서보드라는 툴로 볼 수 있다.
tensorboard --logdir=$OUTPUT_PATH
후 http://localhost:6006/ 에 접속하면 학습곡선을 볼 수 있다.
이제 마무리로 생성한 모델로 예측하는 작업을 큐에 등록하여 해보도록 하자.
JOB_NAME=census_prediction
OUTPUT_PATH=gs://$BUCKET_NAME/$JOB_NAME
gcloud ml-engine jobs submit prediction $JOB_NAME \
--model $MODEL_NAME \
--version v1 \
--data-format TEXT \
--region $REGION \
--input-paths $TEST_JSON \
--output-path $OUTPUT_PATH/predictions
state: QUEUED가 나타난다면 큐에 등록이 되었고
gcloud ml-engine jobs describe $JOB_NAME 는 해당 작업의 현재상태를 설명해주는데 success가 나타난다면 완료된 것이다.
gcloud ml-engine jobs stream-logs $JOB_NAME 는 해당 작업의 로그를 현재 터미널로 볼 수 있다.
완료되었다면 그 결과를
gsutil cat $OUTPUT_PATH/predictions/prediction.results-00000-of-00001
로 볼 수 있다.
gsutil ls -r $OUTPUT_PATH 로 결과 폴더 내부를 확인 할 수 있다.
지금까지 모델을 학습하고 모델을 등록하고 그 모델로 예측을 해봤다. 이 과정이 모두 클라우드 안에서 이루어졌다. 아무리 작업하고 있는 컴퓨터의 사양이 안좋아도 클라우드로 학습하기 때문에 사양은 문제가 되지 않는다.