1. 소개
| Kubeflow는 Kubernetes용 머신러닝 도구입니다. 이 프로젝트는 Kubernetes에서 머신러닝 (ML) 워크플로의 배포를 간단하고 이식 가능하며 확장 가능하도록 지원하는 데 전념하고 있습니다. 목표는 ML을 위한 최상의 오픈소스 시스템을 다양한 인프라에 배포할 수 있는 간단한 방법을 제공하는 것입니다. |
| 머신러닝 워크플로에는 데이터 준비 및 분석, 학습, 평가, 배포 등 서로 종속된 여러 단계가 포함될 수 있습니다. 이러한 프로세스를 임시로(예: 노트북 또는 스크립트 집합에서) 구성하고 추적하기는 어려우며 감사 및 재현성과 같은 문제가 점점 더 심각해집니다.Kubeflow 파이프라인(KFP)은 모니터링, 감사, 버전 추적, 재현성과 함께 견고하고 반복 가능한 머신러닝 파이프라인을 배포하는 방법을 제공하여 이러한 문제를 해결하는 데 도움이 됩니다. Cloud AI Pipelines를 사용하면 KFP 설치를 쉽게 설정할 수 있습니다. |
빌드할 항목
이 Codelab에서는 Kubeflow Pipelines를 사용하여 모델을 학습시키고 서빙하여 GitHub 문제를 요약하는 웹 앱을 빌드합니다. Kubeflow Examples 저장소의 예시를 기반으로 합니다. 완료되면 인프라에 다음이 포함됩니다.
- Kubeflow Pipelines가 설치된 (Cloud AI Pipelines를 통해) Google Kubernetes Engine (GKE) 클러스터
- GPU에서 Tensor2Tensor 모델을 학습시키는 파이프라인
- 학습된 모델에서 예측을 제공하는 서빙 컨테이너
- 예측을 해석하여 GitHub 문제에 대한 요약을 제공하는 UI
- Kubeflow Pipelines (KFP) SDK를 사용하여 처음부터 파이프라인을 만드는 노트북
학습할 내용
빌드할 파이프라인은 GitHub 문제 데이터에 대해 Tensor2Tensor 모델을 학습시켜 문제 본문에서 문제 제목을 예측하는 방법을 학습합니다. 그런 다음 학습된 모델을 내보내고 Tensorflow Serving을 사용하여 내보낸 모델을 배포합니다. 파이프라인의 마지막 단계에서는 모델 예측을 가져오기 위해 TF-Serving 인스턴스와 상호작용하는 웹 앱을 실행합니다.
- GKE 클러스터에 Kubeflow Pipelines를 설치하는 방법
- Kubeflow 파이프라인을 사용하여 ML 워크플로를 빌드하고 실행하는 방법
- AI Platform Notebook에서 파이프라인을 정의하고 실행하는 방법
필요한 항목
- Kubernetes에 대한 기본적인 이해가 있으면 도움이 되지만 필수는 아닙니다.
- 소유자 권한이 있는 활성 GCP 프로젝트
- (선택사항) GitHub 계정
- Google Cloud Platform (GCP) 콘솔에서 사용할 수 있는 Google Cloud Shell 액세스 권한
2. 설정
Cloud Shell
브라우저에서 GCP Console을 방문하고 프로젝트 사용자 인증 정보로 로그인합니다.
필요한 경우 '프로젝트 선택'을 클릭하여 Codelab 프로젝트로 작업합니다.

그런 다음 콘솔 오른쪽 상단에 있는 'Cloud Shell 활성화' 아이콘을 클릭하여 Cloud Shell을 시작합니다.

Cloud Shell을 시작하면 사용할 프로젝트의 이름이 표시됩니다. 이 설정이 올바른지 확인합니다.
프로젝트 ID를 찾으려면 GCP Console의 홈 패널을 방문하세요. 화면이 비어 있으면 메시지에서 '예'를 클릭하여 대시보드를 만듭니다.

그런 다음 필요한 경우 Cloud Shell 터미널에서 다음 명령어를 실행하여 올바른 프로젝트를 사용하도록 gcloud를 구성합니다.
export PROJECT_ID=<your_project_id>
gcloud config set project ${PROJECT_ID}
스토리지 버킷 만들기
파이프라인 파일을 저장할 Cloud Storage 버킷을 만듭니다. 전역적으로 고유한 ID를 사용해야 하므로 프로젝트 ID를 포함하는 버킷 이름을 정의하는 것이 편리합니다. gsutil mb (버킷 만들기) 명령어를 사용하여 버킷을 만듭니다.
export PROJECT_ID=<your_project_id>
export BUCKET_NAME=kubeflow-${PROJECT_ID}
gsutil mb gs://${BUCKET_NAME}
또는 GCP 콘솔을 통해 버킷을 만들 수 있습니다.
선택사항**: GitHub 토큰 만들기**
이 Codelab에서는 GitHub API를 호출하여 공개적으로 제공되는 데이터를 가져옵니다. 특히 익명화된 요청이 GitHub API로 대량 전송되는 이벤트에서 비율 제한을 방지하려면 권한이 없는 액세스 토큰을 설정하세요. 이는 익명 사용자가 아닌 개인으로 사용자를 승인하기 위한 것입니다.
- https://github.com/settings/tokens로 이동하여 범위가 없는 새 토큰을 생성합니다.
- 안전한 곳에 저장하세요. 분실한 경우 삭제하고 새로 만들어야 합니다.
이 단계를 건너뛰어도 실습은 계속 진행할 수 있지만 모델을 테스트하기 위한 입력 데이터를 생성하는 옵션이 약간 제한됩니다.
선택사항: 유용한 대시보드 고정하기
GCP 콘솔에서 Kubernetes Engine 및 스토리지 대시보드를 고정하여 더 쉽게 액세스합니다.

AI Platform Pipelines (호스팅 Kubeflow Pipelines) 설치 만들기
여기의 '시작하기 전' 및 '인스턴스 설정' 섹션에 나온 안내에 따라 KFP가 설치된 GKE 인스턴스를 설정합니다. 문서에 표시된 대로 다음 Cloud API에 대한 액세스 허용 체크박스를 선택해야 합니다. (그렇지 않으면 예시 파이프라인이 성공적으로 실행되지 않습니다.) 설치 네임스페이스를 default로 둡니다.
Nvidia k80을 지원하는 영역을 선택해야 합니다. us-central1-a 또는 us-central1-c를 기본값으로 사용할 수 있습니다.
설치가 완료되면 AI 파이프라인 대시보드에 설치에 대해 나열된 GKE 클러스터 이름과 영역을 기록하고 편의를 위해 환경 변수를 이러한 값으로 설정합니다.

export ZONE=<your zone> export CLUSTER_NAME=<your cluster name>
새 GKE 클러스터의 사용자 인증 정보를 사용하도록 kubectl 설정
GKE 클러스터가 생성된 후 Cloud Shell에서 다음 명령어를 실행하여 새 클러스터의 사용자 인증 정보를 사용하도록 kubectl를 구성합니다.
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--project ${PROJECT_ID} \
--zone ${ZONE}
또는 AI 파이프라인 대시보드에서 클러스터 이름을 클릭하여 GKE 페이지로 이동한 후 페이지 상단에서 '연결'을 클릭합니다. 팝업에서 명령어를 Cloud Shell에 붙여넣습니다.
이렇게 하면 클러스터와 상호작용할 수 있도록 kubectl 컨텍스트가 구성됩니다. 구성을 확인하려면 다음 명령어를 실행합니다.
kubectl get nodes -o wide
상태가 'Ready'으로 표시된 노드와 노드 수명, 버전, 외부 IP 주소, OS 이미지, 커널 버전, 컨테이너 런타임에 관한 기타 정보가 표시됩니다.
GPU 지원 노드 풀에 Nvidia 드라이버를 설치하도록 클러스터 구성
다음으로 클러스터에 daemonset을 적용합니다. 그러면 GPU 지원 클러스터 노드에 Nvidia 드라이버가 설치됩니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
그런 다음 KFP 구성요소에 새 Kubernetes 리소스를 만들 수 있는 권한을 부여하는 다음 명령어를 실행합니다.
kubectl create clusterrolebinding sa-admin --clusterrole=cluster-admin --serviceaccount=kubeflow:pipeline-runner
GPU 노드 풀 만들기
그런 다음 크기가 1인 GPU 노드 풀을 설정합니다.
gcloud container node-pools create gpu-pool \
--cluster=${CLUSTER_NAME} \
--zone ${ZONE} \
--num-nodes=1 \
--machine-type n1-highmem-8 \
--scopes cloud-platform --verbosity error \
--accelerator=type=nvidia-tesla-k80,count=1
3. 파이프라인 대시보드에서 파이프라인 실행
파이프라인 대시보드 열기
아직 Cloud 콘솔에 있지 않다면 파이프라인 패널로 이동합니다. 그런 다음 설치의 '파이프라인 대시보드 열기'를 클릭하고 왼쪽 메뉴 바에서 파이프라인을 클릭합니다. 로드 오류가 발생하면 탭을 새로고침하세요. 다음과 같은 새 페이지가 표시됩니다.

파이프라인 설명
실행할 파이프라인에는 여러 단계가 있습니다 (자세한 내용은 이 Codelab의 부록 참고).
- 기존 모델 체크포인트가 버킷에 복사됩니다.
- 사전 처리된 데이터를 사용하여 Tensor2Tensor 모델을 학습시킵니다.
- 학습은 첫 번째 단계에서 복사된 기존 모델 체크포인트에서 시작하여 수백 단계 더 학습합니다. (Codelab 중에 완전히 학습하는 데 너무 오래 걸립니다.)
- 학습이 완료되면 파이프라인 단계에서 TensorFlow Serving에서 제공하기에 적합한 형식으로 모델을 내보냅니다.
- TensorFlow Serving 인스턴스가 해당 모델을 사용하여 배포됩니다.
- 서빙된 모델과 상호작용하여 예측을 가져오기 위해 웹 앱이 실행됩니다.
파이프라인 다운로드 및 컴파일
이 섹션에서는 파이프라인 정의를 컴파일하는 방법을 알아봅니다. 가장 먼저 해야 할 일은 KFP SDK를 설치하는 것입니다. Cloud Shell에서 다음 명령어를 실행합니다.
pip3 install -U kfp
파이프라인 정의 파일을 다운로드하려면 Cloud Shell에서 다음 명령어를 실행합니다.
curl -O https://raw.githubusercontent.com/amygdala/kubeflow-examples/ghsumm/github_issue_summarization/pipelines/example_pipelines/gh_summ_hosted_kfp.py
그런 다음 다음과 같이 실행하여 파이프라인 정의 파일을 컴파일합니다.
python3 gh_summ_hosted_kfp.py
결과로 gh_summ_hosted_kfp.py.tar.gz 파일이 표시됩니다.
컴파일된 파이프라인 업로드
Kubeflow Pipelines 웹 UI에서 파이프라인 업로드를 클릭하고 URL로 가져오기를 선택합니다. 방금 컴파일한 것과 동일한 파이프라인을 가리키는 다음 URL을 복사하여 붙여넣습니다. (Cloud Shell에서 파일을 업로드하려면 몇 가지 추가 단계가 필요하므로 바로 가기를 사용합니다.)
파이프라인 이름을 지정합니다 (예: gh_summ).

파이프라인 실행
목록에서 업로드된 파이프라인을 클릭하면 파이프라인의 정적 그래프를 볼 수 있습니다. 그런 다음 실험 만들기를 클릭하여 파이프라인을 사용하는 새 실험을 만듭니다. 실험은 의미론적으로 관련된 실행을 그룹화하는 방법입니다.

실험에 이름을 지정하고 (예: 파이프라인과 동일한 이름인 gh_summ) 다음을 클릭하여 만듭니다.

이렇게 하면 실행의 매개변수를 입력하고 시작할 수 있는 페이지가 표시됩니다.
Cloud Shell에서 다음 명령어를 실행하여 매개변수를 입력할 수 있습니다.
gcloud config get-value project
echo "gs://${BUCKET_NAME}/codelab"
실행 이름은 자동으로 입력되지만 원하는 경우 다른 이름을 지정할 수 있습니다.
그런 다음 세 개의 매개변수 필드를 입력합니다.
project- (선택사항)
github-token working-dir
작업 디렉터리의 경우 생성한 GCS 버킷 아래의 경로를 입력합니다. 'gs://' 접두사를 포함합니다. github-token 필드에는 이전에 선택적으로 생성한 토큰을 입력하거나 토큰을 생성하지 않은 경우 자리표시자 문자열을 그대로 둡니다.

필드를 작성한 후 시작을 클릭한 다음 나열된 실행을 클릭하여 세부정보를 확인합니다. 특정 파이프라인 단계가 실행되는 동안 이를 클릭하여 포드 로그를 보는 등 자세한 정보를 확인할 수 있습니다. 클러스터 노드가 해체된 경우에도 Cloud Logging(Stackdriver) 로그 링크를 통해 파이프라인 단계의 로그를 볼 수 있습니다.

파이프라인 정의 보기
파이프라인이 실행되는 동안 파이프라인이 어떻게 구성되어 있고 무엇을 하는지 자세히 살펴보는 것이 좋습니다. 자세한 내용은 Codelab의 부록 섹션을 참고하세요.
TensorBoard에서 모델 학습 정보 보기
학습 단계가 완료되면 시각화 탭을 선택하고 파란색 TensorBoard 시작 버튼을 클릭한 다음 준비가 완료되면 TensorBoard 열기를 클릭합니다.


아티팩트 및 실행 대시보드 살펴보기
Kubeflow 파이프라인은 파이프라인이 실행될 때 파이프라인 단계에 관한 메타데이터를 자동으로 로깅합니다. 아티팩트 및 실행 정보가 모두 기록됩니다. 대시보드의 왼쪽 탐색 메뉴에서 이러한 항목을 클릭하여 자세히 알아보세요.

아티팩트의 경우 개요 패널과 계보 탐색기 패널을 모두 볼 수 있습니다.


파이프라인에서 만든 웹 앱을 가져와 몇 가지 예측 실행
파이프라인의 마지막 단계에서는 학습된 모델을 쿼리하여 예측을 수행하는 UI를 제공하는 웹 앱을 배포합니다. 이 모델은 TF Serving을 통해 제공됩니다.
파이프라인이 완료되면 서비스에 포트 전달하여 웹 앱에 연결합니다. 이 Codelab에서는 웹 앱 서비스가 외부 엔드포인트를 갖도록 설정되어 있지 않으므로 포트 전달을 사용합니다.
Cloud Shell에서 다음 명령어를 실행하여 서비스 이름을 찾습니다.
kubectl get services
목록에서 ghsumm-*-webappsvc와 같은 서비스 이름을 찾습니다.
그런 다음 Cloud Shell에서 다음과 같이 해당 서비스로 포트 전달합니다. 다음 명령어를 웹앱 서비스의 이름을 사용하도록 변경하세요.
kubectl port-forward svc/ghsumm-xxxxx-webappsvc 8080:80
포트 포워딩이 실행되면 Cloud Shell 창 위의 '미리보기' 아이콘을 클릭하고 드롭다운에서 '포트 8080에서 미리보기'를 클릭합니다.

새 탭에 다음과 같은 페이지가 표시됩니다.

무작위 문제 채우기 버튼을 클릭하여 텍스트 블록을 가져옵니다. 제목 생성을 클릭하여 학습된 모델을 호출하고 예측을 표시합니다.

파이프라인 매개변수에 유효한 GitHub 토큰이 포함된 경우 두 번째 필드에 GitHub URL을 입력한 다음 '제목 생성'을 클릭해 볼 수도 있습니다. 유효한 GitHub 토큰을 설정하지 않은 경우 '무작위 문제 채우기' 필드만 사용하세요.
4. AI Platform Notebook에서 파이프라인 실행
KFP SDK를 사용하여 Jupyter 노트북에서 Kubeflow Pipelines를 대화형으로 정의하고 실행할 수도 있습니다. 이 Codelab에서 사용할 AI Platform Notebooks를 사용하면 매우 간단합니다.
노트북 인스턴스 만들기
API를 사용하여 Cloud Shell에서 노트북 인스턴스를 만듭니다. 또는 Cloud 콘솔을 통해 노트북을 만들 수 있습니다. 자세한 내용은 문서를 참고하세요.
Cloud Shell에서 다음 환경 변수를 설정합니다.
export INSTANCE_NAME="kfp-ghsumm" export VM_IMAGE_PROJECT="deeplearning-platform-release" export VM_IMAGE_FAMILY="tf2-2-3-cpu" export MACHINE_TYPE="n1-standard-4" export LOCATION="us-central1-c"
그런 다음 Cloud Shell에서 명령어를 실행하여 노트북 인스턴스를 만듭니다.
gcloud beta notebooks instances create $INSTANCE_NAME \ --vm-image-project=$VM_IMAGE_PROJECT \ --vm-image-family=$VM_IMAGE_FAMILY \ --machine-type=$MACHINE_TYPE --location=$LOCATION
이 명령어를 처음 실행하면 프로젝트에 notebooks API를 사용 설정하라는 메시지가 표시될 수 있습니다. 그렇다면 'y'이라고 답하세요.
몇 분 후 노트북 서버가 실행됩니다. Cloud 콘솔에 나열된 노트북 인스턴스를 확인할 수 있습니다.

Codelab 노트북 업로드
노트북 인스턴스가 생성되면 이 링크를 클릭하여 Codelab의 Jupyter 노트북을 업로드합니다. 사용할 노트북 인스턴스를 선택합니다. 노트북이 자동으로 열립니다.
노트북 실행하기
실습의 나머지 부분은 노트북의 안내를 따릅니다. 노트북의 '설정' 부분에서는 나머지 노트북을 실행하기 전에 자체 값을 입력해야 합니다.
(자체 프로젝트를 사용하는 경우 돌아와서 이 실습의 '정리' 섹션을 실행하세요.)
5. 삭제
임시 Codelab 계정을 사용하는 경우 이 작업을 수행할 필요는 없지만 자체 프로젝트를 사용하는 경우 파이프라인 설치 및 노트북을 삭제하는 것이 좋습니다.
파이프라인 GKE 클러스터 중단
Cloud 콘솔에서 Pipelines 클러스터를 삭제할 수 있습니다. (GKE 클러스터를 재사용하려면 파이프라인 설치만 삭제하면 됩니다.)
AI 노트북 인스턴스 삭제
코드랩의 'Notebook' 부분을 실행한 경우 Cloud 콘솔에서 노트북 인스턴스를 삭제하거나 중지할 수 있습니다.
선택사항: GitHub 토큰 삭제
https://github.com/settings/tokens로 이동하여 생성된 토큰을 삭제합니다.
6. 부록
코드 살펴보기
파이프라인 정의
이 Codelab에서 사용되는 파이프라인은 여기에 정의되어 있습니다.
정의된 방식과 구성요소 (단계)가 정의된 방식을 살펴보겠습니다. 여기서는 몇 가지 주요 사항만 다루며 자세한 내용은 문서를 참고하세요.
Kubeflow 파이프라인 단계는 컨테이너 기반입니다. 파이프라인을 빌드할 때 이미 빌드된 컨테이너 이미지가 있는 사전 빌드된 구성요소를 사용하거나 자체 구성요소를 빌드할 수 있습니다. 이 Codelab에서는 자체적으로 빌드했습니다.
파이프라인 단계 중 4개는 구성요소 정의 파일을 통해 액세스되는 재사용 가능한 구성요소에서 정의됩니다. 이 첫 번째 코드 스니펫에서는 URL을 통해 이러한 구성요소 정의 파일에 액세스하고 이러한 정의를 사용하여 파이프라인 단계를 만드는 데 사용할 '작업'을 만듭니다.
import kfp.dsl as dsl
import kfp.gcp as gcp
import kfp.components as comp
...
copydata_op = comp.load_component_from_url(
'https://raw.githubusercontent.com/kubeflow/examples/master/github_issue_summarization/pipelines/components/t2t/datacopy_component.yaml'
)
train_op = comp.load_component_from_url(
'https://raw.githubusercontent.com/kubeflow/examples/master/github_issue_summarization/pipelines/components/t2t/train_component.yaml'
)
다음은 yaml 형식의 학습 작업에 대한 구성요소 정의 중 하나입니다. 입력, 출력, 컨테이너 이미지, 컨테이너 진입점 인수가 정의되어 있습니다.
name: Train T2T model
description: |
A Kubeflow Pipeline component to train a Tensor2Tensor
model
metadata:
labels:
add-pod-env: 'true'
inputs:
- name: train_steps
description: '...'
type: Integer
default: 2019300
- name: data_dir
description: '...'
type: GCSPath
- name: model_dir
description: '...'
type: GCSPath
- name: action
description: '...'
type: String
- name: deploy_webapp
description: '...'
type: String
outputs:
- name: launch_server
description: '...'
type: String
- name: train_output_path
description: '...'
type: GCSPath
- name: MLPipeline UI metadata
type: UI metadata
implementation:
container:
image: gcr.io/google-samples/ml-pipeline-t2ttrain:v3ap
args: [
--data-dir, {inputValue: data_dir},
--action, {inputValue: action},
--model-dir, {inputValue: model_dir},
--train-steps, {inputValue: train_steps},
--deploy-webapp, {inputValue: deploy_webapp},
--train-output-path, {outputPath: train_output_path}
]
env:
KFP_POD_NAME: "{{pod.name}}"
fileOutputs:
launch_server: /tmp/output
MLPipeline UI metadata: /mlpipeline-ui-metadata.json
아래에서 볼 수 있듯이 dsl.ContainerOp 생성자를 통해 파이프라인 단계를 정의할 수도 있습니다.
아래는 파이프라인 정의의 대부분입니다. 파이프라인 입력 (및 기본값)을 정의합니다. 그런 다음 파이프라인 단계를 정의합니다. 대부분의 경우 위에서 정의한'ops'를 사용하지만 컨테이너 이미지와 진입점 인수를 직접 지정하여 ContainerOp를 통해 인라인으로'serve' 단계를 정의하기도 합니다.
train, log_model, serve 단계에서 이전 단계의 출력을 입력으로 액세스하는 것을 확인할 수 있습니다. 자세한 내용은 여기를 참고하세요.
@dsl.pipeline(
name='Github issue summarization',
description='Demonstrate Tensor2Tensor-based training and TF-Serving'
)
def gh_summ( #pylint: disable=unused-argument
train_steps: 'Integer' = 2019300,
project: str = 'YOUR_PROJECT_HERE',
github_token: str = 'YOUR_GITHUB_TOKEN_HERE',
working_dir: 'GCSPath' = 'gs://YOUR_GCS_DIR_HERE',
checkpoint_dir: 'GCSPath' = 'gs://aju-dev-demos-codelabs/kubecon/model_output_tbase.bak2019000/',
deploy_webapp: str = 'true',
data_dir: 'GCSPath' = 'gs://aju-dev-demos-codelabs/kubecon/t2t_data_gh_all/'
):
copydata = copydata_op(
data_dir=data_dir,
checkpoint_dir=checkpoint_dir,
model_dir='%s/%s/model_output' % (working_dir, dsl.RUN_ID_PLACEHOLDER),
action=COPY_ACTION,
)
train = train_op(
data_dir=data_dir,
model_dir=copydata.outputs['copy_output_path'],
action=TRAIN_ACTION, train_steps=train_steps,
deploy_webapp=deploy_webapp
)
serve = dsl.ContainerOp(
name='serve',
image='gcr.io/google-samples/ml-pipeline-kubeflow-tfserve:v6',
arguments=["--model_name", 'ghsumm-%s' % (dsl.RUN_ID_PLACEHOLDER,),
"--model_path", train.outputs['train_output_path']
]
)
train.set_gpu_limit(1)
'train' 단계는 GPU가 하나 이상 있는 클러스터의 노드에서 실행해야 합니다.
train.set_gpu_limit(1)
파이프라인의 마지막 단계(인라인으로도 정의됨)는 조건부입니다. 학습 단계 launch_server 출력이 문자열 'true'인 경우에만 'serve' 단계가 완료된 후에 실행됩니다. 학습된 T2T 모델에서 문제 요약을 요청하는 데 사용한 '예측 웹 앱'이 실행됩니다.
with dsl.Condition(train.outputs['launch_server'] == 'true'):
webapp = dsl.ContainerOp(
name='webapp',
image='gcr.io/google-samples/ml-pipeline-webapp-launcher:v1',
arguments=["--model_name", 'ghsumm-%s' % (dsl.RUN_ID_PLACEHOLDER,),
"--github_token", github_token]
)
webapp.after(serve)
구성요소 컨테이너 이미지 정의
Kubeflow 파이프라인 문서에서는 자체 구성요소를 빌드하기 위한 몇 가지 권장사항을 설명합니다. 이 프로세스의 일환으로 컨테이너 이미지를 정의하고 빌드해야 합니다. 이 Codelab의 파이프라인 구성요소 단계는 여기에서 확인할 수 있습니다. Dockerfile 정의는 containers 하위 디렉터리에 있습니다(예: 여기).
학습에 GPU가 있는 선점형 VM 사용
선점형 VM은 최대 24시간 동안 지속되고 가용성을 보장하지 않는 Compute Engine VM 인스턴스입니다. 선점형 VM의 가격은 표준 Compute Engine VM보다 저렴합니다.
Google Kubernetes Engine (GKE)를 사용하면 선점형 VM을 사용하는 클러스터 또는 노드 풀을 쉽게 설정할 수 있습니다. 선점형 인스턴스에 GPU가 연결된 노드 풀을 설정할 수 있습니다. 이러한 노드는 일반 GPU 지원 노드와 동일하게 작동하지만 GPU는 인스턴스 수명 기간에만 지속됩니다.
다음과 유사한 명령어를 실행하고, 클러스터 이름과 영역으로 다음 명령어를 수정하고, 요구사항에 따라 가속기 유형과 개수를 조정하여 클러스터에 선점 가능 GPU 지원 노드 풀을 설정할 수 있습니다. 원하는 경우 현재 워크로드에 따라 노드 풀이 자동 확장되도록 정의할 수 있습니다.
gcloud container node-pools create preemptible-gpu-pool \
--cluster=<your-cluster-name> \
--zone <your-cluster-zone> \
--enable-autoscaling --max-nodes=4 --min-nodes=0 \
--machine-type n1-highmem-8 \
--preemptible \
--node-taints=preemptible=true:NoSchedule \
--scopes cloud-platform --verbosity error \
--accelerator=type=nvidia-tesla-k80,count=4
Cloud 콘솔을 통해 노드 풀을 설정할 수도 있습니다.
선점형 GKE 노드를 사용하는 Kubeflow 파이프라인 정의
GKE에서 Kubeflow를 실행하는 경우 이제 하나 이상의 파이프라인 단계 (구성요소)가 선점형 노드에서 실행되는 Kubeflow 파이프라인을 정의하고 실행하여 작업 실행 비용을 절감할 수 있습니다. 선점형 VM을 사용하여 올바른 결과를 얻으려면 선점형으로 식별된 단계가 멱등성 (즉, 단계를 여러 번 실행하면 결과가 동일함)이거나 중단된 경우 단계가 중단된 위치에서 다시 시작할 수 있도록 작업의 체크포인트를 지정해야 합니다.
Kubeflow 파이프라인을 정의할 때 다음과 같이 작업을 수정하여 특정 단계가 선점형 노드에서 실행되도록 지정할 수 있습니다.
your_pipelines_op.apply(gcp.use_preemptible_nodepool())
자세한 내용은 문서를 참고하세요.
노드가 선점된 경우 이 단계를 여러 번 재시도하는 것이 좋습니다. 다음과 같이 지정할 수 있습니다. 여기서는 5번의 재시도를 지정합니다.
your_pipelines_op.set_gpu_limit(1).apply(gcp.use_preemptible_nodepool()).set_retry(5)
이 Codelab에서 사용한 Kubeflow 파이프라인을 수정하여 선점형 VM에서 학습 단계를 실행해 보세요.
파이프라인 사양에서 다음 줄을 변경하여 위에 표시된 대로 선점형 노드 풀을 추가로 사용하고 5번 재시도합니다.
train.set_gpu_limit(1)
그런 다음 파이프라인을 다시 컴파일하고 새 버전을 업로드한 후 (새 이름을 지정) 새 버전의 파이프라인을 실행합니다.

