[Generative] Huggingface 데이터 받아 사용하기

2024. 12. 12. 23:31Developers 공간 [Shorts]/Vision & Audio

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

 

Huggingface는 많은 데이터셋과 모델을 가지고 있어 이들을 활용할 때 Huggingface에서 제공하는 라이브러리를 활용하거나 직접 다운로드해서 사용하곤합니다.

[Huggingface 데이터셋]


이번 글에서는 Huggingface의 데이터셋을 받아 사용하는 기본적인 방법을 살펴보려고합니다.

 

예시 데이터셋으로는 아래 링크의 stylebreeder를 활용하겠습니다.

** https://huggingface.co/datasets/stylebreeder/stylebreeder


2. Why? (원인)

  • X

3. How? (해결책)

 

두 가지 방법으로 데이터를 받아보겠습니다.

 

방법1. snapshot 그대로 받기

 

이전 글에서 모델을 받을 때와 같이 snapshot을 그대로 받아보겠습니다.

** https://tkayyoo.tistory.com/171

 

코드는 아래와 같이 huggingface에서 제공하는 라이브러리를 활용해 받을 수 있습니다.

from huggingface_hub import snapshot_download
snapshot_download(repo_id="stylebreeder/stylebreeder", repo_type="dataset", cache_dir='./stylebreeder', revision=“main”)


snapshot형태로 다운로드 받기 때문에 아래처럼 Symbolic Link로 되어있고 복잡하며 parquet포맷을 사용합니다.

  • stylebreeder/
    • datasets—stylebreeder--stylebreeder/
      • snapshots/
        • 6d72977c2c9446314a64b9e501acf85dc771cfbe/
          • data/
            • 2M_sample-00078-of-00169.parquet

 

대용량 데이터를 압축 저장할 때 Column-based와 Row-based방법이 있는데, Column-based가 압축률이 더 높고 일부 칼럼만 읽어 사용하면 대용량 데이터를 효율적으로 다루기 쉽다고 합니다.

[https://jonhyuk0922.tistory.com/140]


Apache Parquet(파케이) 포맷
은 원래 "나무조각을 부여 넣은 마루바닥"이라는 뜻을 가지고 있는 Column기반의 저장포맷 표준이며, Apache Hadoop 에코시스템에서 활용되었습니다.

 

 

보통 읽기 위해서는 sparkpandas를 활용하는데, 이 글에서는 pandas를 활용하려고합니다. 한번 읽어보겠습니다.

import pandas as pd
df = pd.read_parquet('sample.parquet')
print(df)

 

위 구조를 보고 아래와 같이 읽어봤습니다.

df['image'][0]['bytes']

 

pandas를 활용해 읽을 땐 아래와 같이 특정 column만을 선택해서 읽을 수도 있습니다.

df =pd.read_parquet('sample.parquet', columns=['image_id', 'image'])

 

이를 활용할 땐 아래와 같이 Huggingface에서 제공하는 datasets라는 라이브러리를 활용해 불러 사용합니다.

이 라이브러리는 데이터 전처리 및 분할, 대형 데이터셋 관리 등에 적합한 도구입니다. 

from datasets import Dataset
dataset = Dataset.from_pandas(df)

 

이후의 과정은 아래에서 같이 살펴보겠습니다.

 


방법2. Huggingface 도구 활용하기

 

이번엔 처음부터 HuggingFacedatasets를 활용해 데이터를 받아보겠습니다.



보통은 학습과정에서 바로 다운받아서 사용하도록 하는데, 우리는 디스크에 받아서 활용할 수 있도록 해보겠습니다.

from datasets import load_dataset
dataset = load_dataset("stylebreeder/stylebreeder")
dataset.save_to_disk('./stylebreeder')

 

그래도 snapshot을 그대로 받은것 보다 간단하며, 위와 다르게 arrow포맷을 사용합니다.

  • stylebreeder/
    • dataset_dict.json
    • 2M_sample/
      • dataset_info.json
      • state.json
      • data-00270-of-00338.arrow

.arrow 파일Apache Arrow라는 컬럼 기반 데이터 형식으로 저장된 파일이자 프레임워크명입니다. 대량의 데이터를 빠른 열 기반으로 효율적으로 처리하고, 분석 작업을 빠르게 수행하기 위해 설계된 오픈 소스 형식입니다.

 

다운 받은 이 .arrow 파일은 datasets 라이브러리를 사용하여 쉽게 로드할 수 있습니다. 다음 코드를 사용해 데이터를 다시 메모리로 불러와 보겠습니다.

** 주의할 것은 위에서 받아주었던 “폴더의 path"로 적어주어야합니다.(ex. stylebreeder혹은 stylebreeder/2M_sample)

from datasets import load_from_disk 
dataset = load_from_disk('./stylebreeder')
print(dataset)

 

위 구조를 보고 아래와 같이 읽어봤습니다.

print(dataset['2M_sample'].features)
#print(dataset['2M_sample'].features[‘image_id’])

 

이번엔 실제 사용할때 처럼 샘플 하나를 얻어보겠습니다.

print(dataset['2M_sample'][0])

 

샘플 중에 이미지도 있네요. 이미지는 pillow 포맷으로 되어있으며, 이를 한번 저장해보겠습니다.

image = dataset['2M_sample'][0]['image'] 
image.save('test.jpg') # from PIL import Image

 


파케이 포맷 : https://jonhyuk0922.tistory.com/140

 

 

728x90
반응형