강화 학습(Reinforcement Learning) 개념

에이전트(Agend)가 일련의 단계(State)에서 주어진 목표/보상(Objective/Reward)를 최대화하기 위해 환경(Environment)에서 동작(Action)하는 기계학습(Machine Learning)의 한 종류

강화학습 프로세스 (source : GCP Qwiklabs)

 

구글 클라우드 플랫폼에서 강화학습(Reinforcement Learning) Job을 동작하기 위해 아래의 소스파일과 셸 커맨드를 참고하여 실습할 수 있음

구글 클라우드 플랫폼 기반 강화학습 (source : GCP Qicklabs)

 

GCP 에서 강화학습 실습하기

 

1. 탐색 메뉴에서 > AI Platform > Notebooks 를 선택

 

2. 상단 메뉴바에서 + 새 인스턴스 만들기 (New Instance) > 텐서플로우 2.1 (Tensorflow 2.1) > GPU 없는 버전(Without GPUs) 선택

 

3. 생성된 노트북 확인 후, 주피터 랩 열기 (OPEN JUPYTERLAB) 버튼 클릭

 

4. 터미널 (Terminal) 아이콘 클릭 하여 터미널 창에서 아래 명령어를 실행하여 Git으로부터 자원, 소스코드 복제(clone) 하기

git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git

 

 

5. 좌측 탐색창에서 training-data-analyst > quests > rl > early_rl > early_rl.ipynb 순서로 선택

early_rl.html
0.35MB

 

 

6. 새창에 표시된 노트북 확인 가능. 각 코드 블럭에서 Shift + Enter 를 클릭하여 실행 가능

  ※ 주의사항 : 라이브러리 설치를 위한 첫번째 코드 블럭 실행 후 설치 완료를 위해, 커널 재시작 (Restart the kernel) 필요

early_rl_run.html
0.37MB

 

구글 클라우드 플랫폼에서 강화학습 예제 노트북 실행화면 

 

source : GCP qwiklabs

 

Google Cloud Shell 활성화하기

1. GCP Console의 오른쪽 상단 툴바에서 Cloud Shell 열기 버튼 클릭

 

2. 계속(Continue) 클릭

 

결과 화면 :

 

계정 목록 조회

gcloud auth list

 

출력:

Credentialed accounts: - <myaccount>

@<mydomain>.com (active)

출력 예:

Credentialed accounts: - google1623327_student@qwiklabs.net

 

프로젝트 ID 조회 

gcloud config list project

 

출력:

[core] project = <project_ID>

 

출력 예:

[core] project = qwiklabs-gcp-44776a13dea667a6

 

 

Video Intelligence API 사용 설정

Cloud Video Intelligence API 사용

 

승인 설정하기

이 실습에서는 승인을 위해 Qwiklabs GCP 프로젝트에 연결된 서비스 계정을 만들어서 사용합니다.

 

1. Cloud Shell에서 "quickstart" 새 서비스 계정 생성

gcloud iam service-accounts create quickstart

 

2. 서비스 계정 키 파일을 만들고 <your-project-123>을 Qwiklabs GCP 프로젝트 ID로 교체

gcloud iam service-accounts keys create key.json 
--iam-account quickstart@<your-project-123>.iam.gserviceaccount.com

 

3. 서비스 계정 키 파일의 위치를 전달하여 서비스 계정을 인증

gcloud auth activate-service-account --key-file key.json

 

4. 서비스 계정을 사용하여 승인 토큰을 가져옴

gcloud auth print-access-token

 

5. 토큰이 출력됨 (이후 단계에서 이 토큰 사용)

 

 

주석이 달린 동영상 요청 만들기

1. 원하는 편집기(nano, vi 등 또는 gcloud 편집기)를 사용하여 다음 텍스트가 포함된 JSON 요청 파일을 만들고 request.json으로 저장

vi request.json
{ 
  "inputUri":"gs://spls/gsp154/video/chicago.mp4", 
  "features": [ 
     "LABEL_DETECTION" 
  ] 
}

 

2. curl을 사용하여 videos:annotate 요청 생성

- ACCESS_TOKEN을 위에서 출력한 액세스 토큰으로 바꾸고 항목 요청의 파일 이름 전달

curl -s -H 'Content-Type: application/json' \ 
     -H 'Authorization: Bearer ACCESS_TOKEN' \ 
     
'https://videointelligence.googleapis.com/v1/videos:annotate' \ 
     -d @request.json

 

3. Video Intelligence API는 요청을 처리하는 작업을 만듬

출력 : (이후 단계에서 위의 "name"을 사용)

{ 
  "name": "us-west1.18358601230245040268" 
}

 

4. v1.operations 엔드포인트를 호출함으로써 작업 정보 요청

- 위에서 한 것과 같이 ACCESS_TOKEN을 바꾸고, OPERATION_NAME을 방금 수신한 작업 name 값으로 변경

curl -s -H 'Content-Type: application/json' \ 
     -H 'Authorization: Bearer ACCESS_TOKEN' \ 
     
'https://videointelligence.googleapis.com/v1/operations/OPERATION_NAME'

 

출력 : (작업이 완료되면 done 필드가 포함되고 true로 설정됨)

 

5. 요청 후 잠시(일반적으로 약 1분) 기다렸다가 명령을 다시 실행하면, 동일한 요청에서 주석이 달린 결과를 반환

source : GCP qwiklabs

 

Google Cloud Shell 활성화하기

1. GCP Console의 오른쪽 상단 툴바에서 Cloud Shell 열기 버튼 클릭

 

2. 계속(Continue) 클릭

 

결과 화면 :

 

계정 목록 조회

gcloud auth list

 

출력:

Credentialed accounts: - <myaccount>

@<mydomain>.com (active)

출력 예:

Credentialed accounts: - google1623327_student@qwiklabs.net

 

프로젝트 ID 목록 조회

gcloud config list project

 

출력:

[core] project = <project_ID>

 

출력 예:

[core] project = qwiklabs-gcp-44776a13dea667a6

 

 

API 키 만들기

Speech API로 요청을 전송하기 위해 curl을 사용할 것이므로, 요청 URL에 전달할 API 키를 생성해야 함

 

1. 탐색 메뉴 > API 및 서비스 > 사용자 인증 정보 클릭

 

2. 사용자 인증 정보 만들기 클릭

 

3. 드롭다운 메뉴에서 API 키를 선택

 

- 방금 생성한 키를 복사합니다.

 

** 각 요청에 API 키의 값을 삽입하지 않아도 되도록 API 키를 환경 변수로 저장 **

4. ssh를 통해 프로비저닝되는 인스턴스에 연결

5. 탐색 메뉴를 열고 Compute Engine을 선택

결과 화면 : 프로비저닝된 Linux 인스턴스가 표시됨

 

6. SSH 버튼 클릭 > 대화형 셸로 이동

7. 명령줄에서 아래 내용을 입력 (<YOUR_API_KEY>를 방금 복사한 키로 변경하여 수행)

export API_KEY=<YOUR_API_KEY>

 

 

Speech API 요청 만들기

※ 참고: Google Cloud Storage에서 제공되는 미리 녹음된 파일 사용(gs://cloud-samples-tests/speech/brooklyn.flac). Speech API로 전송하기 전에 여기에서 이 파일 재생 가능

 

1. SSH 명령줄에서 request.json을 생성 (Speech API에 대한 요청을 빌드 시 이 파일 사용)

touch request.json

 

2. 자주 사용하는 명령줄 편집기(nano, vim, emacs) 또는 gcloud를 사용하여 request.json 오픈

vi request.json

 

3. 샘플 오디오 파일의 uri 값을 사용하여 request.json 파일 아래 내용 추가

{ 
  "config": { 
     "encoding":"FLAC", 
     "languageCode": "en-US"
  },
  "audio": { 
     "uri":"gs://cloud-samples-tests/speech/brooklyn.flac" 
  } 
}

 

- 본문에는 config  audio 객체가 있음

- config에서, 요청을 처리하는 방법을 Speech API에 알려줌

- encoding 매개변수는 API로 파일이 전송되는 동안 사용자가 사용하는 오디오 인코딩 유형을 API에 알려줌. FLAC는 .raw 파일에 대한 인코딩 유형임 (참고 : 인코딩 유형 문서)

- config 객체에 추가할 수 있는 다른 매개변수가 있지만, encoding만 필수 매개변수

- audio 객체에서, Cloud Storage에 있는 오디오 파일의 URI를 API에 전달

 

 

Speech API 호출하기

curl 명령어를 사용하여 API 키 환경 변수와 함께 요청 본문을 Speech API에 전달 (모두 단일 명령줄에 포함)

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json \ 
"https://speech.googleapis.com/v1/speech:recognize?key=${API_KEY}"

 

출력 : 

{ 
  "results": [ 
    { 
      "alternatives": [ 
        { 
          "transcript": "how old is the Brooklyn Bridge", 
          "confidence": 0.98267895 
        } 
      ] 
    } 
  ] 
}

 

- transcript 값은 Speech API가 오디오 파일에서 변환한 텍스트를 반환

- confidence 값은 API가 오디오를 텍스트로 얼마나 정확히 변환했는지를 나타냄

- 위 요청에서 syncrecognize 메서드를 호출했음을 확인 가능

- Speech API는 동기식 및 비동기식 텍스트 변환을 모두 지원

- 이 예제에서는 전체 오디오 파일을 전송했지만, 사용자가 말하고 있는 동안 음성을 텍스트로 변환하려면 syncrecognize 메서드 사용 가능

 

result.json 파일에 응답 저장

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json \ 
"https://speech.googleapis.com/v1/speech:recognize?key=${API_KEY}" > result.json

 

source : GCP qwiklabs

 

Google Cloud Shell 활성화하기

1. GCP Console의 오른쪽 상단 툴바에서 Cloud Shell 열기 버튼 클릭

2. 계속(Continue) 클릭

 

실행 결과 :

 

계정 목록 조회

gcloud auth list

 

출력:

Credentialed accounts: - <myaccount>@<mydomain>.com (active)

 

출력 예:

Credentialed accounts: - google1623327_student@qwiklabs.net

 

프로젝트 ID 목록 조회

gcloud config list project

 

출력:

[core] project = <project_ID>

 

출력 예:

[core] project = qwiklabs-gcp-44776a13dea667a6

 

 

API 키 만들기

PROJECT_ID 환경 변수 설정

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

 

Natural Language API에 액세스할 수 있는 새 서비스 계정 생성

gcloud iam service-accounts create my-natlang-sa \ 
     --display-name "my natural language service account"

 

새 서비스 계정으로 로그인할 사용자 인증 정보 생성

사용자 인증 정보 생성 후, JSON 파일 '~/key.json'로 저장

gcloud iam service-accounts keys create ~/key.json \ 
      --iam-account my-natlang-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

 

GOOGLE_APPLICATION_CREDENTIALS 환경 변수 설정

(환경 변수는 앞에서 만든 사용자 인증 정보 JSON 파일의 전체 경로로 설정해야 함)

export GOOGLE_APPLICATION_CREDENTIALS="/home/USER/key.json"

 

 

항목 분석 요청 만들기

ssh를 통해 제공되는 인스턴스에 연결

1. 탐색 메뉴를 열고 Compute Engine 선택 

실행 결과 : 프로비저닝 된 Linux 인스턴스

 

2. SSH 버튼을 클릭 > 대화 형 쉘로 이동 > 이 SSH 세션 유지.

3. 아래 문장으로 Natural Language API의 엔티티 분석 시도

Michelangelo Caravaggio, Italian painter, is known for 'The Calling of Saint Matthew'

 

4. 다음 gcloud 명령 실행

gcloud ml language analyze-entities 
--content="Michelangelo Caravaggio, Italian painter, is known for 'The Calling of Saint Matthew'." 
> result.json

 

5. result.json 파일의 출력 미리보기

cat result.json

 

result.json 파일 출력 예시

{ 
   "entities": [ 
      {
        "name": "Michelangelo Caravaggio", 
        "type": "PERSON", 
        "metadata": { 
             "wikipedia_url": "http://en.wikipedia.org/wiki/Caravaggio",
             "mid": "/m/020bg" 
         }, 
         "salience": 0.83047235, 
         "mentions": [ 
             { 
                "text": { 
                   "content": "Michelangelo Caravaggio", 
                   "beginOffset": 0 
                 }, 
                "type": "PROPER" 
              }, 
              { 
                "text": { 
                    "content": "painter", 
                    "beginOffset": 33 
                 }, 
                 "type": "COMMON" 
               } 
           ] 
       }, 
       { 
         "name": "Italian", 
         "type": "LOCATION", 
         "metadata": { 
             "mid": "/m/03rjj", 
             "wikipedia_url": "http://en.wikipedia.org/wiki/Italy" 
          }, 
          "salience": 0.13870546, 
          "mentions": [ 
              { 
                 "text": { 
                    "content": "Italian", 
                    "beginOffset": 25 
                 }, 
                 "type": "PROPER" 
               } 
           ] 
        }, 
        { 
           "name": "The Calling of Saint Matthew", 
           "type": "EVENT", 
           "metadata": { 
              "mid": "/m/085_p7", 
              "wikipedia_url": "http://en.wikipedia.org/wiki/The_Calling_of_St_Matthew_(Caravaggio)" 
            }, 
            "salience": 0.030822212, 
            "mentions": [ 
               { 
                  "text": { 
                     "content": "The Calling of Saint Matthew", 
                     "beginOffset": 69 
                   }, 
                   "type": "PROPER" 
                } 
             ] 
         } 
      ], 
   "language": "en" 
}

 

각 항목에 대한 확인

  • 항목의 name  type, 인물, 위치, 사건 등
  • metadata, 관련된 Wikipedia URL(있는 경우)
  • salience, 그리고 이 항목이 텍스트에 나타난 곳의 색인. Salience는 텍스트 전체에 대한 항목의 중심을 가리키는 [0,1] 범위의 숫자입니다.
  • mentions - 다른 방식으로 언급된 동일한 항목

 

source : GCP qwiklabs

 

Cloud Dataproc API가 사용 설정되어 있는지 확인

- GCP에서 Dataproc 클러스터를 만들려면 Cloud Dataproc API 사용 설정 필요

API 사용 설정 확인

1. 탐색 메뉴 > API 및 서비스 > 라이브러리 클릭

 

2. API 및 서비스 검색 대화 상자에 Cloud Dataproc을 입력 → 콘솔의 검색 결과에 Cloud Dataproc API가 표시됨

 

3. Cloud Dataproc API를 클릭하여 API 상태 표시

  - API가 아직 사용 설정되지 않은 경우 사용 버튼 클릭

 

클러스터 만들기

 

- Cloud Platform Console에서 탐색 메뉴 > Dataproc > 클러스터 선택 > 클러스터 만들기 클릭

- 클러스터 필드 설정 (다른 모든 필드는 기본값 사용)

필드
이름 example-cluster
리전 global
영역 us-central1-a

 

※ 참고: 영역은 Google Compute 영역 전체에 인스턴스를 배포할 수 있는 다중 리전 네임스페이스로, us-east1 또는 europe-west1 같은 개별 리전을 지정하여, 사용자 지정 리전 내에서 Cloud Dataproc에 의해 사용되는 메타데이터 저장소 위치와 리소스(VM 인스턴스 및 Google Cloud Storage) 분리 가능

- 만들기를 클릭하여 클러스터 생성.

- 새 클러스터가 클러스터 목록 표시됨 (생성하는 데 몇 분이 소요될 수 있음)

- 클러스터를 사용할 준비가 될 때까지 클러스터 상태는 프로비저닝으로 표시되고, 그 이후 실행 중으로 변경

 

 

작업 제출(Submit job)

샘플 Spark 작업을 실행

- 왼쪽 창에서 작업을 클릭하여 Dataproc의 작업 보기로 전환한 다음 작업 제출 클릭

 

- 필드 설정하여 작업 업데이트 (다른 모든 필드는 기본값 사용)

필드
클러스터 example-cluster
작업 유형 Spark
기본 클래스 또는 jar org.apache.spark.examples.SparkPi
인수 1000(작업 수를 설정합니다.)
Jar 파일 file:///usr/lib/spark/examples/jars/spark-examples.jar

 

- 제출 클릭

 

Pi 계산 방법
- Spark 작업은 Monte Carlo 방법을 사용하여 Pi 값을 추정
- 이 방법은 정사각형으로 둘러싸인 원을 모델링하는 좌표 평면에 x,y 점을 생성
- 입력 인수(1000)는 생성할 x,y 쌍의 수를 결정 (더 많은 쌍이 생성되면 더 정확한 추정 가능)
- 이 추정에서는 Cloud Dataproc 워커 노드를 활용하여 계산을 병렬 처리
※ 참고 : Monte Carlo 방법을 사용하여 Pi 추정  GitHub의 JavaSparkPi.java

 

- 현재 작업이 작업 목록에 나타남 (이 목록에는 프로젝트의 작업이 클러스터, 유형 및 현재 상태와 함께 표시)

- 작업 상태는 실행 중으로 표시된 후 완료되면 성공으로 표시됨

 

 

작업 결과 보기

- 작업 목록에서 작업 ID를 클릭합니다.

- 줄바꿈을 선택하거나, 오른쪽으로 스크롤하여 Pi의 계산된 값 확인 

출력 예시 (줄바꿈 선택한 경우)

 

클러스터 업데이트

1. 왼쪽 탐색창에서 클러스터를 선택하여 Dataproc 클러스터 보기로 돌아감

2. 클러스터 목록에서 example-cluster를 클릭 (기본적으로 페이지에는 클러스터의 CPU 사용 개요 표시됨)

3. 구성을 클릭하여 클러스터의 현재 설정 표시

 

4. 편집 클릭 (워커 노드 수 편집)

5. 워커 노드 필드에 4를 입력

6. 저장 클릭

 

7. 클러스터가 완료 → 클러스터의 VM 인스턴스 수 확인.

 

- 업데이트된 클러스터 작업을 다시 실행하려면, 왼쪽 창에서 작업을 클릭한 다음 작업 제출 클릭

- 작업 제출 섹션에서 설정한 것과 동일하게 필드 설정

필드
클러스터 example-cluster
작업 유형 Spark
기본 클래스 또는 jar org.apache.spark.examples.SparkPi
인수 1000(작업 수를 설정합니다.)
Jar 파일 file:///usr/lib/spark/examples/jars/spark-examples.jar

- 제출 클릭

+ Recent posts