Hub documentation

Zephon

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Zephon

Zephon์€ DatologyAI๊ฐ€ ๊ฐœ๋ฐœํ•œ foundation model ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ ๋กœ๋”์ž…๋‹ˆ๋‹ค. ํ•™์Šต์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ํ† ํฐํ™”, ํŒจํ‚น ๋ฐ ํ˜ผํ•ฉํ•˜๋ฉฐ, GPU ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๋™์ผํ•œ ๋ฐฐ์น˜(elastic determinism)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Zephon์€ hf:// ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด Hugging Face Hub์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

hf extra๋Š” Hub ๋ฐ์ดํ„ฐ์…‹ ๋ฐ Parquet ํŒŒ์ผ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ํ† ํฐํ™”๋ฅผ ์œ„ํ•ด transformers๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

pip install "zephon[hf]" transformers

Hub์—์„œ ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ

hf:// ๊ฒฝ๋กœ๋ฅผ Dataset.from_path์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋Š” ๋ฐ์ดํ„ฐ์…‹, ๊ตฌ์„ฑ ๋ฐ ์Šคํ”Œ๋ฆฟ์„ ์ง€์ •ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด HuggingFaceFW/fineweb-edu์˜ sample-10BT ๊ตฌ์„ฑ์˜ train ์Šคํ”Œ๋ฆฟ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Zephon์€ shard cache๋ฅผ ํ†ตํ•ด Hub ๋ฐ์ดํ„ฐ์…‹์„ ์ฝ์œผ๋ฏ€๋กœ ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ๋น ๋ฅธ ๋กœ์ปฌ ๋””์Šคํฌ์— ๋‘๊ณ  ํฌ๊ธฐ ์ œํ•œ์„ ์„ค์ •ํ•˜์„ธ์š”:

from zephon import Pipeline
from zephon.io import CacheOptions, Dataset, StoreOptions
from zephon.work import MixtureSpec, StaticMixtureWorkSource

dataset = Dataset.from_path("fineweb_edu", "hf://HuggingFaceFW/fineweb-edu/sample-10BT/train")
work_source = StaticMixtureWorkSource(
    datasets=[dataset],
    mixture=MixtureSpec({"fineweb_edu": 1.0}),
    seed=42,
)
cache = CacheOptions(enabled=True, root="/tmp/zephon-cache", limit_bytes=50 << 30)  # 50 GiB

pipeline = (
    Pipeline(work_source)
    .options(io_options=StoreOptions(cache=cache))
    .tokenize(tokenizer_id="gpt2", field="text")
    .pack_flat(max_length=2049, algorithm="wrap")
    .batch(microbatch_size=8)
)

for batch in pipeline:
    tensors = batch.to_training(return_labels=True)
    print(tensors["input_ids"].shape, tensors["labels"].shape)  # (8, 2048) (8, 2048)
    break

tokenize๋Š” text ์ปฌ๋Ÿผ์„ ํ† ํฐ ID๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. pack_flat๋Š” ํ† ํฐํ™”๋œ ๋ฌธ์„œ๋ฅผ max_length ํ† ํฐ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. max_length๋ฅผ ์ปจํ…์ŠคํŠธ ๊ธธ์ด๋ณด๋‹ค 1 ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”. return_labels=True์ธ ๊ฒฝ์šฐ to_training์€ ๋ผ๋ฒจ์„ ํ•œ ์œ„์น˜๋งŒํผ ์ด๋™์‹œํ‚ค๋ฏ€๋กœ, input_ids์™€ labels ๋ชจ๋‘ ์ปจํ…์ŠคํŠธ ๊ธธ์ด๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Pipeline๋Š” Python ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ๊ฐ์ฒด(iterable)์ด๋ฏ€๋กœ ๋ชจ๋“  ํ•™์Šต ๋ฃจํ”„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Zephon์€ ์ฝ๊ธฐ ์ „์— ์ „์ฒด ์ƒค๋“œ(shard)๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜(batch)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ๋˜๋Š” ๊ฒŒ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ์…‹์„ ์ฝ์œผ๋ ค๋ฉด ๋จผ์ € Hugging Face ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด hf auth login์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Zephon์€ HF_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋„ ์ฝ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ํ˜•์‹

Zephon์˜ Hub ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ hf:// ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

hf://{org}/{name}[@[{revision}][~{source}]]/[{config}/]{split}
  • revision: ๋ธŒ๋žœ์น˜, ํƒœ๊ทธ ๋˜๋Š” ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ main์ž…๋‹ˆ๋‹ค. Zephon์€ ๋ฐ์ดํ„ฐ์…‹์„ ๋กœ๋“œํ•  ๋•Œ ๊ฒฝ๋กœ๋ฅผ ํŠน์ • ์ปค๋ฐ‹์— ๊ณ ์ •ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๋žญํฌ๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • source: original์€ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ฝ๊ณ , parquet๋Š” Hub์˜ ์ž๋™ Parquet ๋ณ€ํ™˜์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋Š” @ ๋’ค์— ์ง€์ •ํ•˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด @~parquet์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Zephon์€ ํ•ด๋‹น ํฌ๋งท์„ ์ง€์›ํ•  ๊ฒฝ์šฐ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ฝ๊ณ , ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Parquet ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • config: ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์„ฑ. ๋ฐ์ดํ„ฐ์…‹์— ๊ตฌ์„ฑ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๋กœ์ฝ๊ธฐ
hf://HuggingFaceFW/fineweb-edu/sample-10BT/trainmain ๋ธŒ๋žœ์น˜์˜ sample-10BT ๊ตฌ์„ฑ์—์„œ train ๋ถ„ํ• 
hf://HuggingFaceFW/fineweb-edu@v1.4.0/sample-10BT/trainv1.4.0 ๋ธŒ๋žœ์น˜์—์„œ ๋™์ผํ•œ ๋ถ„๊ธฐ
hf://yahma/alpaca-cleaned@~parquet/train์ž๋™ Parquet ๋ณ€ํ™˜์˜ train ๋ถ„ํ• 

Zephon ๊ฒฝ๋กœ์—๋Š” ํŒŒ์ผ์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ์…‹๊ณผ ์Šคํ”Œ๋ฆฟ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. pandas, Polars, DuckDB์—์„œ ์‚ฌ์šฉํ•˜๋Š” hf://datasets/... ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. hf://datasets/HuggingFaceFW/fineweb-edu/sample-10BT/train๊ฐ€ ์•„๋‹Œ hf://HuggingFaceFW/fineweb-edu/sample-10BT/train๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ์…‹ ํ˜ผํ•ฉ

์—ฌ๋Ÿฌ Hub ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ•™์Šตํ•˜๋ ค๋ฉด, ๊ฐ ๋ฐ์ดํ„ฐ์…‹์˜ ๋น„์œจ์„ ์ง€์ •ํ•˜์—ฌ ์›Œํฌ ์†Œ์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” FineWeb-Edu์™€ ์˜์–ด ์œ„ํ‚ค๋ฐฑ๊ณผ๋ฅผ ํ† ํฐ ๊ธฐ์ค€ 70/30 ๋น„์œจ๋กœ ํ˜ผํ•ฉํ•ฉ๋‹ˆ๋‹ค:

from zephon import Pipeline
from zephon.io import CacheOptions, Dataset, StoreOptions
from zephon.work import MixtureSpec, StaticMixtureWorkSource, TokenEstimation

work_source = StaticMixtureWorkSource(
    datasets=[
        Dataset.from_path("fineweb_edu", "hf://HuggingFaceFW/fineweb-edu/sample-10BT/train"),
        Dataset.from_path("wikipedia", "hf://wikimedia/wikipedia/20231101.en/train"),
    ],
    mixture=MixtureSpec({"fineweb_edu": 0.7, "wikipedia": 0.3}),
    seed=42,
    token_estimation=TokenEstimation(primer="measure", calibration_samples=2048, calibration_shards_max=4),
)
cache = CacheOptions(enabled=True, root="/tmp/zephon-cache", limit_bytes=50 << 30)  # 50 GiB

pipeline = (
    Pipeline(work_source)
    .options(io_options=StoreOptions(cache=cache))
    .tokenize(tokenizer_id="gpt2", field="text")
    .pack_flat(max_length=2049, algorithm="wrap")
    .batch(microbatch_size=8)
)

์ƒ˜ํ”Œ ๋‹จ์œ„๋กœ ํ˜ผํ•ฉํ•˜๋ ค๋ฉด token_estimation์„ ์ƒ๋žตํ•˜์„ธ์š”.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

Update on GitHub