Hub documentation

Spark

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Spark

Spark์€ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์‹ค์‹œ๊ฐ„ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

pyspark_huggingface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด โ€œhuggingfaceโ€ Data Source๋ฅผ ํ†ตํ•ด PySpark์—์„œ Hugging Face datasets ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Hugging Face Spaces์—์„œ Spark Notebooks๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. PySpark์™€ pyspark_huggingface๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์น˜๋œ Notebooks๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •

์„ค์น˜

Hugging Face Datasets์— ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด pyspark_huggingface ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

pip install pyspark_huggingface

์ด ๋ช…๋ น์€ ์ธ์ฆ์„ ์œ„ํ•œ huggingface_hub์™€ ๋ฐ์ดํ„ฐ์…‹ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ pyarrow์™€ ๊ฐ™์€ ํ•„์š”ํ•œ ์ข…์†์„ฑ๋„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ

Hugging Face์— ์ธ์ฆํ•ด์•ผ ๋น„๊ณต๊ฐœ/๊ฒŒ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ์…‹ ์ €์žฅ์†Œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ์…‹ ์ €์žฅ์†Œ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

hf auth login

HF_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋”์— token ์˜ต์…˜์„ ์ „๋‹ฌํ•˜์—ฌ Hugging Face ํ† ํฐ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

โ€œhuggingfaceโ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ํ™œ์„ฑํ™”

PySpark 4์—๋Š” ์ปค์Šคํ…€ ์†Œ์Šค์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด Data Source API๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. pyspark_huggingface๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด PySpark๊ฐ€ ์ด๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์™€ โ€œhuggingfaceโ€ Data Source๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” PySpark 3.5, 3.4, 3.3์— ๋Œ€ํ•ด โ€œhuggingfaceโ€ Data Source์˜ Data Source API๋ฅผ ๋ฐฑํฌํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๊ฒฝ์šฐ ๋ฐฑํฌํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  โ€œhuggingfaceโ€ Data Source๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pyspark_huggingface๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค:

>>> import pyspark_huggingface
huggingface datasource enabled for pyspark 3.x.x (backport from pyspark 4)

์ฝ๊ธฐ

โ€œhuggingfaceโ€ Data Source๋Š” pyarrow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Arrow ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜์—ฌ Hugging Face์—์„œ ๋ฐ์ดํ„ฐ์…‹์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Hugging Face์˜ ์ง€์› ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์…‹, ์˜ˆ๋ฅผ ๋“ค์–ด Parquet ๋ฐ์ดํ„ฐ์…‹๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด stanfordnlp/imdb ๋ฐ์ดํ„ฐ์…‹์„ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

>>> import pyspark_huggingface
>>> from pyspark.sql import SparkSession
>>> spark = SparkSession.builder.appName("demo").getOrCreate()
>>> df = spark.read.format("huggingface").load("stanfordnlp/imdb")

๋‹ค์Œ์€ BAAI/Infinity-Instruct ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒŒ์ดํŠธ๋œ ์ €์žฅ์†Œ์ด๋ฉฐ, ์‚ฌ์šฉ์ž๋Š” ์•ก์„ธ์Šคํ•˜๊ธฐ ์ „์— ์ด์šฉ ์•ฝ๊ด€์— ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ โ€œ3Mโ€๊ณผ โ€œ7Mโ€์ด๋ผ๋Š” ์—ฌ๋Ÿฌ ์„œ๋ธŒ์…‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ๋“œํ•  ์„œ๋ธŒ์…‹์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

.format() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ โ€œhuggingfaceโ€ Data Source๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , .load()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์…‹(๋” ์ •ํ™•ํžˆ๋Š” 7M ์ƒ˜ํ”Œ์„ ํฌํ•จํ•˜๋Š” โ€œ7Mโ€์ด๋ผ๋Š” ์ด๋ฆ„์˜ config ๋˜๋Š” subset)์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์–ธ์–ด๋ณ„ ๋Œ€ํ™” ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ์…‹์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ดํŠธ๋œ ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธํ•œ ํ›„, ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

>>> import pyspark_huggingface
>>> from pyspark.sql import SparkSession
>>> spark = SparkSession.builder.appName("demo").getOrCreate()
>>> df = spark.read.format("huggingface").option("config", "7M").load("BAAI/Infinity-Instruct")
>>> df.show()
+---+----------------------------+-----+----------+--------------------+        
| id|               conversations|label|langdetect|              source|
+---+----------------------------+-----+----------+--------------------+
|  0|        [{human, def exti...|     |        en|      code_exercises|
|  1|        [{human, See the ...|     |        en|                flan|
|  2|        [{human, This is ...|     |        en|                flan|
|  3|        [{human, If you d...|     |        en|                flan|
|  4|        [{human, In a Uni...|     |        en|                flan|
|  5|        [{human, Read the...|     |        en|                flan|
|  6|        [{human, You are ...|     |        en|          code_bagel|
|  7|        [{human, I want y...|     |        en|          Subjective|
|  8|        [{human, Given th...|     |        en|                flan|
|  9|[{human, ๅ› ๆžœ่”็ณปๅŽŸๅˆ™ๆ˜ฏๆณ•...|     |     zh-cn|          Subjective|
| 10|        [{human, Provide ...|     |        en|self-oss-instruct...|
| 11|        [{human, The univ...|     |        en|                flan|
| 12|        [{human, Q: I am ...|     |        en|                flan|
| 13|        [{human, What is ...|     |        en|      OpenHermes-2.5|
| 14|        [{human, In react...|     |        en|                flan|
| 15|        [{human, Write Py...|     |        en|      code_exercises|
| 16|        [{human, Find the...|     |        en|            MetaMath|
| 17|        [{human, Three of...|     |        en|            MetaMath|
| 18|        [{human, Chandra ...|     |        en|            MetaMath|
| 19|[{human, ็”จ็ปๆตŽๅญฆ็Ÿฅ่ฏ†ๅˆ†ๆž...|     |     zh-cn|          Subjective|
+---+----------------------------+-----+----------+--------------------+

์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ์…‹์„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•˜๋ฉฐ, ์ถœ๋ ฅ DataFrame์€ ๋ฐ์ดํ„ฐ์…‹์˜ ๊ฐ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋‹น ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์„ ๊ฐ–๋„๋ก ํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์–ธ์–ด๋ณ„ ๋Œ€ํ™” ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด columns ์˜ต์…˜๊ณผ groupBy() ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. columns ์˜ต์…˜์€ PySpark๊ฐ€ Data Source API์—์„œ predicate push-down์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ”์œ„์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ filters ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

>>> df_langdetect_only = (
...     spark.read.format("huggingface")
...     .option("config", "7M")
...     .option("columns", '["langdetect"]')
...     .load("BAAI/Infinity-Instruct")
... )
>>> df_langdetect_only.groupBy("langdetect").count().show()
+----------+-------+                                                            
|langdetect|  count|
+----------+-------+
|        en|6697793|
|     zh-cn| 751313|
+----------+-------+

๋ฐ์ดํ„ฐ์…‹์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ค‘๊ตญ์–ด ๋Œ€ํ™”๋งŒ ์œ ์ง€ํ•˜๋ ค๋ฉด:

>>> df_chinese_only = (
...     spark.read.format("huggingface")
...     .option("config", "7M")
...     .option("filters", '[("langdetect", "=", "zh-cn")]')
...     .load("BAAI/Infinity-Instruct")
... )
>>> df_chinese_only.show()
+---+----------------------------+-----+----------+----------+                  
| id|               conversations|label|langdetect|    source|
+---+----------------------------+-----+----------+----------+
|  9|[{human, ๅ› ๆžœ่”็ณปๅŽŸๅˆ™ๆ˜ฏๆณ•...|     |     zh-cn|Subjective|
| 19|[{human, ็”จ็ปๆตŽๅญฆ็Ÿฅ่ฏ†ๅˆ†ๆž...|     |     zh-cn|Subjective|
| 38| [{human, ๆŸไธช่€ƒ่ฏ•ๅ…ฑๆœ‰Aใ€...|     |     zh-cn|Subjective|
| 39|[{human, ๆ’ฐๅ†™ไธ€็ฏ‡ๅ…ณไบŽๆ–ๆณข...|     |     zh-cn|Subjective|
| 57|[{human, ๆ€ป็ป“ไธ–็•ŒๅކๅฒไธŠ็š„...|     |     zh-cn|Subjective|
| 61|[{human, ็”Ÿๆˆไธ€ๅˆ™ๅนฟๅ‘Š่ฏใ€‚...|     |     zh-cn|Subjective|
| 66|[{human, ๆ่ฟฐไธ€ไธชๆœ‰ๆ•ˆ็š„ๅ›ข...|     |     zh-cn|Subjective|
| 94|[{human, ๅฆ‚ๆžœๆฏ”ๅˆฉๅ’Œ่’‚่Š™ๅฐผ...|     |     zh-cn|Subjective|
|102|[{human, ็”Ÿๆˆไธ€ๅฅ่‹ฑๆ–‡ๅ่จ€...|     |     zh-cn|Subjective|
|106|[{human, ๅ†™ไธ€ๅฐๆ„Ÿ่ฐขไฟก๏ผŒๆ„Ÿ...|     |     zh-cn|Subjective|
|118| [{human, ็”Ÿๆˆไธ€ไธชๆ•…ไบ‹ใ€‚}...|     |     zh-cn|Subjective|
|174|[{human, ้ซ˜่ƒ†ๅ›บ้†‡ๆฐดๅนณ็š„ๅŽ...|     |     zh-cn|Subjective|
|180|[{human, ๅŸบไบŽไปฅไธ‹่ง’่‰ฒไฟกๆฏ...|     |     zh-cn|Subjective|
|192|[{human, ่ฏทๅ†™ไธ€็ฏ‡ๆ–‡็ซ ๏ผŒๆฆ‚...|     |     zh-cn|Subjective|
|221|[{human, ไปฅ่ฏ—ๆญŒๅฝขๅผ่กจ่พพๅฏน...|     |     zh-cn|Subjective|
|228|[{human, ๆ นๆฎ็ป™ๅฎš็š„ๆŒ‡ไปค๏ผŒ...|     |     zh-cn|Subjective|
|236|[{human, ๆ‰“ๅผ€ไธ€ไธชๆ–ฐ็š„็”Ÿๆˆ...|     |     zh-cn|Subjective|
|260|[{human, ็”Ÿๆˆไธ€ไธชๆœ‰ๅ…ณๆœชๆฅ...|     |     zh-cn|Subjective|
|268|[{human, ๅฆ‚ๆžœๆœ‰ไธ€ๅฎšๆ•ฐ้‡็š„...|     |     zh-cn|Subjective|
|273| [{human, ้ข˜็›ฎ๏ผšๅฐๆ˜Žๆœ‰5ไธช...|     |     zh-cn|Subjective|
+---+----------------------------+-----+----------+----------+

๋กœ๋“œ๋œ DataFrame์— ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ปฌ๋Ÿผ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํŠนํžˆ Parquet ๋ฐ์ดํ„ฐ์…‹์˜ ๊ฒฝ์šฐ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Parquet๋Š” ํŒŒ์ผ ๋ฐ row group ์ˆ˜์ค€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด, ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์ƒ˜ํ”Œ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ์…‹์˜ ์ผ๋ถ€ ์ „์ฒด๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Parquet์˜ ์ปฌ๋Ÿผ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์–ด, ์ œ์™ธ๋œ ์ปฌ๋Ÿผ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…˜

read..option()์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • config (string): ๋ฐ์ดํ„ฐ์…‹์˜ ํ•˜์œ„ ์ง‘ํ•ฉ/์„ค์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
  • split (string): ๋ฐ์ดํ„ฐ์…‹ ์Šคํ”Œ๋ฆฟ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ โ€œtrainโ€์ž…๋‹ˆ๋‹ค)
  • token (string): Hugging Face ํ† ํฐ

config๋‚˜ split์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ , ๋กœ๋“œํ•  ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • data_dir (string): ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ ํƒ
  • data_files (string): ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "data/*.parquet" ๋˜๋Š” '["part1.parquet", "par2.parquet"]'

Parquet ๋ฐ์ดํ„ฐ์…‹์˜ ๊ฒฝ์šฐ:

  • columns (string): ๋กœ๋“œํ•  ์ปฌ๋Ÿผ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: '["id"]'
  • filters (string): ๊ธฐ์ค€์— ๋งž์ง€ ์•Š๋Š” ํŒŒ์ผ๊ณผ row group์„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: '[("source", "=", "code_exercises")]'. ํ•„ํ„ฐ๋Š” pyarrow.parquet.ParquetDataset์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์˜ต์…˜์€ ๋ชจ๋‘ [datasets.load_dataset] (https://huggingface.co/docs/datasets/en/package_reference/loading_methods#datasets.load_dataset)์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

SQL ์ฟผ๋ฆฌ ์‹คํ–‰

PySpark Dataframe๊ฐ€ ์ค€๋น„๋˜๋ฉด spark.sql์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

>>> import pyspark_huggingface
>>> from pyspark.sql import SparkSession
>>> spark = SparkSession.builder.appName("demo").getOrCreate()
>>> df = (
...     spark.read.format("huggingface")
...     .option("config", "7M")
...     .option("columns", '["source"]')
...     .load("BAAI/Infinity-Instruct")
... )
>>> spark.sql("SELECT source, count(*) AS total FROM {df} GROUP BY source ORDER BY total DESC", df=df).show()
+--------------------+-------+
|              source|  total|
+--------------------+-------+
|                flan|2435840|
|          Subjective|1342427|
|      OpenHermes-2.5| 855478|
|            MetaMath| 690138|
|      code_exercises| 590958|
|Orca-math-word-pr...| 398168|
|          code_bagel| 386649|
|        MathInstruct| 329254|
|python-code-datas...|  88632|
|instructional_cod...|  82920|
|        CodeFeedback|  79513|
|self-oss-instruct...|  50467|
|Evol-Instruct-Cod...|  43354|
|CodeExercise-Pyth...|  27159|
|code_instructions...|  23130|
|  Code-Instruct-700k|  10860|
|Glaive-code-assis...|   9281|
|python_code_instr...|   2581|
|Python-Code-23k-S...|   2297|
+--------------------+-------+

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ•์กฐํ•˜์ง€๋งŒ, columns ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ด์ง€ ์•Š์ง€๋งŒ, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ์ฟผ๋ฆฌ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ

โ€œhuggingfaceโ€ Data Source๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PySpark Dataframe์„ Hugging Face์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Parquet ํŒŒ์ผ์„ ๋ถ„์‚ฐ ๋ฐฉ์‹์œผ๋กœ ๋ณ‘๋ ฌ๋กœ ์—…๋กœ๋“œํ•˜๊ณ , ๋ชจ๋“  ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋œ ํ›„์—๋งŒ ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

>>> import pyspark_huggingface
>>> df.write.format("huggingface").save("username/dataset_name")

์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BAAI/Infinity-Instruct ๋ฐ์ดํ„ฐ์…‹์˜ ํ•„ํ„ฐ๋ง๋œ ๋ฒ„์ „์„ Hugging Face์— ๋‹ค์‹œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋ฐ์ดํ„ฐ์…‹ ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด username/Infinity-Instruct-Chinese-Only (์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๊ทธ ๋‹ค์Œ, ์ธ์ฆ์ด ๋˜์–ด ์žˆ๊ณ  โ€œhuggingfaceโ€ Data Source๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„, mode๋ฅผ โ€œoverwriteโ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์กด ๋ฐ์ดํ„ฐ์…‹์„ ํ™•์žฅํ•˜๋ ค๋ฉด โ€œappendโ€๋กœ ์„ค์ •). ๊ทธ๋ฆฌ๊ณ  .save()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hugging Face์— pushํ•ฉ๋‹ˆ๋‹ค:

>>> df_chinese_only.write.format("huggingface").mode("overwrite").save("username/Infinity-Instruct-Chinese-Only")

๋ชจ๋“œ

Hugging Face์— ๋ฐ์ดํ„ฐ์…‹์„ ํ‘ธ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • โ€œoverwriteโ€: ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์…‹์„ ๋ฎ์–ด์“ฐ๊ธฐ
  • โ€œappendโ€: ๊ธฐ์กด ๋ฐ์ดํ„ฐ์…‹์— ๋ฐ์ดํ„ฐ์…‹์„ ์ถ”๊ฐ€

์˜ต์…˜

write.option()์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • token (string): Hugging Face ํ† ํฐ

์—ฌ๊ธฐ์— ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ subset์™€ split์— ๋Œ€ํ•ด.

Storage Buckets

It is common to process raw data in Storage Buckets and experiment there before publishing AI-ready data in Dataset repositories.

Dataset ์ €์žฅ์†Œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ Storage Buckets์— ์•ก์„ธ์Šคํ•˜๋˜ buckets/ ์ ‘๋‘์‚ฌ์™€ data_dir ๋˜๋Š” data_files ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

>>> df = spark.read.format("huggingface").option("data_dir", "data").load("buckets/username/my-bucket")
>>> # OR with a glob pattern
>>> # df = spark.read.format("huggingface").option("data_files", "data/*.parquet").load("buckets/username/my-bucket")
>>> df.write.format("huggingface").option("data_dir", "new-data").save("buckets/username/my-bucket")
Update on GitHub