• Google Cloud Platform 을 이용해 분산 텐서플로우를 사용해보자

    2019. 2. 22. 19:03

    by. 위지원

    전체 내용은 아래를 보고 참조했다.

    https://cloud.google.com/solutions/running-distributed-tensorflow-on-compute-engine


    12개월 무료 평가판으로 시행!


    이미지



    일단 홈페이지에서 체크하라는 시작하기 전에 3가지를 확인한 다음 진행한다.


    1. compute engine 생성


    2.결제 설정



    3.API 설정


    Cloud Shell로 이동해서 홈페이지에 있는걸 차근차근 따라해보자.


    템플릿 인스턴스 만들기


    upsidejiwon@cloudshell:~ (tensorproject)$ gcloud config set compute/zone us-east1-c
    Updated property [compute/zone].
    upsidejiwon@cloudshell:~ (tensorproject)$ gcloud config set project tensorproject
    Updated property [core/project].
    upsidejiwon@cloudshell:~ (tensorproject)$ git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    Cloning into 'cloudml-dist-mnist-example'...
    remote: Enumerating objects: 8, done.
    remote: Counting objects: 100% (8/8), done.
    remote: Compressing objects: 100% (8/8), done.
    remote: Total 295 (delta 1), reused 2 (delta 0), pack-reused 287
    Receiving objects: 100% (295/295), 228.29 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (158/158), done.

    다운받은 폴더로 이동해서 초기 VM 인스턴스 생성

    upsidejiwon@cloudshell:~ (tensorproject)$ cd cloudml-dist-mnist-example/
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example (tensorproject)$ 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


    ssh를 이용한 연결!


    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example (tensorproject)$ gcloud compute ssh template-instance
    Updating project ssh metadata...⠼Updated [https://www.googleapis.com/compute/v1/projects/tensorproject].
    Updating project ssh metadata...done.
    Waiting for SSH key to propagate.
    Warning: Permanently added 'compute.8926862104116465754' (ECDSA) to the list of known hosts.
    Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1027-gcp x86_64)

     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage

      Get cloud support with Ubuntu Advantage Cloud Guest:
        http://www.ubuntu.com/business/services/cloud

    0 packages can be updated.
    0 updates are security updates.

    New release '18.04.2 LTS' available.
    Run 'do-release-upgrade' to upgrade to it.


    아래 명령어로 업데이트 및 pip와 tensorflow를 설치해준다.

    sudo apt-get update sudo apt-get -y upgrade \ && sudo apt-get install -y python-pip python-dev
    sudo pip install tensorflow
    sudo pip install --upgrade tensorflow ( 버전이 1.2.1보다 낮으면 진행한다 )

    나는 한번하고 말꺼니까 가상환경 구축은 안할테지만 혹시 필요하다면 다른 링크로 접속해야 한다.


    참고: pip를 설치하면 로컬 시스템의 다른 Python 기반 설치를 방해할 수 있습니다.이 VM은 텐서플로우용으로 제작되었으므로 간단한 설치 옵션으로 인해 문제가 발생하지는 않습니다. 중요한 프로덕션 시나리오에서 텐서플로우를 사용하는 경우 격리를 위해 virtualenv를 사용하여 가상 환경을 만드는 것이 좋습니다. 다음 안내에 따라 virtualenv로 텐서플로우를 설치하세요.


    버킷을 생성해주는데 이런 퍼미션 에러가 나는군요 퍼미션을 해결해줍시다.  아래의 명령어를 입력한뒤 시키는대로 하면 됩니다.


    gcloud auth login

     


    upsidejiwon@template-instance:~$ MNIST_BUCKET="mnist-$RANDOM"
    upsidejiwon@template-instance:~$ gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
    Creating gs://mnist-23667/...
    AccessDeniedException: 403 Insufficient Permission


    버킷까지 생성이 되었습니다.



    git으로 받은 폴더에 script 파일에 py파일을 수행해주고 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/


    Instructions for updating:
    Please use alternatives such as official/mnist/dataset.py from tensorflow/models.
    Writing /tmp/data/train.tfrecords
    Writing /tmp/data/validation.tfrecords
    Writing /tmp/data/test.tfrecords



    upsidejiwon@template-instance:~/cloudml-dist-mnist-example$ gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    Copying file:///tmp/data/train.tfrecords [Content-Type=application/octet-stream]...
    - [1 files][ 46.7 MiB/ 46.7 MiB]
    Operation completed over 1 objects/46.7 MiB.
    upsidejiwon@template-instance:~/cloudml-dist-mnist-example$ gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/
    Copying file:///tmp/data/test.tfrecords [Content-Type=application/octet-stream]...
    / [1 files][  8.5 MiB/  8.5 MiB]
    Operation completed over 1 objects/8.5 MiB.


    그럼 방금 만든 버킷에 데이터가 짜잔하고 올라와있따.



    또 시키는데로 인스턴스를 삭제해준다.

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete

    gcloud compute instances delete template-instance

    인스턴스를 생성하고 또 생성해주고..~! ps,master,worker,woker 로 생성하는것이다.


    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example (tensorproject)$ gcloud compute images create template-image \
    > --source-disk template-instance
    Created [https://www.googleapis.com/compute/v1/projects/tensorproject/global/images/template-image].
    NAME            PROJECT        FAMILY  DEPRECATED  STATUS
    template-image  tensorproject                      READY
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example (tensorproject)$ gcloud compute instances create \
    > master-0 worker-0 worker-1 ps-0 \
    > --image template-image \
    > --machine-type n1-standard-4 \
    > --scopes=default,storage-rw



    이런.. 용량 부족으로 master와 worker0밖에 생성이 되지 않았다.


    ERROR: (gcloud.compute.instances.create) Could not fetch resource:
     - Quota 'CPUS' exceeded. Limit: 8.0 in region us-east1.



    방법은 간단데쓰 .. IAM 및 관리자 페이지로 접속합니다. 그리고 계정을 업그레이드 해주면 된다...~!!!(감격..)



    무료크레딧 300이 있으니까요!


    업그레이드 하고나면 무사히 만들어집니다. 이제 할 수 있다구요!



    ㅇㅏ래 명령어를 실행시켜주자


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

    INFO:tensorflow:Evaluation [100/100]
    INFO:tensorflow:Finished evaluation at 2019-02-22-09:06:31
    INFO:tensorflow:Saving dict for global step 1: accuracy = 0.1576, global_step = 1, loss = 2.1794972
    INFO:tensorflow:Validation (step 1): loss = 2.1794972, global_step = 1, accuracy = 0.1576
    INFO:tensorflow:global_step/sec: 4.39302


    트레이닝 된 모델이 버켓에 저장되었다.


    Trained model is stored in gs://mnist-1567/job_190222_090316/export/Servo/1550827788/


    cloud ml을 이용하여 예측을 위한 모델을 export 시켜 보자


    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example/cloudml-dist-mnist-example (tensorproject)$ MODEL="MNIST"
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example/cloudml-dist-mnist-example (tensorproject)$ MODEL_BUCKET=gs://mnist-1567/job_190222_090316/export/Servo/1550827788/
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example/cloudml-dist-mnist-example (tensorproject)$ gcloud ml-engine models create ${MODEL} --regions us-east1
    Created ml engine model [projects/tensorproject/models/MNIST].
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example/cloudml-dist-mnist-example (tensorproject)$ gcloud ml-engine versions create \
    >  --origin=${MODEL_BUCKET} --model=${MODEL} v1
    Creating version (this might take a few minutes)......done.
    upsidejiwon@cloudshell:~/cloudml-dist-mnist-example/cloudml-dist-mnist-example (tensorproject)$ gcloud ml-engine versions set-default --model=${MODEL} v1
    createTime: '2019-02-22T09:31:45Z'
    deploymentUri: gs://mnist-1567/job_190222_090316/export/Servo/1550827788/
    etag: 8t4g4jG-WG8=
    framework: TENSORFLOW
    isDefault: true
    machineType: mls1-c1-m2
    name: projects/tensorproject/models/MNIST/versions/v1
    pythonVersion: '2.7'
    runtimeVersion: '1.0'
    state: READY


    짜잔 생겼습니다.



    오늘은 모든게 순조로우니 아주 기분이 좋다..


    이제 마지막으로 Datalab에서 예측을 한번 해볼까...?


    아래 명령어를 입력해보자

    datalab create mnist-datalab

    datalab create mnist
    -datalab

    에러가 발생했지만 시키는대로 하면 해결된다.. 오늘 한잔해야겠다..기분이 너무 좋다 ㅠ-ㅠ 엉엉


    ERROR: (gcloud.source.repos.list) User [upsidejiwon@gmail.com] does not have permission to access project [tensorproject] (or it may not exist): Cloud Source Repositories API has not been used in project 1014703854816 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sourcerepo.googleapis.com/overview?project=1014703854816 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
    - '@type': type.googleapis.com/google.rpc.Help
      links:
      - description: Google developers console API activation
        url: https://console.developers.google.com/apis/api/sourcerepo.googleapis.com/overview?project=1014703854816
    A nested call to gcloud failed, use --verbosity=debug for more info.


    The connection to Datalab is now open and will remain until this command is killed.
    Click on the *Web Preview* (square button at top-right), select *Change port > Port 8081*, and start using Datalab.


    셀 우측 상단에 보면  요론게 있다. 포트를 8081로 변경해주면~!!




    문제없이 잘뜬다!!!!우와우와우와 이런날이 얼마만인지 ...하... 해피투데이..



    노트북을 추가 시킨뒤 아래처럼 텍스트를 입력해준다.



    그리고나서 실행을 하면 아래처럼 된다.



    그리고 새로고침을 누른다. 위에 명령어로 노트북이 다운로드 된것이다. 새로고침을 누르면 아래와 같이 갑자기 긴~ 코드가 생긴다.



    그리고서 첫번째 셀을 선택하고 실행하면 아래처럼 빈칸에 마우스 커서로 숫자를 입력 할 수 있다.



    그리고 다음 셀을 실행하면 아래와 같이 예측한다 오아




    6의 밑을 쪼끄만 동그라미로 해보니 1로 인식한다 귀여워라 ㅋ_ㅋ




    대화의 장 💬