콘텐츠로 이동하기
컨테이너 및 Kubernetes

GPU 를 지원하는 GKE Autopilot 에서의 TensorFlow

2023년 8월 21일
https://storage.googleapis.com/gweb-cloudblog-publish/images/cloudmigration_2022.max-2500x2500.max-2500x2500.png
William Denniss

Group Product Manager, Google Kubernetes Engine

최근 머신러닝과 인공지능에 대한 관심이 높아지면서 AI/ML 워크로드를 실행하기에 가장 적합한 환경이 어디인지 궁금해질 수 있습니다.

그래서 Google Cloud는 GPU가 지원되는 Google Kubernetes Engine(GKE) Autopilot 운영 모드를 만들었습니다. Autopilot이 모든 인프라를 관리하기 때문에  사용자는 추론, 학습, 기타 GPU 작업과 같은  AI/ML 워크로드 실행에만 집중할 수 있습니다. 컨테이너로된 Pod 또는 Job 명세를  Autopilot에 스케줄링하기만 하면 GKE에서 적절한 GPU를 프로비저닝하고 워크로드를 실행합니다. 또한 Job이 실행 중일 때만 비용이 청구 되기 때문에 Job이 완료되거나 수동으로 종료되면 즉시 비용 청구가 중단되며 정리는 GKE가 합니다.

너무 좋아서 믿기 어렵다고요??

이 게시글에서 AI/ML 워크로드의 생성, 실행 및 종료 과정을 보겠습니다. 워크로드는 NVIDIA T4에서 실행되는 Tensorflow-enabledJupyter 노트북으로, 다양한 AI/ML 학습 샘플을실행하는 데 사용할 수 있습니다. Jupyter 노트북은 AI/ML을 익히고 실험하기에 유용합니다. 게다가 Google Cloud에서 영구 디스크를 마운트하면 실행 동안의 작업을 보존할 수도 있습니다.

다음은 저의 데모 동영상입니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/maxresdefault-1_lXQPSR6.max-1300x1300.jpg

설정

먼저 GKE Autopilot 클러스터를 만듭니다. GPU를 사용할 수 없는 리전도 있으므로 GPU가 제공되는 리전 중에 원하는 리전을 선택합니다(여기서는 NVIDIA T4 사용). GPU가 제공되는 리전은 Autopilot 가격표에서 확인할 수 있습니다.

클러스터를 만듭니다.

로드 중...

설치

이제 GPU 가속이 적용되는 Tensorflow-enabled Jupyter 노트북을 배포할 수 있습니다.

다음 StatefulSet 정의에서는 TensorFlow 환경에서 Jupyter 노트북을 제공하는 tensorflow/tensorflow:latest-gpu-jupyter 컨테이너의 인스턴스를 생성합니다. 이 인스턴스는 NVIDIA T4 GPU를 프로비저닝하고, /tf/saved 경로에 PersistentVolume을 마운트하여 작업을 저장할 수 있도록 하며 저장된 작업은 다시 시작한 후에도 보존됩니다. 또한 Spot에서 실행되므로 비용이 60~91% 절감됩니다. 작업은 선점된 경우에 저장된다는 점에 유의하세요.

그야말로 오랫동안 사용할 수 있는 제대로 된 Jupyter 노트북입니다.

로드 중...

데스크톱에서 이 노트북에 연결할 수 있도록 부하분산기도 필요합니다.

로드 중...

다음과 같이 배포합니다.

로드 중...

기다리는 동안 클러스터의 이벤트를 보고 다음과 같이 정상 작동하는지 확인할 수 있습니다 (관련 이벤트가 표시되도록 출력을 편집).

로드 중...

Kubernetes와 Autopilot이 작동하면서 처음에는 FailedScheduling이 표시되는데, 이는 코드를 배포하는 시점에는 PoD를 처리할 리소스가 없기 때문입니다. 그러나 이후 Autopilot이 리소스를 추가하면서 TriggeredScaleUp이 표시되고, PoD에 리소스가 할당되면 마지막으로 Scheduled가 표시됩니다. GPU 노드는 일반 CPU 노드에 비해 프로비저닝에 시간이 조금 더 걸리므로 이 컨테이너는 부팅하는 데 시간이 약간 걸립니다. 저의 경우 PoD 예약부터 실행까지 약 5분이 소요되었습니다.

노트북 사용

이제 연결할 차례입니다. 먼저 부하 부산기의 외부 IP를 찾습니다.

로드 중...

해당 IP로 연결합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_1_cl7bVTX.max-800x800.png

exec를 사용하여 Kubernetes에서 제안하는 명령을 실행할 수 있습니다.

로드 중...

토큰(저의 경우 e54a0e8129ca3918db604f5c79e8a9712aa08570e62d2715)을 복사하여 넣고 로그인합니다.

참고: 이 단계를 건너뛰려면 설정에서 자체 토큰을 설정한 후 env 줄의 주석 처리를 삭제하고 자체 토큰을 정의하면 됩니다.

몇 가지 샘플이 포함된 폴더와 영구디스크를 마운트 한 “'saved'라는 2개의 폴더가 있습니다. 세션 간에 상태를 유지하려면 'saved' 폴더에서 작업하는 것을 권장하고, 시작하기 전에 'tensorflow-tutorials' 디렉터리를 'saved' 디렉터리로 옮기는 것이 좋습니다. 아래 UI를 사용하여 폴더를 옮기고 자체 노트북을 업로드할 수 있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_2_tvS2Dgi.max-800x800.png

포함된 샘플 몇 가지를 실행해 보겠습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_3_CB9qXuk.max-1400x1400.png

classification.ipynb 예시

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_4.max-1400x1400.png

overfit_and_underfit.ipynb 예시

Tensorflow 문서의 예시와 같이 자체 프로젝트를 업로드할 수 있습니다. 이 문서에서 예제 을 다운로드한 후 jupyter의 saved/ 폴더에 업로드하고 실행합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_5.max-1500x1500.png

Tensorflow basics.ipynb 튜토리얼(GPU 가속 활용)

이렇게 해서 NVIDIA T4에서 실행되는 재사용 가능한 TensorFlow Jupyter 노트북이 생성되었습니다. 이것은 단순한 장난감이 아닙니다. PersistentVolume을 연결했으므로 작업이 저장됩니다. 심지어 StatefulSet가 삭제되거나 PoD가 중단된 경우에도 저장됩니다. 비용을 절감하기 위해 Spot 컴퓨팅을 사용합니다. 전체가 YAML 파일 2개로 프로비저닝되었으며, 컴퓨팅 하드웨어에 대해서는 신경을 쓸 필요가 없습니다. 정말 간단합니다.

모니터링 및 문제 해결

'커널이 죽은 것 같습니다. 자동으로 다시 시작됩니다(The kernel appears to have died. It will restart automatically).'와 같은 메시지가 표시된다면 첫 번째 단계로 로그를 살펴봅니다.

로드 중...

노트북 2개를 실행할 때 발생하는 일반적인 문제는 GPU 메모리가 소진될 수 있다는 점입니다(로그에서 CUDA_ERROR_OUT_OF_MEMORY). 간단한 해결 방법은 현재 사용하고 있는 노트북을 제외한 나머지 노트북을 모두 종료하는 것입니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_6.max-900x900.png

다음과 같이 GPU 사용률을 관찰할 수 있습니다.

로드 중...

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_7.max-800x800.png

어떤 이유로든 설정을 다시 시작해야 하는 경우에는 PoD를 삭제하기만 하면 Kubernetes가 이를 자동으로 다시 생성합니다. Autopilot에서는 이 과정이 매우 빠르게 진행됩니다. GPU 노드 리소스가 클러스터에서 대기하는 시간이 짧기 때문입니다.

로드 중...

다음 단계

Shell 환경에서 임의의 코드를 실행하려면(즉, 노트북 UI를 사용하지 않고) 다음을 사용할 수 있습니다. 보존하려는 데이터를 /tf/saved/에 저장해야 합니다.

로드 중...

튜토리얼을 더 보려면 TensorFlow 튜토리얼Keras를 참조하세요.

저는 모든 튜토리얼들을 내 노트북에 저장하기 위해 Keras repo를 나의 영구 볼륨에 클론했습니다.

로드 중...

노트북에 추가 Python 모듈이 필요한 경우(예: Pandas)에도 동일한 방법으로 설정할 수 있습니다. 그러나 더 지속성 있는 설정을 만들려면 위에서 사용한 것을 확장하는 자체 Dockerfile이 필요합니다. 

몇 가지 다양한 예시를 실행했고 출력은 다음과 같습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_8.max-600x600.png

Keras timeseries/ipynb/timeseries_weather_forecasting.ipynb 예시의 출력

https://storage.googleapis.com/gweb-cloudblog-publish/images/Blog_9.max-1300x1300.png

Keras generative/ipynb/text_generation_with_miniature_gpt.ipynb 예시의 epoch random iteration

정리하기

GPU는 값싼 리소스가 아니므로 작업을 마친 후에는 리소스를 삭제해야 합니다. 다음과 같이 StatefulSet 과 Service를 제거해서 정리하세요.

로드 중...

위에서 언급했듯이, Autopilot의 장점은 Kubernetes 리소스(여기서는 StatefulSet 및 부하분산기)를 삭제하면 관련 비용의 청구가 종료된다는 점입니다.

이제 남은 것은 영구 디스크입니다. 그냥 두거나(이 경우 위의 StatefulSet를 다시 만들면 영구 디스크가 다시 연결되고 작업이 저장됨), 더 이상 필요가 없으면 디스크도 삭제합니다.

로드 중...

클러스터 역시 더 이상 필요 없다면 삭제할 수 있습니다.

로드 중...

다음 단계

지금까지 Autopilot에서 GPU 워크로드를 얼마나 손쉽게 실행할 수 있는지 살펴봤습니다. 

필요한 GPU 리소스를 포함하여 Kubernetes 워크로드를 정의하기만 하면 나머지는   알아서 처리합니다. 작업을 마친 후 워크로드를 삭제하면 비용 청구도 즉각 중단되므로 노드 정리에 대해 신경 쓸 필요가 없습니다.

https://console.cloud.google.com/kubernetes로 이동하면  GKE 클러스터를 시작할 수 있으며, Google Cloud를 처음 사용하는 경우 $300 무료 체험판을 꼭 사용해 보시기 바랍니다.

게시 위치