Datasets documentation

Datasets ๐Ÿค Arrow

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Datasets ๐Ÿค Arrow

Arrow๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Arrow๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ปฌ๋Ÿผํ˜• ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ €์žฅํ•˜๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • Arrow์˜ ํ‘œ์ค€ ํ˜•์‹์€ ์ œ๋กœ-๋ณต์‚ฌ ์ฝ๊ธฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ์ง๋ ฌํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฑฐ์˜ ์™„์ „ํžˆ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Arrow๋Š” ์–ธ์–ด์— ์ข…์†์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Arrow๋Š” ์ปฌ๋Ÿผ ์ง€ํ–ฅํ˜•์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ์Šฌ๋ผ์ด์Šค๋‚˜ ์ปฌ๋Ÿผ์„ ์ฟผ๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์†๋„๊ฐ€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • Arrow๋Š” NumPy, Pandas, PyTorch, TensorFlow์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋จธ์‹ ๋Ÿฌ๋‹ ๋„๊ตฌ๋กœ ๋ณต์‚ฌ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Arrow์€ ์—ฌ๋Ÿฌ, ๋•Œ๋กœ๋Š” ์ค‘์ฒฉ๋œ, ์ปฌ๋Ÿผ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘

๐Ÿค— Datasets๋Š” ๋กœ์ปฌ ์บ์‹ฑ ์‹œ์Šคํ…œ์— Arrow๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์…‹์„ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์บ์‹œ๋กœ ๋ฐฑ์—…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ๋Œ€์ ์œผ๋กœ ๋””๋ฐ”์ด์Šค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž‘์€ ๋จธ์‹ ์—์„œ๋„ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ฒด ์˜์–ด Wikipedia ๋ฐ์ดํ„ฐ์…‹์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ๋Š” RAM ๋ช‡ MB๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

>>> import os; import psutil; import timeit
>>> from datasets import load_dataset

# Process.memory_info is expressed in bytes, so convert to megabytes 
>>> mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)
>>> wiki = load_dataset("wikimedia/wikipedia", "20220301.en", split="train")
>>> mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)

>>> print(f"RAM memory used: {(mem_after - mem_before)} MB")
RAM memory used: 50 MB

์ด๋Š” Arrow ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋””์Šคํฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘(memory-mapped)๋˜์–ด ์žˆ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘์€ ๋””์Šคํฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ

Arrow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋ฐ์ดํ„ฐ์…‹์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋…ธํŠธ๋ถ์—์„œ Wikipedia๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด 1~3 Gbit/s์˜ ์†๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

>>> s = """batch_size = 1000
... for batch in wiki.iter(batch_size):
...     ...
... """

>>> elapsed_time = timeit.timeit(stmt=s, number=1, globals=globals())
>>> print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {elapsed_time:.1f} sec, "
...       f"ie. {float(wiki.dataset_size >> 27)/elapsed_time:.1f} Gb/s")
Time to iterate over the 18 GB dataset: 31.8 sec, ie. 4.8 Gb/s
Update on GitHub