Compute Engine에서 분산형 TensorFlow 실행

이 가이드에서는 여러 Compute Engine 인스턴스의 분산된 TensorFlow 구성을 사용하여 MNIST 데이터세트를 이용해 콘볼루셔널 신경망 모델을 학습시키는 방법에 대해 설명합니다. MNIST 데이터세트는 숫자에 대한 필기 인식을 지원하며, 머신러닝에서 이미지 인식을 위한 학습 세트로 널리 사용하고 있습니다.

TensorFlow는 Google의 머신러닝용 오픈소스 라이브러리로, Google Research에 속한 인공 지능 연구 조직의 연구원 및 엔지니어가 개발했습니다. TensorFlow는 학습 워크로드를 분산하기 위해 여러 컴퓨터에서 실행할 수 있도록 설계되었습니다. 이 가이드에서는 여러 Compute Engine 가상 머신 인스턴스에서 TensorFlow를 실행하여 해당 모델을 학습시킵니다. 리소스 할당 작업을 관리하고 학습 모델을 호스팅할 수 있는 Cloud Machine Learning Engine을 대신 사용할 수도 있습니다. 특별한 이유가 없는 한 Cloud ML Engine을 사용하는 것이 좋습니다. 자세한 내용은 Cloud ML Engine 및 Cloud Datalab을 사용하는 가이드의 버전을 참조하세요.

다음 다이어그램은 Compute Engine에서 분산된 TensorFlow 구성을 실행하고 Cloud Datalab과 Cloud ML Engine을 사용하여 학습 모델에서 예측을 실행하는 아키텍처를 설명합니다.

이미지

가이드에서는 이 아키텍처를 설정하고 사용하는 방법을 보여주고 일부 개념을 설명합니다.

목표

  • Compute Engine을 설정하여 TensorFlow를 실행할 가상 머신(VM) 클러스터를 만듭니다.
  • 모델을 학습시키기 위해 Compute Engine 클러스터에서 분산된 TensorFlow 샘플 코드를 실행하는 방법을 알아봅니다. 예제 코드는 최신 TensorFlow 라이브러리와 패턴을 사용하므로 자체 학습 코드를 디자인할 때 참조로 사용할 수 있습니다.
  • Cloud ML Engine에 학습된 모델을 배포하여 예측용 커스텀 API를 만든 다음 Cloud Datalab 노트북을 사용하여 예측을 실행합니다.

비용

가격 계산기 기준으로 이 가이드를 실행하는 데 필요한 예상 가격은 하루 동안 모든 리소스를 사용한다는 가정 하에 약 $1.20가 듭니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Platform 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

  3. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Compute Engine and Cloud Machine Learning APIs를 사용 설정합니다.

    APIs 사용 설정

템플릿 인스턴스 만들기

이 가이드에서는 Google Cloud Platform 콘솔에서 완전히 작동하는 Linux 셸인 Cloud Shell을 사용합니다.

  1. Cloud Shell로 이동합니다.

    Cloud Shell 열기

  2. 기본 Compute Engine 영역과 기본 프로젝트를 설정합니다.

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. GitHub 저장소를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. Ubuntu Wily 이미지에서 초기 VM 인스턴스를 만듭니다.

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. SSH를 사용하여 VM에 연결합니다.

    gcloud compute ssh template-instance
  6. pip를 설치합니다.

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. TensorFlow를 설치합니다.

    sudo pip install tensorflow
    
  8. (선택사항)단계에 따라 설치를 확인합니다.

  9. exit를 입력하여 Cloud Shell로 돌아갑니다.

  10. Cloud Shell 인스턴스에서 실행 중인 TensorFlow 버전을 확인합니다.

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. 버전이 1.2.1보다 낮은 경우 pip를 사용하여 업그레이드합니다.

    sudo pip install --upgrade tensorflow

Cloud Storage 버킷 만들기

다음으로는 MNIST 파일을 저장할 Cloud Storage 버킷을 만듭니다. 다음 단계를 따르세요.

  1. 작업자 인스턴스간에 공유하는 MNIST 데이터 파일을 보관할 지역의 Cloud Storage 버킷을 만듭니다.

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. 다음 스크립트를 사용하여 MNIST 데이터 파일을 다운로드하고 버킷으로 복사합니다.

    sudo ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/

템플릿 이미지 및 학습 인스턴스 만들기

작업자, 마스터, 매개변수 서버 인스턴스를 만들려면 템플릿 인스턴스를 이미지로 변환한 다음 이미지를 사용하여 각각의 새 인스턴스를 만듭니다.

  1. VM이 삭제될 때 디스크를 보존하는 template-instance의 자동 삭제 기능을 해제합니다.

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. template-instance를 삭제합니다.

    gcloud compute instances delete template-instance
  3. template-instance 디스크에서 template-image 이미지를 만듭니다.

    gcloud compute images create template-image \
    --source-disk template-instance
  4. 추가 인스턴스를 만듭니다. 이 가이드에서는 master-0, worker-0, worker-1, , ps-0라는 4개의 인스턴스를 만듭니다. storage-rw 범위를 사용하면 인스턴스가 Cloud Storage 버킷에 액세스할 수 있습니다. 다음과 같이 인스턴스 이름을 공백으로 구분하세요.

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

이제 클러스터로 분산된 TensorFlow를 실행할 수 있습니다.

분산된 TensorFlow 코드 실행

이 섹션에서는 모든 VM 인스턴스가 TensorFlow 코드를 실행하여 모델을 학습시키도록 지시하는 스크립트를 실행합니다.

Cloud Shell의 cloudml-dist-mnist-example 디렉토리에서 다음 명령어를 실행합니다.

./scripts/start-training.sh gs://${MNIST_BUCKET}

start-training.sh라는 스크립트는 코드를 각 VM에 푸시하고 필요한 매개변수를 전송하여 각 머신에서 TensorFlow 프로세스를 시작해 분산된 클러스터를 만듭니다. Cloud Shell의 출력 스트림은 테스트 데이터세트의 손실 및 정확도 값을 표시합니다.

터미널의 정확도 값

학습이 완료되면 스크립트는 새로 생성된 모델 파일의 위치를 출력합니다.

Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

이후 단계에서 사용할 수 있도록 버킷 경로의 위치를 복사하세요.

예측용 모델 게시

예측을 위해 사용할 수 있는 새 모델을 성공적으로 생성했습니다. 보다 정교한 모델을 학습시키려면 더 복잡한 TensorFlow 코드가 필요하지만 컴퓨팅 및 저장소 리소스의 구성은 비슷합니다.

모델을 학습시키는 것은 이야기의 절반에 불과합니다. 모델을 애플리케이션에 연결하거나 API 서비스를 인증과 함께 래핑하고 최종적으로 모든 항목의 크기를 확장해야 합니다. 모델을 유용하게 만들기 위해서는 상대적으로 많은 양의 엔지니어링 작업을 더 수행해야 합니다.

Cloud ML Engine은 이 작업에 도움이 될 수 있습니다. Cloud ML Engine은 Cloud Platform에서 실행되는 완전 관리형 TensorFlow 버전입니다. Cloud ML Engine은 추가적인 인프라를 설정하거나 소프트웨어를 설치하지 않고도 TensorFlow의 모든 강력한 기능을 제공합니다. 분산 학습을 자동으로 확장하여 수천 개의 CPU 또는 GPU를 사용할 수 있으며 사용한 만큼만 비용을 지불하면 됩니다.

Cloud ML Engine은 백그라운드에서 TensorFlow를 실행하므로 모든 작업은 이식이 가능하며 독점 도구에 종속되지 않습니다.

Cloud ML Engine을 사용하여 동일한 코드로 모델을 학습시키려면 Cloud Datalab과 함께 분산형 TensorFlow 사용 가이드를 확인하세요.

예측을 위해 모델을 호스팅하도록 Cloud ML Engine을 구성할 수도 있습니다. Cloud ML Engine에 모델을 게시하려면 다음 단계를 따르세요. 모델을 호스팅하면 Google 관리형 서비스에서 제공하는 모든 보안 및 안정성 기능을 통해 규모에 맞게 모델을 신속하게 테스트하고 적용할 수 있습니다.

다음 단계에서는 start-training.sh라는 스크립트로 이전에 출력된 모델 버킷 경로를 사용합니다.

  1. 생성된 모델로 Cloud Storage 버킷의 출력 경로를 다시 호출합니다. 형식은 다음과 같으며 [JOB_ID]는 작업 ID입니다. 다음 단계에서 이 경로를 사용합니다.

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. gcloud 명령줄 도구를 사용하여 모델의 새 v1 버전을 정의하고 버킷의 모델 파일로 가리킵니다. 다음 명령을 완료하는 데 몇 분이 소요될 수 있습니다. [YOUR_BUCKET_PATH]를 이전 단계의 출력 경로로 바꿉니다. 해당 경로는 gs://로 시작합니다.

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. 모델의 기본 버전을 'v1'로 설정합니다.

    gcloud ml-engine versions set-default --model=${MODEL} v1

모델이 이제 Cloud ML로 실행되며 예측을 처리할 수 있습니다. 다음 섹션에서는 Cloud Datalab을 사용하여 예측을 만들고 시각화합니다.

Cloud Datalab으로 예측 실행

예측을 테스트하려면 인터랙티브 Jupyter Notebook을 통해 코드를 실행하는 Cloud Datalab 인스턴스를 만들어야 합니다.

  1. Cloud Datalab 인스턴스를 만들려면 Cloud Shell에서 다음 명령어를 입력합니다.

    datalab create mnist-datalab
    
  2. Cloud Shell에서 Cloud Shell 웹 미리보기(오른쪽 상단의 정사각형 아이콘)를 클릭하여 Cloud Datalab 노트북 목록 페이지를 엽니다.

  3. 포트 변경포트 8081을 차례로 선택하여 브라우저에서 새 탭을 시작합니다.

  4. Cloud Datalab 애플리케이션에서 오른쪽 상단에 있는 +노트북 아이콘을 클릭하여 새 노트북을 만듭니다.

  5. 새 노트북의 첫 번째 셀에 다음 텍스트를 붙여넣습니다.

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
  6. 페이지 상단에서 실행을 클릭하여 Online prediction example.ipynb 노트북을 다운로드합니다. 스크립트가 원격 노트북의 콘텐츠를 현재 노트북으로 복사합니다.

  7. 브라우저 페이지를 새로고침하고 새 노트북 콘텐츠를 로드합니다. 그런 다음 자바스크립트 코드가 포함된 첫 번째 셀을 선택하고 실행을 클릭하여 실행합니다.

  8. 페이지 아래로 스크롤하여 숫자 그리기 패널로 이동한 후 커서로 숫자를 그립니다.

    커서로 그린 숫자 3

  9. 다음 셀을 클릭하여 활성화한 다음 상단의 실행 버튼 옆에 있는 아래쪽 화살표를 클릭하여 이 셀에서 실행을 선택합니다.

  10. 예측 결과는 길이가 10인 배열이며 0-9 범위의 각 색인에는 각 자릿수에 해당하는 숫자가 포함되어 있습니다. 숫자가 1에 가까울수록 색인이 사용자가 입력한 자릿수와 일치할 확률이 높다는 의미입니다. 목록에 강조 표시된 세 번째 슬롯의 수치가 1에 가장 가까우므로 해당 숫자와 일치할 확률이 높다는 것을 알 수 있습니다.

    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]

노트북의 마지막 셀에는 예측된 숫자(여기에서는 3)를 명확하게 보여주는 막대 그래프가 표시됩니다.

막대 그래프에 선택된 숫자 3이 표시됩니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. 모델 버전을 삭제합니다.

    gcloud ml-engine versions delete v1 --model=MNIST
  2. 모델을 삭제합니다.

    gcloud ml-engine models delete MNIST
  3. Cloud Storage 버킷을 삭제합니다.

    gsutil rm -r gs://${MNIST_BUCKET}
  4. Cloud DataLab을 포함한 가상 머신을 삭제합니다.

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. VM 템플릿 이미지를 삭제합니다.

    gcloud compute images delete template-image
  6. Cloud Datalab 영구 디스크를 삭제합니다.

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...