Hub documentation
معالجة مجموعات البيانات الكبيرة
معالجة مجموعات البيانات الكبيرة
يأتي كل مهمة (Job) مع كمية ثابتة من القرص المحلي، يحددها نوع العتاد (عمود التخزين المؤقت، الذي يعرضه أيضًا الأمر hf jobs hardware). لا تحتاج إلى استيعاب مجموعة بيانات كاملة على ذلك القرص للعمل معها: يمكن قراءة مجموعات البيانات ودلاء التخزين مباشرةً من Hub — سواء عبر البث، أو الاستعلام، أو التركيب — بحيث تستطيع مهمة واحدة معالجة بيانات أكبر بكثير من سعة قرصها. تغطي هذه الصفحة الخيارات المتاحة ومتى ينبغي اللجوء إلى كل منها.
أي نهج؟
- يتسع على القرص → يعمل
load_dataset(...)العادي كما هو (أو اختر ببساطة حجمًا أكبر — حتى 1 تيرابايت من القرص المؤقت). - التكرار على الصفوف، المعالجة أو التدريب → stream
- عمليات المسح المفلترة أو المُقصاة بالأعمدة → استعلامها مباشرةً عبر
hf://باستخدام Polars أو DuckDB. - الأدوات التي تتوقع مسارات ملفات محلية → mount المستودع وقراءة محتواه بشكل كسول.
- حفظ النتائج → اكتبها في Storage Bucket لتبقى بعد انتهاء المهمة.
بث مجموعة البيانات
تقرأ ميزة البث (Streaming) الأمثلة من Hub بينما يستهلكها كودك — دون تنزيل، ودون نسخة محلية، وهي قابلة للتوسع لمجموعات بيانات متعددة التيرابايت. جعلت الإصدارات الأخيرة هذه الميزة أكثر كفاءةً بمقدار 100 مرة، حيث تصل إلى أداء يضاهي أداء وحدات التخزين SSD المحلية عند التدريب عبر العديد من العمال:
from datasets import load_dataset
ds = load_dataset("HuggingFaceFW/fineweb-edu", "sample-10BT", split="train", streaming=True)
for example in ds.take(1000):
... # streams in as you iterate, nothing hits diskمجموعة البيانات المُبَثَّة هي IterableDataset تدعم .filter() و.map() و.shuffle(buffer_size=...) و.batch() بشكل كسول، ويمكن تمريرها مباشرة إلى DataLoader في PyTorch أو إلى Trainer للتدريب على بيانات أكبر من مساحة القرص. راجع دليل البث للواجهة البرمجية الكاملة، وأمثلة ودروس لشرح التدريب من البداية إلى النهاية على إعدادات عقدة واحدة أو موزعة.
يعمل البث أيضًا في الإعدادات الموزعة، باستخدام Spark:
import pyspark_huggingface
df = spark.read.format("huggingface").option("config", "sample-10BT").load("HuggingFaceFW/fineweb-edu")إطار البيانات الناتج من Spark موزّع: حيث يقوم كل عامل بالبث من مجموعته الفرعية الخاصة من الملفات. راجع توثيق Spark لمثال على القراءة والكتابة والتصفية الفعّالة للصفوف والأعمدة.
القراءة والتصفية عبر hf://
تقرأ العديد من مكتبات البيانات مجموعات بيانات Hub مباشرة عبر مسارات hf:// — حيث تقوم Polars وDuckDB وpandas جميعها بفحص Parquet في Hub بشكل أصلي، مع دفع عوامل التصفية واختيار الأعمدة إلى داخل عملية الفحص، مما يتيح لمهمة واحدة معالجة كمية أكبر بكثير من البيانات مما يتسع له الذاكرة أو القرص. تلخص هذه الاستعلامات حوالي 28 جيجابايت من Parquet في حوالي أربع دقائق على نكهة المعالج الافتراضية:
import polars as pl
agg = (
pl.scan_parquet("hf://datasets/HuggingFaceFW/fineweb-edu/sample/10BT/*.parquet")
.filter(pl.col("int_score") >= 4)
.group_by("int_score")
.agg(pl.len().alias("docs"), pl.col("token_count").sum().alias("tokens"))
.sort("int_score")
.collect()
)
print(agg)تكون عمليات المسح من هذا النوع محدودة بالشبكة بدلاً من أن تكون محدودة بالذاكرة، وتختلف المحركات في مدى عدوانية موازاة عمليات القراءة عن بُعد، لذا تختلف أزمنة التنفيذ من مكتبة إلى أخرى. ونتيجةً عملية لهذا الأمر: اضبط --timeout فوق القيمة الافتراضية البالغة 30 دقيقة للمسح الطويل، وقسّم العمل على عدة مهام (Jobs) تعمل بالتوازي لتسريع العملية. راجع Polars وDuckDB وpandas للحصول على أمثلة لكل مكتبة، وراجع Python data tools لقراءة buckets عبر hf:// (والذي يمر عبر HfFileSystem).
تثبيت مجموعة بيانات أو نموذج أو دلو
اربط مستودعًا أو حاوية إلى المهمة كمسار محلي باستخدام -v / --volume؛ يتم جلب الملفات بشكل كسول عبر الشبكة عند قراءتها بواسطة الكود، لذا تعمل أي أداة تقرأ الملفات المحلية بشكل طبيعي:
hf jobs uv run --flavor cpu-upgrade \
-v hf://datasets/HuggingFaceFW/fineweb-edu:/mnt/data \
process.py# /// script
# dependencies = ["polars"]
# ///
# process.py — the mounted repo is just a directory of files
from pathlib import Path
import polars as pl
for path in Path("/mnt/data/sample/10BT").glob("*.parquet"):
shard = pl.read_parquet(path)
... # process one shard at a time, write results outيُعدّ التركيب (Mounting) الخيار الأنسب عندما تُستهلك الملفات كاملةً — أوزان النماذج، ملفات الصوت أو الصور، الأرشيفات — أو عندما يقبل الأداة مسارات الملفات فقط. أما في عمليات مسح ملفات Parquet متعددة كبيرة الحجم، فإن الاستعلام مباشرةً عبر hf:// يكون عادةً أسرع بعدة مرات من المسح عبر التركيب.
تُركَّب مجموعات البيانات والنماذج للقراءة فقط؛ أما الدلاء فتكون للقراءة والكتابة، مما يجعلها مكاناً مناسباً لـحفظ النتائج. راجع التكوين لمعرفة صياغة -v الكاملة، وأنماط الوصول إلى الدلاء للتفاصيل.
تُخزَّن الملفات المقروءة عبر نقطة تركيب مؤقتة على القرص المؤقت الخاص بالمهمة، لذا فإن القراءة الكسولة (ملف واحد في كل مرة) تحافظ على حجم البصمة صغيرًا. عند تشغيل سكريبت محلي باستخدام
hf jobs uv run، تُركَّب مجلد السكريبت في/data، لذا ركّب بياناتك في مكان آخر (مثل/mnt/data).
حفظ النتائج
لا يبقى القرص المؤقت بعد انتهاء المهمة، لذا اكتب أي شيء تريد الاحتفاظ به في Storage Bucket مُثبّت للقراءة والكتابة، أو ارفعه إلى Hub كمجموعة بيانات. يمكن لـ DuckDB تصفية المصدر عبر hf:// وكتابة المطابقات مباشرةً إلى الدلو المثبت في استعلام واحد خارج النطاق، بحيث لا يتعين على النتيجة أن تتسع في الذاكرة:
hf jobs uv run --flavor cpu-upgrade --timeout 1h \
-v hf://buckets/username/my-output:/mnt/out \
filter.py# /// script
# dependencies = ["duckdb"]
# ///
# filter.py — scan ~28 GB of Parquet, keep only the matching rows
import duckdb
duckdb.sql(
"""
COPY (
SELECT text, url, token_count
FROM 'hf://datasets/HuggingFaceFW/fineweb-edu/sample/10BT/*.parquet'
WHERE int_score >= 4 AND token_count >= 4000
) TO '/mnt/out/result.parquet' (FORMAT parquet)
"""
)تبقى الملفات المكتوبة تحت مسار تثبيت الدلو (bucket mount path) بعد انتهاء المهمة. لنشر مجموعة بيانات مُعالجة بدلاً من ذلك، استخدم Dataset.push_to_hub.
مثال تطبيقي: الاستعلام عن Common Crawl دون تنزيله
يعكس Common Crawl أرشيفه إلى الدلو commoncrawl/commoncrawl — بمئات التيرابايت. انقل شريحة WET (نص صريح) واحدة مباشرةً من hf://، ثم حلّلها واستعلم عنها باستخدام DuckDB؛ إذ لا تنتقل سوى بضعة ميغابايت لأن ملف gzip يُقرأ تسلسليًا ويُوقف مبكرًا:
# /// script
# requires-python = ">=3.11"
# dependencies = ["huggingface_hub>=1.9", "fastwarc>=0.15", "duckdb>=1.0"]
# ///
import duckdb
from fastwarc.warc import ArchiveIterator, WarcRecordType
from huggingface_hub import hffs
WET = (
"buckets/commoncrawl/commoncrawl/crawl-data/CC-MAIN-2026-17/"
"segments/1775805908305.14/wet/"
"CC-MAIN-20260410081153-20260410111153-00000.warc.wet.gz"
)
rows = []
with hffs.open(WET, "rb") as f:
for rec in ArchiveIterator(f, record_types=WarcRecordType.conversion):
lang = (rec.headers.get("WARC-Identified-Content-Language", "") or "und").split(",")[0]
rows.append((rec.headers.get("WARC-Target-URI", ""), lang, len(rec.reader.read())))
if len(rows) >= 5000:
break
con = duckdb.connect()
con.execute("CREATE TABLE wet(url VARCHAR, lang VARCHAR, n_chars BIGINT)")
con.executemany("INSERT INTO wet VALUES (?,?,?)", rows)
con.sql("SELECT lang, count(*) AS docs FROM wet GROUP BY lang ORDER BY docs DESC LIMIT 10").show()شغّله باستخدام hf jobs uv run cc_wet.py — يكتمل في حوالي دقيقة واحدة على نكهة المعالج الافتراضية ويُطبع:
┌─────────┬───────┐
│ lang │ docs │
│ varchar │ int64 │
├─────────┼───────┤
│ eng │ 1974 │
│ zho │ 586 │
│ rus │ 434 │
│ jpn │ 244 │
│ … │ … │
└─────────┴───────┘انظر أيضاً
- بث · مجموعات بيانات البث: كفاءة أعلى بمئة مرة
- التسعير والأجهزة — القرص المؤقت لكل نوع · التكوين — الأحجام
- حاويات التخزين · أنماط الوصول · التكاملات