1. 소개
Kubeflow는 Kubernetes용 머신러닝 도구 모음입니다. 이 프로젝트는 Kubernetes에서 머신러닝 (ML) 워크플로의 배포를 간단하고 이동성 및 확장 가능하도록 만드는 데 전념하고 있습니다. 목표는 최상의 ML용 오픈소스 시스템을 다양한 인프라에 배포할 수 있는 간단한 방법을 제공하는 것입니다. | |
머신러닝 워크플로에는 데이터 준비 및 분석부터 학습, 평가, 배포에 이르기까지 서로 종속된 많은 단계가 포함될 수 있습니다. 이러한 프로세스를 임시로(예를 들어 일련의 노트북 또는 스크립트에서) 구성하고 추적하기는 어렵고 감사 및 재현성 같은 문제가 점점 더 문제가 됩니다.Kubeflow Pipelines(KFP)는 모니터링, 감사, 버전 추적, 재현 가능성과 함께 강력하고 반복 가능한 머신러닝 파이프라인을 배포하는 방법을 제공하여 이러한 문제를 해결하는 데 도움이 됩니다. Cloud AI 파이프라인을 사용하면 KFP 설치를 쉽게 설정할 수 있습니다. |
빌드할 항목
이 Codelab에서는 Kubeflow Pipelines를 사용하여 모델을 학습시키고 제공하는 GitHub 문제를 요약하는 웹 앱을 빌드합니다. Kubeflow 예시 저장소의 예시를 기반으로 합니다. 완료되면 인프라에 다음이 포함됩니다.
- Cloud AI Pipelines를 통해 Kubeflow Pipelines가 설치된 Google Kubernetes Engine(GKE) 클러스터
- GPU에서 Tensor2Tensor 모델을 학습시키는 파이프라인
- 학습된 모델에서 예측을 제공하는 서빙 컨테이너
- 예측을 해석하여 GitHub 문제에 대한 요약을 제공하는 UI
- Kubeflow Pipelines (KFP) SDK를 사용하여 파이프라인을 처음부터 만드는 노트북
학습할 내용
빌드할 파이프라인은 GitHub 문제 데이터를 기반으로 Tensor2Tensor 모델을 학습시키고 문제 본문에서 문제 제목을 예측하는 방법을 학습합니다. 그런 다음 학습된 모델을 내보내고 Tensorflow Serving을 사용하여 내보낸 모델을 배포합니다. 파이프라인의 마지막 단계에서는 웹 앱을 실행합니다. 웹 앱은 TF-Serving 인스턴스와 상호작용하여 모델 예측을 수행합니다.
- GKE 클러스터에 Kubeflow Pipelines를 설치하는 방법
- Kubeflow Pipelines를 사용하여 ML 워크플로를 빌드하고 실행하는 방법
- AI Platform Notebook에서 파이프라인을 정의하고 실행하는 방법
필요한 항목
- Kubernetes에 대한 기본적인 이해가 유용하지만 필수는 아님
- 소유자 권한이 있는 활성 GCP 프로젝트
- (선택사항) GitHub 계정
- Google Cloud Shell에 대한 액세스(Google Cloud Platform(GCP) 콘솔에서 사용 가능)
2. 설정
Cloud Shell
브라우저에서 GCP Console로 이동하여 프로젝트 사용자 인증 정보로 로그인합니다.
'프로젝트 선택'을 클릭합니다. 필요에 따라 Codelab 프로젝트로 작업할 수 있습니다.
그런 다음 'Cloud Shell 활성화'를 클릭합니다. 아이콘을 클릭하여 Cloud Shell을 시작합니다.
Cloud Shell을 시작하면 사용하도록 설정된 프로젝트의 이름이 표시됩니다. 설정이 올바른지 확인하세요.
프로젝트 ID를 찾으려면 GCP 콘솔의 홈 패널로 이동합니다. 화면이 비어 있으면 '예'를 클릭합니다. 대시보드를 만듭니다
그런 다음 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 및 Storage 대시보드를 고정합니다.
AI Platform Pipelines (호스팅된 Kubeflow Pipelines) 설치 만들기
'시작하기 전에' '인스턴스 설정'을 클릭하고 KFP가 설치된 GKE 인스턴스를 설정하는 방법은 여기를 참조하세요. 문서에 나와 있는 대로 다음 Cloud API에 대한 액세스 허용 체크박스를 선택해야 합니다. 그렇지 않으면 예시 파이프라인이 성공적으로 실행되지 않습니다. 설치 네임스페이스는 default
로 둡니다.
Nvidia k80s를 지원하는 영역을 선택해야 합니다. 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 콘솔에서 파이프라인 패널로 이동합니다. 그런 다음 '파이프라인 대시보드 열기'를 클릭합니다. 왼쪽 메뉴 바에서 Pipelines(파이프라인)를 클릭합니다. 로드 오류가 발생하면 탭을 새로고침하세요. 다음과 같은 새 페이지가 표시됩니다.
파이프라인 설명
실행할 파이프라인에는 여러 단계가 있습니다 (자세한 내용은 이 Codelab의 부록 참고).
- 기존 모델 체크포인트가 버킷에 복사됩니다.
- Tensor2Tensor 모델은 전처리된 데이터를 사용하여 학습됩니다.
- 학습은 첫 번째 단계에서 복사한 기존 모델 체크포인트에서 시작된 후 수백 개의 단계에 걸쳐 학습됩니다. (Codelab을 진행하는 동안 완전히 학습하는 데 시간이 너무 오래 걸립니다.)
- 학습이 완료되면 파이프라인 단계에서 TensorFlow Serving 제공에 적합한 형식으로 모델을 내보냅니다.
- TensorFlow 제공 인스턴스는 해당 모델을 사용하여 배포됩니다.
- 제공된 모델과 상호작용하여 예측을 검색하기 위한 웹 앱이 실행됩니다.
파이프라인 다운로드 및 컴파일
이 섹션에서는 파이프라인 정의를 컴파일하는 방법을 알아봅니다. 가장 먼저 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"
실행 이름은 자동으로 입력되지만 원하는 경우 다른 이름을 지정할 수 있습니다.
그런 다음 매개변수 필드 3개를 작성합니다.
project
- (선택사항)
github-token
working-dir
work-dir의 경우 앞서 만든 GCS 버킷 아래에 경로를 입력합니다. ‘gs://
’ 포함 를 입력합니다. github-token
필드에는 이전에 선택사항으로 생성한 토큰을 입력하거나 자리표시자 문자열을 토큰을 생성하지 않은 경우 그대로 둡니다.
필드를 작성한 후 Start(시작)를 클릭한 다음 나열된 실행을 클릭하여 세부정보를 확인합니다. 특정 파이프라인 단계가 실행되는 동안 해당 단계를 클릭하면 포드 로그 보기를 비롯한 자세한 정보를 얻을 수 있습니다. (클러스터 노드가 해제되더라도 Cloud Logging (Stackdriver) 로그에 대한 링크를 통해 파이프라인 단계의 로그를 볼 수도 있습니다.)
파이프라인 정의 보기
파이프라인이 실행되는 동안 어떻게 구성되어 있는지 자세히 살펴볼 수 있습니다. 자세한 내용은 Codelab의 부록 섹션을 참고하세요.
텐서보드에서 모델 학습 정보 보기
학습 단계가 완료되면 시각화 탭을 선택하고 파란색 텐서보드 시작 버튼을 클릭한 다음, 준비되면 텐서보드 열기를 클릭합니다.
아티팩트 및 실행 대시보드 살펴보기
Kubeflow Pipelines는 파이프라인이 실행될 때 파이프라인 단계에 대한 메타데이터를 자동으로 로깅합니다. Artifact 및 Artifact 정보가 모두 기록됩니다. 대시보드의 왼쪽 탐색 메뉴에서 이러한 항목을 클릭하여 더 자세히 살펴보세요.
아티팩트의 경우 개요 패널과 계보 탐색기 패널을 모두 볼 수 있습니다.
파이프라인으로 만든 웹 앱 불러오기 및 예측 수행
파이프라인의 마지막 단계에서는 TF Serving을 통해 제공되는 학습된 모델을 쿼리하기 위한 UI를 제공하여 예측을 수행하는 웹 앱을 배포합니다.
파이프라인이 완료되면 서비스에 포트 전달을 통해 웹 앱에 연결합니다. 이 Codelab에서는 웹 앱 서비스가 외부 엔드포인트를 포함하도록 설정되지 않았으므로 포트 전달을 사용합니다.
Cloud Shell에서 다음 명령어를 실행하여 서비스 이름을 찾습니다.
kubectl get services
목록에서 ghsumm-*-webappsvc
와 같은 서비스 이름을 찾습니다.
그런 다음 Cloud Shell에서 webappsvc의 이름을 사용하도록 다음 명령어를 변경하여 다음과 같이 해당 서비스로 포트 전달합니다.
kubectl port-forward svc/ghsumm-xxxxx-webappsvc 8080:80
포트 전달이 실행되면 '미리보기'를 클릭합니다. 아이콘을 클릭하고 드롭다운에서 '포트 8080에서 미리보기'를 클릭합니다.
새 탭에 다음과 같은 페이지가 표시됩니다.
무작위 문제 채우기 버튼을 클릭하여 텍스트 블록을 가져옵니다. 제목 생성을 클릭하여 학습된 모델을 호출하고 예측을 표시합니다.
파이프라인 매개변수에 유효한 GitHub 토큰이 포함된 경우 두 번째 필드에 GitHub URL을 입력한 다음 'Generate Title'(제목 생성)을 클릭해도 됩니다. 유효한 GitHub 토큰을 설정하지 않은 경우 'Population Random Issue'만 사용합니다. 필드를 확인합니다.
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 콘솔에 나열된 Notebook 인스턴스를 확인할 수 있습니다.
Codelab 노트북 업로드
노트북 인스턴스가 생성되면 이 링크를 클릭하여 Codelab의 Jupyter 노트북을 업로드합니다. 사용할 노트북 인스턴스를 선택합니다. 노트북이 자동으로 열립니다.
노트북 실행
실습의 나머지 부분은 노트북의 안내를 따릅니다. '설정' 부분이 있으면 나머지 노트북을 실행하기 전에 자체 값을 입력해야 합니다.
(자체 프로젝트를 사용 중인 경우 잊지 말고 돌아와서 이 실습의 '삭제' 섹션을 진행해야 합니다.)
5. 삭제
임시 Codelab 계정을 사용하는 경우에는 이 작업을 수행할 필요가 없지만, 자체 프로젝트를 사용하는 경우 파이프라인 설치 및 노트북을 중단할 수 있습니다.
Pipeline GKE 클러스터 중단
Cloud 콘솔에서 파이프라인 클러스터를 삭제할 수 있습니다. GKE 클러스터를 재사용하려면 파이프라인 설치만 삭제하면 됩니다.
AI 노트북 인스턴스 삭제
'노트'를 실행한 경우 Codelab의 일부인 경우 Cloud 콘솔에서 노트북 인스턴스를 삭제하거나 중지할 수 있습니다.
선택사항: GitHub 토큰 삭제하기
https://github.com/settings/tokens로 이동하여 생성된 토큰을 삭제합니다.
6. 부록
코드 살펴보기
파이프라인 정의
이 Codelab에서 사용된 파이프라인은 여기에 정의되어 있습니다.
이제 이 속성이 정의되는 방식과 구성요소 (단계)가 어떻게 정의되는지 살펴보겠습니다. 몇 가지 주요 사항을 다루지만 자세한 내용은 문서를 참조하세요.
Kubeflow 파이프라인 단계는 컨테이너 기반입니다. 파이프라인을 빌드할 때는 사전 빌드된 구성요소를 이미 빌드된 컨테이너 이미지와 함께 사용하거나 자체 구성요소를 빌드할 수 있습니다. 이 Codelab에서는 직접 빌드했습니다.
파이프라인 단계는 재사용 가능한 구성요소에서 정의되며 구성요소 정의 파일을 통해 액세스합니다. 이 첫 번째 코드 스니펫에서는 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
를 통해 인라인으로 컨테이너 이미지와 진입점 인수를 직접 지정합니다.
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' 1개 이상의 GPU가 있는 클러스터의 노드에서 실행되는 단계를 따릅니다.
train.set_gpu_limit(1)
파이프라인의 마지막 단계(인라인으로도 정의됨)는 조건부 단계입니다. ‘serve
’ 이후에 실행됩니다. 학습 단계 launch_server
출력이 문자열 'true'인 경우에만 종료됩니다. 학습된 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 Pipelines를 정의하고 실행하기가 쉬워져 작업 실행 비용을 절감할 수 있습니다. 선점형 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)
그런 다음 파이프라인을 다시 컴파일하고 새 버전을 업로드한 후 (새 이름을 지정) 새 버전의 파이프라인을 실행합니다.