Hub documentation
데이터셋 가져오기
데이터셋 가져오기
데이터는 일반적으로 AI 워크플로우에 적합하지 않은 형태로 데이터베이스나 클라우드 스토리지에 저장되어 있습니다. 데이터를 Hub로 가져오는 것은 AI에 바로 사용할 수 있는 데이터셋으로 게시하는 좋은 방법이며, 이를 통해 데이터 로딩, 처리 및 모델 학습과 평가를 쉽고 효율적으로 수행할 수 있습니다.
huggingface_hub 사용
데이터를 가져오는 가장 간단한 방법은 huggingface_hub로 데이터 파일을 업로드하는 것입니다.
huggingface_hub Python 라이브러리는 저장소 관리, 저장소 생성 및 Hub에 데이터셋 업로드를 포함하는 풍부한 기능 세트를 제공합니다. 자세한 내용은 클라이언트 라이브러리 문서를 참조하세요.
데이터가 정적/고정되어 있고, Hub에서 지원하는 형식(예: Parquet 또는 JSON Lines)으로 사용 가능한 구조(예: 학습 및 평가에 대한 잘 정의된 필드)를 가진 데이터의 로컬 덤프를 쉽게 얻을 수 있는 경우 이 정보가 관련됩니다.
dlt 사용
dlt는 데이터 이동(ETL)을 위한 오픈 소스 Python 라이브러리로, 데이터 파이프라인을 구축하는 개발자(그리고 그들의 에이전트)에게 유용합니다. 다양한 소스 유형에서 데이터를 가져올 수 있습니다:
- 클라우드 저장소 또는 파일
- REST API
- SQL 데이터베이스
- Python 생성기
소스 유형 예시:
filesystem(s3, gs, az, abff 등 포함)sql_database,mongodb,google_sheetsnotion,hubspot,rest_api
소스 목록에서 소스 유형을 찾아 dlt 프로젝트를 생성하세요:
dlt init <source-type> filesystem이후 dlt 프로젝트의 루트에서 .dlt/secrets.toml 구성 파일을 만들어 hf:// 프로토콜을 기반으로 Hub를 데이터셋의 파일시스템 대상(destination)으로 정의할 수 있습니다:
[destination.filesystem]
bucket_url = "hf://datasets/<namespace>"
[destination.filesystem.credentials]
hf_token = "hf_..." # Your Hugging Face Access Tokennamespace는 데이터셋을 가져오려는 사용자 이름 또는 조직/팀 이름이어야 합니다.
그 후 각 dlt 데이터셋은 Hugging Face 데이터셋 저장소를 생성하거나 업데이트합니다. 저장소 이름은 <namespace>/<dataset_name>이며, 여기서 <namespace>은 bucket_url에 사용한 것과 동일한 값(조직 또는 팀)이고, <dataset_name>은 파이프라인의 dataset_name입니다.
다음은 파이프라인의 예시입니다:
import dlt
@dlt.resource
def my_data():
# One of the functions auto-generated by `dlt init` that you can customize,
# or you can define your own python generator function.
# Here is an example from the `chess` source type:
for player in ['magnuscarlsen', 'rpragchess']:
response = requests.get(f'https://api.chess.com/pub/player/{player}')
response.raise_for_status()
yield response.json()
# Requires bucket_url = "hf://datasets/<namespace>" in .dlt/secrets.toml
pipeline = dlt.pipeline(
pipeline_name="my_pipeline",
destination="filesystem",
dataset_name="dataset_name",
)
pipeline.run(my_data())원하는 데이터를 로드하고 데이터셋에 게시할 필드(예: 학습 및 평가에 필요한 텍스트)를 파싱하도록 dlt 리소스를 사용자 지정합니다.
다른 라이브러리 사용
🤗 Datasets, Pandas, Polars, Dask, DuckDB, Spark, Daft와 같은 일부 라이브러리를 사용하면 다양한 소스에서 데이터를 Hub로 가져올 수 있습니다. 자세한 내용은 Datasets Hub에서 지원하는 라이브러리 목록을 참고하세요.
원시 데이터 가져오기
AI-레디 데이터셋으로 게시하기 전에 추가 큐레이션이 필요한 원시 데이터를 수집하거나, S3와 유사한 환경을 필요로 한다면 Hugging Face Storage Buckets에 수집하는 것을 고려해 보세요. 로컬 디스크 또는 다른 클라우드에서 대규모 기존 컬렉션을 버킷으로 이동하는 방법은 Migration Guide를 참고하세요.
데이터가 이미 dataset, model 또는 Space 저장소에 있는 경우, hf buckets cp를 사용하여 버킷으로 서버 측에서 복사할 수 있습니다. 다운로드나 재업로드가 필요하지 않습니다:
hf cp hf://datasets/username/my-dataset/ hf://buckets/username/my-bucket/Xet 콘텐츠 해시만 마이그레이션되므로, 매우 큰 파일도 즉시 복사됩니다. 리포지토리와 버킷 간 파일 복사를 참조하세요.
정기적 데이터 수집
Hub에서 동일한 파일을 수천 번 업데이트할 때 몇 가지 제한 사항이 있습니다. 예를 들어, 실행 중인 LLM 추론 서버의 생성 결과, 라이브 에이전트 추적 데이터, 또는 실행 중인 모델 학습 로그를 수집하는 경우를 생각해 볼 수 있습니다. 이러한 경우 데이터를 Hub에 데이터셋으로 업로드하는 것이 합리적이지만, 올바르게 수행하기가 어려울 수 있습니다. 주된 이유는 데이터의 모든 업데이트를 버전 관리하면 git 저장소를 사용할 수 없게 되기 때문입니다.
세 가지 옵션이 있습니다:
- Dataset 저장소 대신 Storage Bucket 사용: Storage Bucket은 git 기반이 아니므로 파일을 매우 자주 업데이트할 수 있는 S3와 유사한 환경을 제공합니다. Storage Bucket은 데이터셋으로 공개할 준비가 되지 않은 데이터, 예를 들어 아직 발전 중이거나 추가 큐레이션이 필요한 데이터에 특히 유용합니다.
- CommitScheduler 사용:
huggingface_hub의CommitScheduler는 Dataset 저장소의 git 히스토리를 관리하기 쉽게 유지하도록 거의 실시간으로 데이터를 가져옵니다. 분 단위로 정의된 간격으로 git 커밋을 수행하도록 구성할 수 있습니다. - Hugging Face Jobs를 사용하여 수집 스크립트를 예약: Hugging Face Jobs는 Hugging Face 인프라에서 Python 스크립트를 실행하고 예약할 수 있는 방법을 제공합니다. Cron 구문을 사용하여 정의된 간격으로 수집 스크립트가 실행되도록 예약합니다.
Storage Buckets를 사용한 고빈도
git 기반인 Dataset 저장소와 달리, Storage Buckets의 파일은 매우 높은 속도로 업데이트할 수 있어 준실시간(Quasi real-time) 데이터 수집을 제공합니다.
huggingface_hub의 batch_bucket_files()를 사용하여 버킷의 파일을 업데이트합니다:
from huggingface_hub import batch_bucket_files
def update_bucket(local_files):
destinations = [os.path.basename(local_file) for local_file in local_file]
batch_bucket_files(bucket_id="username/bucket_name", add=[(local_file, dst) for local_file, dst in zip(local_files, destinations)])대신, Bucket의 파일에 항목을 추가하고 각 새 항목마다 flush()를 호출할 수 있습니다:
from huggingface_hub import hffs
with hffs.open("buckets/username/bucket_name/texts.jsonl", "a") as f:
for text in live_texts_stream:
f.write(json.dumps({"text": text}) + "\n")
f.flush()HfFileSystem은 기본 블록 크기가 5MiB인 fsspec을 기반으로 하며, 이는 5MiB 크기의 새 데이터 청크가 완전히 추가될 때까지 플러시 시 실제로 데이터를 업로드하지 않는다는 것을 의미합니다.
더 자주 업로드하려면 hffs.open()에서 blocksize를 낮추세요(예: 100 kiB의 경우 hffs.open(..., blocksize=100 * 2 ** 10)) 또는 f.flush(force=True)를 사용하세요.
Hugging Face 스토리지는 파일에 데이터를 추가할 때 효율적인 I/O를 가능하게 하는 Xet 기반으로 작동합니다. 업로드 시 중복이 제거되고 새로운 데이터만 업로드됩니다. 버킷에서 동적 데이터 인제션을 수행하는 방법에 대한 자세한 내용은 업로드에 관한 버킷 문서와 데이터셋 편집 문서에서 확인하세요.
CommitScheduler를 사용한 준실시간
이 아이디어는 로컬 폴더를 Hub에 정기적으로 push하는 백그라운드 작업을 실행하는 것입니다. Hub에 데이터를 저장해야 하지만(수백만 개의 항목일 수 있음), 각 사용자의 입력을 실시간으로 저장할 필요는 없습니다. 대신, 데이터를 로컬의 JSON 파일에 저장하고 10분마다 업로드할 수 있습니다. 예를 들어:
import json
from huggingface_hub import CommitScheduler
folder_path = "path/to/files/to/ingest"
every = 10 # ingest every 10min
with CommitScheduler(repo_id="username/dataset_name", repo_type="dataset", folder_path=folder_path, every=every) as scheduler:
# Write to the folder to ingest every 10min
# For example:
with open(folder_path + "/texts.jsonl", "a") as f:
f.write(json.dumps({"text": text}) + "\n")
...모든 데이터를 매번 다시 업로드하지 않고 동적 데이터를 가져오는 방법은 dataset editing 문서에서 확인해 보세요.
huggingface_hub 문서에서 예약 업로드에 대한 자세한 정보를 확인하세요.
Hugging Face Jobs를 사용한 Cron 기반
python 스크립트를 일정표에 따라 데이터 수집을 예약합니다
예를 들어 ingest.py 스크립트를 5분마다 실행하려면:
hf jobs scheduled uv run "*/5 * * * *" ingest.py--with를 사용하거나 스크립트 헤더에서 스크립트 의존성을 선언하세요.
예를 들어 매일 자정에 dlt 파이프라인을 실행하려면:
hf jobs scheduled uv run --with "dlt[hf]" "0 0 * * *" pipeline.pyhf jobs logs를 사용하거나 Hugging Face의 계정에서 Jobs 페이지를 통해 모든 실행의 로그를 확인할 수 있습니다.
Hugging Face Jobs에 대한 자세한 내용은 Jobs 문서에서 확인하세요.
Update on GitHub