
Terraform으로 Google Cloud GPU 서버 구축하기
falconlee236
·2025. 1. 10. 22:29
왜 이 프로젝트를 시작했는가?
- BOAZ 동아리에서 강화학습 논문을 작성하는 프로젝트를 수행 중
- 논문 작성에 사용되는 모델 실험에 필요한 GPU서버가 필요
- 논문 작성에 사용되는 모델의 학습은 보통 하루에서 길면 일주일 정도 서버를 켜둬야 하는 상황
- 가난한 학생 신분에서 무료로 GPU를 사용할 수 있는 방법을 강구
- 코랩은 매우 좋은 GPU인 T4를 무료로 사용할 수 있지만 하루에 사용량이 정해져 있기 때문에 엄청난 GPU 사용량을 계속해서 요구하는 논문 모델 학습에 효과적이지 않음
- 동료들이 각자 가지고 있는 GPU 서버를 사용하려 했지만 우리가 사용하는 강화학습 프레임워크인 rl4co는 cuda 12.1버전 이상을 요구했으며 이는 동료들이 가지고 있는 cuda 11.7, 11.8과 호환되지 않아서 학습이 불가
- 신규 가입시 300달러 크레딧을 무료로 제공해주며, 강력한 GPU서버 + 강력한 CPU 서버를 동시에 지원하는 구글 클라우드 플랫폼으로 결정
- AWS는 무료가 아니라 배제
- Azure는 구글보다 적은 200달러를 지원하기 때문에
- 우리들은 GCP를 사용하기로 결정
- 크레딧을 다 사용하면 새로 아이디를 만들어서 계속 크레딧을 충전할 계획
🚀 주요 기능
- GCP Compute Engine: NVIDIA T4 GPU와 n1-standard-8 머신 타입으로 구성된 강력한 인스턴스
- GCP VPC: 자체 VPC 네트워크 및 서브넷 설정
- AWS S3 & DynamoDB: AWS S3와 DynamoDB를 사용한 Terraform 상태 관리
- Docker 및 GitHub 통합: Docker와 GitHub을 활용한 자동 코드 배포 및 환경 설정
🛠️ 주요 특징
- 자동화된 설정: Terraform을 통해 코드 한 줄로 모든 클라우드 리소스 구축 가능
- GPU 최적화: 딥러닝 환경에 적합한 NVIDIA GPU와 CUDA 12.4 지원
- 보안 강화: SSH 접근을 위한 보안 설정 및 GitHub SSH 키 통합
- 유연성: 다양한 GCP 리전과 머신 타입을 지원하며, 필요에 맞는 환경을 손쉽게 설정할 수 있다.
💡 사용 사례
- 딥러닝 프로젝트: PyTorch, TensorFlow와 같은 프레임워크를 위한 GPU 인스턴스를 설정하여 빠르고 효율적인 학습 환경 구축
- 클라우드 환경 구축: 자동화된 클라우드 리소스 배포로 운영 효율성 극대화
- AWS와 GCP의 융합 사용: AWS S3와 DynamoDB를 활용한 Terraform 상태 관리
📦 Repository 구성
이 프로젝트는 GitHub에서 확인할 수 있으며, 필요한 파일 구조와 설정 방법은 아래와 같다.
.
├── create_server_with_dynamic_zones.sh
├── credentials.json
├── LICENSE
├── Makefile
├── README.md
├── .env
├── .ssh
| ├── id_ed25519
| └── id_ed25519.pub
└── src
├── main.tf
├── modules
│ ├── vpc
│ │ ├── main.tf
│ │ └── variables.tf
│ └── worker
│ ├── main.tf
│ └── variables.tf
├── s3_init
│ ├── main.tf
│ ├── provider.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
├── terraform.tfstate
├── terraform.tfstate.backup
└── variables.tf
🚀 시작하는 방법
자세한 사용법은 README에서 확인할 수 있다. 물론 영어로 작성했다.
트러블 슈팅 경험
이 프로젝트의 가장 큰 문제는 GPU를 원하는 시간에 얻을 수 없다는 점이였다. 전세계 AI 열풍으로 인해 GPU 품귀현상이 발생했고 테라폼 코드로 GPU를 요청해도 계속 현재 시간에는 리소스가 부족하다는 이유로 구글에서 GPU 리소스 생성을 거부했다.
그렇기 때문에 가용한 리전과 지역을 모두 조합해야하는데, 구글 클라우드에서 사용할 수 있는 전 세계 20개의 리전과 각 리전이 3개의 지역을 가지고 있고, 심지어 각 리전마다 사용할 수 있는 gpu와 machine type이 정해져있다.
어떤 시간에 내가 원하는 gpu와 machine type이 사용 가능한지 경우의 수를 이용해서 일일이 조합해서 파악하기는 불가능하기 때문에 너무나도 골머리를 앓았다. 그래서 내 생각의 흐름은 다음과 같다.
1. 언제 내가 원하는 지역에 GPU를 사용할 수 있는것이지? -> time base 접근
나는 한국에 살기 때문에 구글 기준으로는 `asia-east1`, `asia-east1-c` 를 사용해야 한다. 다른 지역을 사용해도 괜찮냐고 말할 수 있지만 자신이 살고있는 지역과 가까운 리전과 존을 선택해야 비용이 절약되기 때문에 지역을 선택하는 것은 중요하다.
그래서 내가 직접 테라폼 코드를 실행하며 언제 사람들이 GPU 를 잘 쓰지 않는지 몸으로 뛰어가며 확인한 결과 오후 1시부터 4시 사이에는 10번 시도중 8번 성공을 하면서 이때가 가장 높은 확률로 GPU를 내가 얻을 수 있다는 결론을 얻었다.
그래서 github action의 crontab 기능을 활용해서 1시에 GPU를 생성하는 스크립트를 실행하고, 12시에 GPU 서버를 삭제하는 자동화 코드를 생성해서 문제를 해결했다.
하지만 이 방법은 오랜 기간 학습을 해야하는 딥러닝 특성상 학습도중에 서버가 삭제될수 있기 때문에 좋지 않은 방법이였다.
2. 현재 실제로 사용가능한 지역의 조합을 모두 시도해보면 되지 않을까? -> brute-force 접근
사실 이 방법이 제일 무식하지만 확실하다. 하지만 이 방법의 맹점이 있는데, 구글에서 제공하는 Api 명령어를 사용해서 현재 사용가능한 지역과 존을 찾아도 막상 해당 지역과 존으로 gpu 생성을 시도해보면 되지 않는다.......
그렇기 때문에 일일이 찾는 것보다는 그냥 스크립트로 돌리면 어떨까 생각을 했고, 내 생각은 적중했다.
구글에서 제공하는
다음 명령어를 사용하면 내가 원하는 머신 타입이 어디서 사용 가능한지 알 수 있다. 여기에 grep으로 아시아만 범위를 한정했다.
이 명령어를 사용하면 내가 원하는 GPU가 현재 어디서 사용가능한지 알 수 있다. 마찬가지로 범위 한정.
이것을 awk로 잘 포맷팅하고 comm 명령어로 교집합을 구하면? 현재 사용가능한 zone와 region이 나온다.
이 모든 조합을 while문으로 싹 돌리면 끝.
여기서 주의해야할 점은 만약 생성이 실패하면 서버만 생성이 실패한것이기 때문에 함께 생성하던 gcp vpc나 gcp cloud storage는 모두 삭제해야 한다는 점이다. 근데, 이걸 바로 삭제하면 gcp에서 결과 반영 지연시간 때문에 이미 사용하고 있다는 오류가 발생. 그렇기 때문에 30초정도 sleep하다가 삭제 명령어를 실행하면 된다.
그럼 동적으로 테라폼 변수를 어떻게 바꾸는지 궁금한 사람도 있는데, 환경변수에 TF_VAR라는 suffix를 기존 테라폼 변수 에 사용하면 테라폼변수로 인식한다.이것을 이용해서 동적으로 테라폼 변수를 변경한다.
많은 관심 부탁드린다. STAR는 큰 힘이 되어요
'개발' 카테고리의 다른 글
공식 문서 번역 모음 깃헙 레포를 오픈했습니다. (0) | 2024.08.17 |
---|