본문 바로가기
AI/AI 부트캠프

[AI 부트캠프] DAY 135 - 파이널 프로젝트 26

by HOHHOH 2024. 2. 1.

[오늘의 일지]

프로젝트 - 코랩 환경에서 대용량 데이터 활용

[상세 내용]

코랩 환경에서 대용량 데이터 활용

활용 계기

- 지난 일지에서는 코랩 환경이나 로컬에서 소규모 데이터로 학습을 시키고 어느 정도 괜찮은 결과를 얻은 과정에 대해서 정리하였습니다. 이제는 이번 프로젝트의 마지막 학습이라고 할 수 있는 전체 학습 데이터를 가지고 학습만 남아있게 된 것입니다. 전체 데이터는 60GB로 이미지 파일과 txt 파일로만 400만 개가 넘는 양입니다. 이 대용량 데이터를 지원받은 코랩 프로 플러스 환경에서 학습시킨 과정에 대해서 정리해 보겠습니다.

 

구글 클라우드의 문제점

- 코랩 프로 플러스를 사용하기 위해서는 구글 클라우드도 함께 연동해서 사용해야 했기 때문에 클라우드 용량도 100GB를 지원받아서 사용하게 되었습니다. 문제는 구글 클라우드는 대용량 데이터를 올릴 때 데이터의 용랑보다는 개수에 영향을 더 많이 받는다는 것을 파악하게 되었습니다. 예를 들면 일반적인 400만 개의 데이터를 그냥 올리려고 하면 서버 자체에서 오류가 나면서 클라우드가 먹통이 되는 현상을 확인할 수 있었는데 400만 개의 데이터를 zip파일로 압축해서 올리면 2시간 내외로 올라가는 것을 알게 되었습니다. 이 부분을 활용해서 우선 zip 파일 형태로 데이터를 모두 클라우드 저장소에 올려 주었습니다.

 

zip 파일 활용 방법

- zip파일은 압축이 되어있는 형태이기 때문에 압축해제를 해준 뒤에 사용해야 합니다. 여기서 압축해제하는데 위치를 어디에 두냐에 따라서 몇 가지 경우의 수를 가진다고 할 수 있습니다. 

- 첫 번째 클라우드 내부에 있는 zip 파일을 코랩 서버 저장소에 직접 압축 해제를 해서 사용하는 방법이 있습니다. 이 방법은 약 400만 개(이미지와 txt파일을 포함하는 60GB) 기준으로 30분이 조금 안 걸렸던 거 같습니다. 다만 단점은 코랩 서버 저장소가 런타임이 끝나면 휘발성을 가지고 있기 때문에 런타임을 다시 시작할 때마다 다시 압축해제를 해야 하는 귀찮은 부분을 가지고 있습니다.

- 두 번째는 코랩 서버 저장소로 zip을 옮기고 압축 해제를 구글 클라우드로 해주는 방법이 있습니다. 사실 이 방법을 사용하지 않는 것을 추천드립니다. 제 경험상으로 400만 개가 넘는 데이터를 일반 고용량 cpu 환경을 선택해서 압축해제를 해줬더니 약 22시간이 걸리면서 작업이 완료되었다고 하였지만 실제 클라우드 저장소 내부에는 해제된 데이터를 찾아볼 수 없었으며 천천히 저장소의 파일들이 생성되고 있는 이상한 현상을 겪게 되었습니다. 

- 저는 오류 현상 때문에 시간은 시간데로 사용하고 첫 번째 방법으로 학습을 시도하게 되었습니다.

 

압축 해제할 때 주의할 점

- 압축을 해제하는 과정에는 제한되는 부분이 존재합니다. 코랩 gpu 환경은 자체 저장소가 각각 다른 용량으로 제한되어 있습니다. 제가 학습에 사용한 V100이나 A100은 최대 160GB 정도의 저장소 용량을 가지고 있는데 학습을 위한 라이브러리들을 제외하면 140GB 정도라고 할 수 있습니다. 그렇다고 해서 140GB를 모두 사용 가능하다는 말이 아닙니다. 압축을 해제하는 과정에서 저장소 자체에서 압축 대상의 2배 정도의 여유 용량이 필요하다는 것을 알게 되었습니다. 압축을 해제하는 자세한 내막은 모르지만 제가 60GB 정도를 해제하는데 간당간당하게 성공하였습니다.

- 결론을 정리하자면 압축해제 과정에는 2배 정도의 여유 저장소가 필요하기 때문에 코랩 V100이나 A100 기준으로 60GB 정도가 최대 학습 데이터량이라고 할 수 있습니다.

 

데이터 복사 코드

- 원래는 그냥 shutil.copy2(src, dst) 이런 코드를 사용하면 바로 복사가 되는데 진행 속도나 시간을 보기 위해서 tqdm을 적용시키기 위해서 함수화 해서 사용하게 되었습니다.

def copy_with_progress(src, dst, filename, chunk_size=1024*1024):
    # 파일 복사 전에 파일 크기를 가져옵니다.
    total_size = os.path.getsize(os.path.join(src, filename))

    # tqdm을 사용하여 진행 상황을 표시하는 프로그레스 바를 생성합니다.
    with tqdm(total=total_size, unit='B', unit_scale=True, desc=f'Copying {filename}') as progress_bar:
        # 파일을 열고 복사하는 작업을 직접 수행합니다.
        with open(os.path.join(src, filename), 'rb') as src_file, open(os.path.join(dst, filename), 'wb') as dst_file:
            while True:
                # 파일을 chunk_size만큼 읽습니다.
                chunk = src_file.read(chunk_size)
                if not chunk:
                    break

                # 읽은 데이터를 쓰고 프로그레스 바를 업데이트합니다.
                dst_file.write(chunk)
                progress_bar.update(len(chunk))

# 사용 예시
filename = "yolo.zip"
src = "/content/drive/MyDrive/"
dst = "/content/"

copy_with_progress(src, dst, filename)

 

압축 해제 코드

- 압축 해제 하는 코드도 tqdm을 활용해서 시간과 속도를 파악을 했습니다.

# Define the path to the zip file and the extraction directory
zip_file_path = '/content/yolo.zip'
extract_dir = '/content/drive/MyDrive/data'

# Create a ZipFile object
zip_file = zipfile.ZipFile(zip_file_path)

# Get the list of files in the zip archive
file_list = zip_file.namelist()

# Create a progress bar using tqdm
progress_bar = tqdm(total=len(file_list), desc='Extracting files')

# Extract each file from the zip archive
for file in file_list:
    zip_file.extract(file, extract_dir)
    progress_bar.update(1)

# Close the ZipFile object
zip_file.close()

# Close the tqdm progress bar
progress_bar.close()

 

[마무리]

 오늘은 대용량 데이터를 코랩환경에서 어떻게 활용할 수 있는지에 대해서 정리해 보았습니다. 이렇게 활용가능한 데이터를 학습시켜야 되는데 이 부분도 생각보다 ram 용량에 맞게 설정하는 과정이 시행착오를 겪게 되어서 내일 일지에서 정리해 보도록 하겠습니다.

반응형

댓글