AI Platform Notebooks의 프로토타입 모델

1. 개요

이 실습에서는 데이터를 탐색하고 ML 모델을 프로토타입하는 데 사용할 수 있는 AI Platform Notebooks의 다양한 도구를 살펴봅니다.

학습 내용

다음 작업을 수행하는 방법을 배우게 됩니다.

  • AI Platform Notebooks 인스턴스 만들기 및 맞춤설정하기
  • AI Platform Notebooks에 직접 통합된 git으로 노트북 코드 추적
  • 메모장 내에서 What-If 도구 사용하기

Google Cloud에서 이 실습을 진행하는 데 드는 총 비용은 약 $1입니다. AI Platform Notebooks 가격 책정에 관한 자세한 내용은 여기에서 확인하세요.

2. AI Platform Notebooks 인스턴스 만들기

이 Codelab을 실행하려면 결제가 사용 설정된 Google Cloud Platform 프로젝트가 필요합니다. 프로젝트를 만들려면 여기의 안내를 따르세요.

2단계: Compute Engine API 사용 설정

아직 사용 설정되지 않은 경우 Compute Engine으로 이동하고 사용 설정을 선택합니다. 이것은 노트북 인스턴스를 생성하는 데 필요합니다.

3단계: 노트북 인스턴스 만들기

Cloud 콘솔의 AI Platform Notebooks 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 최신 TensorFlow 2 Enterprise 인스턴스 유형(GPU 없음)을 선택합니다.

9f2bb4dec1ba4f4f.png

인스턴스 이름을 지정하거나 기본 이름을 사용합니다. 그런 다음 맞춤설정 옵션을 살펴봅니다. 맞춤설정 버튼을 클릭합니다.

63be602ba45ca7c9.png

AI Platform Notebooks에는 인스턴스가 배포된 리전, 이미지 유형, 머신 크기, GPU 수 등 다양한 맞춤설정 옵션이 있습니다. 리전과 환경에 기본값을 사용합니다. 머신 구성에는 n1-standard-8 머신을 사용합니다.

27101d232f765a17.png

GPU는 추가하지 않으며 부팅 디스크, 네트워킹, 권한에는 기본값을 사용합니다. 만들기를 선택하여 인스턴스를 만듭니다. 완료되기까지 몇 분 정도 걸립니다.

인스턴스가 생성되면 노트북 UI에서 인스턴스 옆에 녹색 체크표시가 표시됩니다. JupyterLab 열기를 선택하여 인스턴스를 열고 프로토타이핑을 시작합니다.

3598f414887ea9a8.png

인스턴스를 열면 codelab이라는 새 디렉터리를 만듭니다. 이 디렉터리에서 이 실습의 모든 작업을 진행합니다.

c16a821546acd92.png

새로 만든 codelab 디렉터리를 더블클릭하여 클릭한 다음 런처에서 Python 3 노트북을 선택합니다.

4390b1614ae8eae4.png

노트북 이름을 demo.ipynb 또는 원하는 이름으로 바꿉니다.

4단계: Python 패키지 가져오기

노트북에 새 셀을 만들고 이 Codelab에서 사용할 라이브러리를 가져옵니다.

import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

import numpy as np
import json

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

3. BigQuery 데이터를 노트북에 연결

Google Cloud의 빅데이터 웨어하우스인 BigQuery에서는 탐색할 수 있는 다양한 데이터 세트를 공개적으로 제공하고 있습니다. AI Platform Notebooks는 인증 없이 BigQuery와의 직접 통합을 지원합니다.

이 실습에서는 출생 데이터 세트를 사용합니다. 여기에는 40년간 미국에서 발생한 거의 모든 출생에 대한 데이터(예: 아기의 출생 시 체중, 아기 부모의 인구통계 정보)가 포함되어 있습니다. 특성의 하위 집합을 사용하여 아기의 출생 시 체중을 예측합니다.

1단계: 빅쿼리 데이터를 노트북에 다운로드합니다.

BigQuery용 Python 클라이언트 라이브러리를 사용하여 데이터를 Pandas DataFrame으로 다운로드합니다. 원본 데이터 세트는 21GB이며 1억 2,300만 개의 행을 포함합니다. 간단히 하기 위해 데이터 세트에서 10,000개의 행만 사용합니다.

다음 코드를 사용하여 쿼리를 구성하고 결과 DataFrame을 미리 봅니다. 여기서는 원본 데이터 세트에서 아기 체중 (모델이 예측할 항목)과 함께 4가지 특성을 가져옵니다. 데이터 세트는 오래되었지만 이 모델에서는 2000년 이후의 데이터만 사용합니다.

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

데이터 세트의 숫자 특징 요약을 가져오려면 다음을 실행합니다.

df.describe()

숫자 열의 평균, 표준 편차, 최솟값, 기타 측정항목이 표시됩니다. 마지막으로 아기의 성별을 나타내는 불리언 열의 데이터를 가져와 보겠습니다. Pandas value_counts 메서드를 사용하여 이 작업을 수행할 수 있습니다.

df['is_male'].value_counts()

데이터 세트가 성별별로 거의 50:50으로 균형을 이루는 것으로 보입니다.

2단계: 학습을 위한 데이터 세트 준비

이제 데이터 세트를 Pandas DataFrame으로 노트북에 다운로드했으므로 사전 처리를 수행하고 학습 세트와 테스트 세트로 분할할 수 있습니다.

먼저 데이터 세트에서 null 값이 있는 행을 삭제하고 데이터를 셔플하겠습니다.

df = df.dropna()
df = shuffle(df, random_state=2)

그런 다음 라벨 열을 별도의 변수로 추출하고 특성만 포함된 DataFrame을 만듭니다. is_male는 불리언이므로 모델의 모든 입력이 숫자가 되도록 정수로 변환합니다.

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
data['is_male'] = data['is_male'].astype(int)

이제 data.head()를 실행하여 데이터 세트를 미리 보려면 학습에 사용할 네 가지 기능이 표시됩니다.

4. git 초기화

AI Platform Notebooks는 git과 직접 통합되어 있으므로 메모장 환경 내에서 직접 버전 관리를 할 수 있습니다. 이렇게 하면 노트북 UI에서 바로 코드를 커밋하거나 JupyterLab에서 제공되는 터미널을 통해 코드를 커밋할 수 있습니다. 이 섹션에서는 노트북에서 git 저장소를 초기화하고 UI를 통해 첫 번째 커밋을 실행합니다.

1단계: git 저장소 초기화

Codelab 디렉터리에서 JupyterLab의 상단 메뉴 바에서 Git을 선택한 다음 Init을 선택합니다.

d9f1729358f18e58.png

이 디렉터리를 Git 저장소로 만들지 묻는 메시지가 표시되면 를 선택합니다. 그런 다음 왼쪽 사이드바에서 Git 아이콘을 선택하여 파일 및 커밋의 상태를 확인합니다.

1648d6828f11a6db.png

2단계: 첫 번째 커밋 실행

이 UI에서는 커밋에 파일을 추가하고, 파일의 차이를 확인하고 (나중에 설명), 변경사항을 커밋할 수 있습니다. 방금 추가한 노트북 파일을 커밋하여 시작해 보겠습니다.

demo.ipynb 노트북 파일 옆의 체크박스를 선택하여 커밋을 위해 스테이징합니다 (.ipynb_checkpoints/ 디렉터리는 무시해도 됨). 텍스트 상자에 커밋 메시지를 입력한 다음 체크표시를 클릭하여 변경사항을 커밋합니다.

fe7366522a3a268f.png

메시지가 표시되면 이름과 이메일을 입력합니다. 그런 다음 기록 탭으로 돌아가 첫 번째 커밋을 확인합니다.

d03567c3592afb77.png

이 실습이 게시된 이후 업데이트로 인해 스크린샷이 UI와 정확하게 일치하지 않을 수 있습니다.

5. TensorFlow 모델 빌드 및 학습

노트북에 다운로드한 BigQuery 출생률 데이터 세트를 사용하여 아기 체중을 예측하는 모델을 빌드합니다. 이 실습에서는 모델 자체의 정확성보다는 노트북 도구에 중점을 둡니다.

1단계: 데이터를 학습 세트와 테스트 세트로 분할

모델을 빌드하기 전에 Scikit Learn train_test_split 유틸리티를 사용하여 데이터를 분할합니다.

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

이제 TensorFlow 모델을 빌드할 준비가 되었습니다.

2단계: TensorFlow 모델 빌드 및 학습

이 모델은 tf.keras Sequential 모델 API를 사용하여 빌드합니다. 이 API를 사용하면 모델을 레이어 스택으로 정의할 수 있습니다. 모델을 빌드하는 데 필요한 모든 코드는 다음과 같습니다.

model = Sequential([
    Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
    Dense(32, activation='relu'),
    Dense(1)]
)

그런 다음 학습할 수 있도록 모델을 컴파일합니다. 여기서는 모델의 옵티마이저, 손실 함수, 학습 중에 모델이 로깅할 측정항목을 선택합니다. 수치 값을 예측하는 회귀 모델이므로 정확성 대신 평균 제곱 오차를 측정항목으로 사용합니다.

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.MeanSquaredError(),
              metrics=['mae', 'mse'])

Keras의 편리한 model.summary() 함수를 사용하여 각 레이어에서 모델의 학습 가능한 매개변수의 모양과 수를 확인할 수 있습니다.

이제 모델을 학습시킬 준비가 되었습니다. fit() 메서드를 호출하여 학습 데이터와 라벨을 전달하기만 하면 됩니다. 여기서는 각 단계에서 모델을 검증하기 위해 학습 데이터의 일부를 보유하는 선택적 validation_split 매개변수를 사용합니다. 학습 손실과 검증 손실이 모두 감소하는 것이 이상적입니다. 하지만 이 예에서는 모델 품질보다는 모델 및 노트북 도구에 더 중점을 두고 있습니다.

model.fit(x_train, y_train, epochs=10, validation_split=0.1)

3단계: 테스트 예시에서 예측 생성하기

모델의 성능을 확인하기 위해 테스트 데이터 세트의 처음 10개 예시에서 테스트 예측을 생성해 보겠습니다.

num_examples = 10
predictions = model.predict(x_test[:num_examples])

그런 다음 모델의 예측을 반복하여 실제 값과 비교합니다.

for i in range(num_examples):
    print('Predicted val: ', predictions[i][0])
    print('Actual val: ',y_test.iloc[i])
    print()

4단계: git diff를 사용하고 변경사항을 커밋합니다.

이제 노트북을 일부 변경했으므로 노트북 Git UI에서 제공되는 git diff 기능을 사용해 볼 수 있습니다. 이제 demo.ipynb 노트북이 UI의 '변경됨' 섹션에 표시됩니다. 파일 이름 위로 마우스를 가져가고 다음과 같이 차이점 아이콘을 클릭합니다.

a370facb3632fb32.png

그러면 다음과 같이 변경사항의 차이가 표시됩니다.

461c502bd3ab910e.png

이번에는 터미널을 사용하여 명령줄을 통해 변경사항을 커밋합니다. JupyterLab 상단 메뉴 바의 Git 메뉴에서 터미널의 Git 명령어를 선택합니다. 아래 명령어를 실행하는 동안 왼쪽 사이드바의 git 탭이 열려 있으면 변경사항이 git UI에 반영된 것을 볼 수 있습니다.

새 터미널 인스턴스에서 다음을 실행하여 커밋할 노트북 파일을 스테이징합니다.

git add demo.ipynb

그런 다음 다음을 실행하여 변경사항을 커밋합니다 (원하는 커밋 메시지를 사용할 수 있음).

git commit -m "Build and train TF model"

그러면 기록에 최신 커밋이 표시됩니다.

a4b44045e97cb7a7.png

6. 노트북에서 직접 What-If 도구 사용하기

What-If 도구는 데이터 세트를 시각화하고 ML 모델의 출력을 더 잘 이해할 수 있도록 설계된 양방향 시각적 인터페이스입니다. 이 도구는 Google의 PAIR팀에서 만든 오픈소스 도구입니다. 모든 유형의 모델에서 작동하지만 Cloud AI Platform 전용으로 빌드된 일부 기능이 있습니다.

What-If 도구는 TensorFlow가 포함된 Cloud AI Platform Notebooks 인스턴스에 사전 설치되어 있습니다. 여기서는 이를 사용하여 모델의 전반적인 성능을 확인하고 테스트 세트의 데이터 포인트에서 모델의 동작을 검사합니다.

1단계: 시뮬레이션 도구용 데이터 준비하기

What-If 도구를 최대한 활용하기 위해 테스트 세트의 예시와 해당 예시의 정답 라벨 (y_test)을 What-If 도구에 전송합니다. 이렇게 하면 모델이 예측한 내용을 정답과 비교할 수 있습니다. 아래 코드 줄을 실행하여 테스트 예시와 라벨이 포함된 새 DataFrame을 만듭니다.

wit_data = pd.concat([x_test, y_test], axis=1)

이 실습에서는 What-If 도구를 방금 노트북에서 학습한 모델에 연결합니다. 이를 위해 도구가 이러한 테스트 데이터 포인트를 모델에 실행하는 데 사용할 함수를 작성해야 합니다.

def custom_predict(examples_to_infer):
    preds = model.predict(examples_to_infer)
    return preds

2단계: 가정 분석 도구 인스턴스화하기

연결된 테스트 데이터 세트와 방금 만든 정답 라벨에서 500개의 예시를 전달하여 가정 분석 도구를 인스턴스화합니다. WitConfigBuilder 인스턴스를 만들어 도구를 설정하고 데이터, 위에 정의한 맞춤 예측 함수, 타겟 (예측 대상), 모델 유형을 전달합니다.

config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
  .set_custom_predict_fn(custom_predict)
  .set_target_feature('weight_pounds')
  .set_model_type('regression'))
WitWidget(config_builder, height=800)

시뮬레이션 도구가 로드되면 다음과 같이 표시됩니다.

fcdc1cb7ed8e364e.png

x축에는 모델의 예측 가중치 값 weight_pounds에 따라 테스트 데이터 포인트가 펼쳐져 있습니다.

3단계: What-If 도구로 모델 동작 살펴보기

What-If 도구로 할 수 있는 멋진 작업이 많습니다. 여기에서는 그중 몇 가지를 살펴보겠습니다. 먼저 데이터 포인트 편집기를 살펴보겠습니다. 데이터 포인트를 선택하여 지형지물을 확인하고 지형지물 값을 변경할 수 있습니다. 먼저 데이터 포인트를 클릭합니다.

2ba944f16240ff4b.png

왼쪽에는 선택한 데이터 포인트의 지형지물 값이 표시됩니다. 해당 데이터 포인트의 정답 라벨을 모델에서 예측한 값과 비교할 수도 있습니다. 왼쪽 사이드바에서 특성 값을 변경하고 모델 예측을 다시 실행하여 변경사항이 모델에 미치는 영향을 확인할 수도 있습니다. 예를 들어 이 데이터 포인트를 더블클릭하고 예측을 다시 실행하여 gestation_weeks를 30으로 변경할 수 있습니다.

aaa6a937c66758cf.png

시뮬레이션 도구의 그래프 섹션에 있는 드롭다운 메뉴를 사용하면 다양한 종류의 맞춤 시각화를 만들 수 있습니다. 예를 들어 다음은 x축에 모델의 예측 체중, y축에 산모의 연령, 추론 오류에 따라 색상이 지정된 점이 표시된 차트입니다 (어두운 색상은 예측 체중과 실제 체중의 차이가 더 크다는 의미). 여기서 가중치가 감소하면 모델의 오류가 약간 증가하는 것으로 보입니다.

cd2ce527a9044e7b.png

그런 다음 왼쪽의 부분 종속도 플롯 버튼을 선택합니다. 각 특성이 모델의 예측에 어떤 영향을 미치는지 보여줍니다. 예를 들어 임신 기간이 길어질수록 모델의 예측 아기 체중도 증가합니다.

1fec2a64fb03f432.png

What-If 도구를 사용한 추가 탐색 아이디어는 이 섹션의 시작 부분에 있는 링크를 확인하세요.

7. 선택사항: 로컬 Git 저장소를 GitHub에 연결

마지막으로 노트북 인스턴스의 Git 저장소를 GitHub 계정의 저장소에 연결하는 방법을 알아봅니다. 이 단계를 수행하려면 GitHub 계정이 필요합니다.

1단계: GitHub에서 새 저장소 만들기

GitHub 계정에서 새 저장소를 만듭니다. 이름과 설명을 지정하고 공개 여부를 결정한 후 저장소 만들기를 선택합니다 (README로 초기화할 필요는 없음). 다음 페이지에서는 명령줄에서 기존 저장소를 푸시하는 방법을 안내합니다.

터미널 창을 열고 새 저장소를 원격으로 추가합니다. 아래 저장소 URL에서 username를 GitHub 사용자 이름으로, your-repo를 방금 만든 저장소의 이름으로 바꿉니다.

git remote add origin git@github.com:username/your-repo.git

2단계: Notebooks 인스턴스에서 GitHub에 인증하기

다음으로 메모장 인스턴스 내에서 GitHub에 인증해야 합니다. 이 절차는 GitHub에서 2단계 인증을 사용 설정했는지 여부에 따라 다릅니다.

어디서부터 시작해야 할지 잘 모르겠다면 GitHub 문서의 단계에 따라 SSH 키를 만들고 새 키를 GitHub에 추가하세요.

3단계: GitHub 저장소가 올바르게 연결되었는지 확인

올바르게 설정했는지 확인하려면 터미널에서 git remote -v를 실행합니다. 새 저장소가 원격으로 표시됩니다. GitHub 저장소의 URL이 표시되고 메모장에서 GitHub에 인증하면 메모장 인스턴스에서 GitHub로 직접 푸시할 수 있습니다.

로컬 노트북 Git 저장소를 새로 만든 GitHub 저장소와 동기화하려면 Git 사이드바 상단에 있는 클라우드 업로드 버튼을 클릭합니다.

eec001587bb9cfb1.png

GitHub 저장소를 새로고침하면 이전 커밋이 포함된 노트북 코드가 표시됩니다. 다른 사용자가 내 GitHub 저장소에 액세스할 수 있으며 내 노트북의 최신 변경사항을 가져오려면 클라우드 다운로드 아이콘을 클릭하여 변경사항을 동기화합니다.

Notebooks Git UI의 기록 탭에서 로컬 커밋이 GitHub와 동기화되었는지 확인할 수 있습니다. 이 예에서 origin/master는 GitHub의 저장소에 해당합니다.

2c3d1eb7cf95c24e.png

새 커밋을 할 때마다 클라우드 업로드 버튼을 다시 클릭하여 변경사항을 GitHub 저장소에 푸시하면 됩니다.

8. 축하합니다.

이 실습에서 많은 것을 해 보셨습니다. 👏👏👏

요약하면 다음과 같은 내용을 배웠습니다.

  • AI Platform Notebook 인스턴스 만들기 및 맞춤설정하기
  • 해당 인스턴스에서 로컬 git 저장소를 초기화하고, git UI 또는 명령줄을 통해 커밋을 추가하고, Notebook git UI에서 git 차이를 확인합니다.
  • 간단한 TensorFlow 2 모델 빌드 및 학습
  • 노트북 인스턴스 내에서 What-If 도구 사용
  • GitHub의 외부 저장소에 Notebook Git 저장소 연결

9. 삭제

이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

ba727f9a0aefbc30.png

이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.

Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.