Doby's Lab

GPU 없이 Colab(코랩)으로 AI를 하고 있는 당신에게 전하는 3가지 팁 본문

Code about AI/etc

GPU 없이 Colab(코랩)으로 AI를 하고 있는 당신에게 전하는 3가지 팁

도비(Doby) 2024. 10. 25. 00:28

✅ Introduction

많은 사람들이 AI를 공부하면서 모델을 학습시킬 수 있는 능력들을 갖추었지만, 개인 GPU를 보유하고 있는 경우는 많이 없습니다. 이에 대한 해결책으로 Google의 Colab을 많이 사용합니다. 하지만, Colab 자체가 본질적으로는 가상 머신이다 보니 개인 컴퓨터에 GPU가 있는 환경과 다른 부분들이 있습니다. 다시 말해서, 모델 학습을 시키는 작업을 할 때, 추가적인 작업들을 필요로 합니다.
 
그래서, 이러한 추가적인 작업들에 대해 지난 경험들을 바탕으로 얻은 팁들을 다루어보고자 합니다. 정리하고자 하는 팁들은 새로운 작업들을 뜻하는 것은 아니고, 기존 작업들을 더 효율적으로 처리할 수 있는 방법들입니다.
 
GPU를 갖고 있는 일반적인 환경이라면 작업을 수행하는 소스 코드, 데이터셋, 가중치 파일 등이 모두 한 곳에 있기 때문에 이 구성 요소들을 옮기는 작업은 불필요합니다. 하지만, Colab이라는 가상 머신은 런타임을 실행할 때마다 새로운 환경이 주어집니다. 즉, Colab에서는 매번 새롭게 실행할 때마다 각 요소들을 가져올 수 있어야 합니다. 가져오는 방법에 따라 실행 시간이 오래 걸리는 경우들이 많습니다.
 
그래서, 본 포스팅에서는 각 요소들(소스 코드, 데이터셋, 가중치 파일)을 효율적으로 옮기는 방법들에 대해 정리합니다.


📄 1. 소스 코드 복제 및 코드 모듈화 역량

소스 코드를 Colab에 가져오는 방법은 깃허브의 리포지토리를 복제하고, 리포지토리가 있는 디렉터리로 이동하여 사용하는 방법이 일반적입니다. 제가 제안하는 방법도 이와 똑같은 방법이기 때문에, 굳이 이 글에 적을 필요는 없습니다.

# 복제하기
!git clone [리포지토리 주소]

# 복제한 리포지토리로 이동하기
os.chdir("[복제한 리포지토리 경로]")

하지만, 일반적으로 복제해 오는 경우는 다른 사람의 코드를 복제하는 경우가 많습니다. 이 단락에서 말하고자 하는 것은 오픈 소스와 같은 형태의 코드를 작성할 수 있는 역량을 구축해야 한다는 것입니다. 로컬에서 오픈 소스의 형태로 코드를 작성하여, 이를 깃허브 리포지토리에 올립니다. 그리고, Colab에서 학습을 위해 본인의 리포지토리를 복제할 수 있도록 하는 능력을 필요로 합니다. 이러한 역량을 갖추기 위해서는 모듈화(패키지), argparse, venv에 대해서 알고 있으면 좋습니다.

 
아래 링크에서는 대부분의 딥러닝 오픈 소스가 가지는 공통적인 특징들을 템플릿입니다. 해당 템플릿을 가지고 본인의 목적에 맞게끔 수정하여 모델을 학습시킬 수 있습니다. 그 아래의 링크에서는 필자가 작성한 소스 코드입니다. 템플릿의 복잡한 내용들을 덜어내어, MNIST 데이터셋을 간단하게 Convolutional Network를 학습시키는 소스 코드 리포지토리입니다.
 
첫 키워드부터 글의 전체적인 목적과 어긋나는 것이 있지만, 이러한 역량은 딥러닝을 하는 사람으로서 알고 있으면 많은 부분들이 편해지는 역량입니다.

GitHub - victoresque/pytorch-template: PyTorch deep learning projects made easy.

PyTorch deep learning projects made easy. Contribute to victoresque/pytorch-template development by creating an account on GitHub.

github.com

GitHub - drawcodeboy/ConvNet-for-MNIST

Contribute to drawcodeboy/ConvNet-for-MNIST development by creating an account on GitHub.

github.com


📄 2. 데이터셋 접근

데이터셋의 경우, Colab에서 학습시킬 때는 Google Drive에 업로드해 두고, 런타임 실행 중에 Drive와 마운트 하여 데이터를 가져오는 것이 일반적입니다.
 
하지만, 마운트를 하고 난 후 데이터셋이 여전히 Drive에 있다면 학습 및 추론 속도가 매우 느립니다. 이에 대한 이유는 학습 및 추론을 하는 과정에서 배치를 가져올 때, 계속 Drive에 접근을 해야 하기 때문입니다.
 
그래서, 마운트를 하고 난 후에 데이터셋을 Drive에서 Colab 가상 머신 내부 경로로 복사시키고, 데이터셋 관련 코드에서 데이터에 접근하는 주소를 Colab 가상 머신 경로로 설정해 두면 Drive에 접근할 필요가 없어지기 때문에 매우 빨라집니다. 즉, 소스 코드와 데이터셋을 동일한 환경에 위치시킨다는 의미입니다.

이 과정에서는 데이터셋을 zip으로 관리하고 마운트했을 때 압축을 푸는 게 빠르고 데이터를 안전하게 이동할 수 있습니다. 마운트한 zip 파일은 파이썬 모듈을 통해 압축을 풀 수 있습니다.

(왼) 데이터셋 복사 전, (오) 데이터셋 복사 후

이와 같은 과정을 수행하기 위해서 위 1번(소스 코드)을 Colab 가상 머신에 복제합니다. 그 후, os, zipfile 라이브러리를 활용하여 아래와 같은 셀을 작성하여 Drive에 있던 데이터셋을 Colab 가상 머신으로 복사할 수 있습니다. (아래의 셀은 데이터셋이 zip 파일인 경우에 해당합니다.)

import os
import zipfile

zip_file_name = "[Drive 내에 데이터셋 경로]"

os.mkdir("[Colab 가상 머신 내에 데이터셋을 위치할 경로 + 디렉터리 이름]")

extraction_dir = "[Colab 가상 머신 내에 데이터셋을 위치할 경로 + 디렉터리 이름]"

# Drive에서 Colab 가상 머신으로
with zipfile.ZipFile(zip_file_name, 'r') as zip_ref:
    zip_ref.extractall(extraction_dir)

📄 3. 가중치 파일(.pth) 다운로드

모델을 학습시킨 후에 생성된 가중치 파일은 런타임이 중지되면 사라집니다. 그렇기 때문에 가중치 파일을 본인의 로컬 환경에 다운로드하는 것은 일반적입니다.
 
다운로드하는 방법은 일반적으로 2가지 방법이 제안됩니다. 첫 번째는 Colab 좌측 탭의 [파일]에 들어가서 원하는 파일에 마우스를 올린 후에 뜨는 설정 탭을 눌러 [다운로드]를 하는 방법이 있고, 두 번째는 아래의 셀과 같이 Colab 자체에서 제공하는 라이브러리를 사용해 다운로드하는 방법이 있습니다. 하지만, 두 방법 모두 매우 느리다는 단점이 있습니다.

1번째 방법 (느린 경우)
# 2번째 방법 (느린 경우)
from google.colab import files

files.download('[다운로드 할 파일 경로]')

다운로드를 하는 더 빠른 방법은 Google Drive를 이용하는 것입니다. 데이터셋을 Google Drive에서 Colab 가상 머신으로 복사한 것과 유사하게, 가중치 파일은 Colab 가상 머신에서 Google Drive로 복사하는 것이 제안하고자 하는 방법입니다. Drive로 복사한 후, Drive에 직접 가서 가중치 파일을 다운로드하는 경우가 더 빨랐습니다. (모든 실험이 그랬음) 그래서, Drive로 가중치 파일을 복사하는 방법은 shutil이라는 파이썬 내장 라이브러리를 사용하여 아래와 같이 구현할 수 있습니다.

# Solution (빠른 경우)
import shutil

from_path = "[Colab 가상 머신 내에 다운로드 할 파일 경로]"
to_path = "[Drive에 복사할 경로 + 파일 이름]"

shutil.copy(from_path, to_path)

# 복사가 끝나면, Drive에 직접 가서 파일을 로컬 환경으로 다운 받을 것!

✅ Conclusion

이번 글은 Colab을 효율적으로 다룰 수 있는 방법들에 대해 다루었습니다. 소스 코드를 깃허브를 통해서 가져오는 방법(+ 모듈화 역량 필요), 데이터셋에 빠르게 접근하는 방법, 가중치 파일을 빠르게 다운로드하는 방법을 정리하였습니다.
 
이를 통해, Colab을 활용한 딥러닝 프로젝트를 수행한다면 보다 효율적인 작업을 수행할 수 있을 것으로 예상됩니다.