Hub documentation
استيعاب مجموعات البيانات
استيعاب مجموعات البيانات
تُخزَّن البيانات بشكل عام في قواعد البيانات أو التخزين السحابي بصيغ غير مناسبة لتدفقات العمل الخاصة بالذكاء الاصطناعي. يُعدّ استهلاك البيانات إلى Hub طريقة جيدة لنشرها كمجموعات بيانات جاهزة للذكاء الاصطناعي، مما يتيح تحميل البيانات ومعالجتها وتدريب النماذج وتقييمها بسهولة وكفاءة.
باستخدام huggingface_hub
أبسط طريقة لاستيراد البيانات هي ببساطة رفع ملفات البيانات باستخدام huggingface_hub.
توفر مكتبة huggingface_hub بلغة بايثون مجموعة غنية من الميزات التي تتيح لك إدارة المستودعات، بما في ذلك إنشاء المستودعات ورفع مجموعات البيانات إلى الـ Hub. قم بزيارة توثيق مكتبة العميل لمعرفة المزيد.
يكون هذا الأمر ذا صلة إذا كانت بياناتك ثابتة/مجمّدة، وإذا كان بإمكانك بسهولة الحصول على نسخة محلية من البيانات بصيغة يدعمها Hub (مثل Parquet أو JSON Lines) مع بنية قابلة للاستخدام (مثل حقول محددة بوضوح للتدريب والتقييم).
استخدام dlt
dlt هو مكتبة بايثون مفتوحة المصدر لنقل البيانات (ETL)، وهو مفيد للمطورين (ووكلاءهم) الذين يبنيون خطوط أنابيب البيانات. يمكنه استهلاك البيانات من أنواع مصادر متنوعة:
- التخزين السحابي أو الملفات
- واجهات برمجة التطبيقات REST
- قواعد بيانات SQL
- مولّدات بايثون
أمثلة على أنواع المصدر:
filesystem(يشمل s3 و gs و az و abff وغيرها)sql_database,mongodb,google_sheetsnotion,hubspot,rest_api
اعثر على نوع المصدر الخاص بك من قائمة المصادر وأنشئ مشروع dlt الخاص بك:
dlt init <source-type> filesystemيمكنك بعد ذلك إنشاء ملف إعدادات .dlt/secrets.toml في جذر مشروع dlt الخاص بك لتعريف Hub كوجهة نظام ملفات لمجموعات بياناتك، بناءً على بروتوكول hf://:
[destination.filesystem]
bucket_url = "hf://datasets/<namespace>"
[destination.filesystem.credentials]
hf_token = "hf_..." # Your Hugging Face Access Tokenيجب أن يكون اسم المجال اسم مستخدمك أو اسم مؤسستك/فريقك الذي تريد استيراد مجموعة البيانات فيه.
ثم يقوم كل مجموعة بيانات 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 لمزيد من المعلومات.
استهلاك البيانات الخام
إذا كنت تستورد بيانات خام تحتاج إلى مزيد من التدقيق قبل نشرها كمجموعات بيانات جاهزة للذكاء الاصطناعي، أو إذا كنت بحاجة إلى تجربة مشابهة لـ S3، ففكر في استيرادها إلى حاويات تخزين Hugging Face. لنقل مجموعة كبيرة موجودة مسبقًا إلى حاوية من القرص المحلي أو سحابة أخرى، راجع دليل الترحيل.
إذا كانت بياناتك موجودة بالفعل في مستودع مجموعة بيانات أو نموذج أو مساحة، يمكنك نسخها إلى دلو من جانب الخادم — دون الحاجة إلى تنزيل أو إعادة رفع — باستخدام hf buckets cp:
hf cp hf://datasets/username/my-dataset/ hf://buckets/username/my-bucket/يتم ترحيل تجزئات محتوى Xet فقط، لذا حتى الملفات الكبيرة جداً تُنسخ فوراً. راجع نسخ الملفات بين المستودعات والخزانات.
الاستهلاك المجدول
توجد بعض القيود عند تحديث نفس الملف على Hub آلاف المرات. فعلى سبيل المثال، قد ترغب في استيعاب أجيال خادم استدلال LLM قيد التشغيل، أو مسارات الوكلاء الحية، أو سجلات تدريب نموذج قيد التشغيل. في مثل هذه الحالات، يكون رفع البيانات كمجموعة بيانات على Hub منطقيًا، لكن قد يكون من الصعب القيام بذلك بشكل صحيح. السبب الرئيسي هو أنك لا تريد إصدار كل تحديث لبياناتك لأنه سيجعل مستودع git غير قابل للاستخدام.
يتوفر ثلاثة خيارات:
- استخدام حاوية تخزين بدلاً من مستودع مجموعة بيانات: تتيح حاويات التخزين تجربة مشابهة لـ S3 تتيح تحديث الملفات بشكل متكرر للغاية، لأنها لا تعتمد على git. وتُعد حاويات التخزين مفيدة بشكل خاص للبيانات التي لم تكن جاهزة للنشر كمجموعة بيانات، مثل البيانات التي لا تزال تتطور أو التي تحتاج إلى مزيد من التدقيق.
- استخدام CommitScheduler: يوفر
CommitSchedulerفيhuggingface_hubاستيعابًا شبه فوري للحفاظ على سجل git الخاص بمستودع Dataset ضمن حدود معقولة. ويمكن ضبطه لتنفيذ عمليات git commit على فترات محددة بالدقائق. - استخدام Hugging Face Jobs لجدولة سكربتات الاستيعاب: يوفر Hugging Face Jobs طريقةً لتشغيل سكربتات Python وجدولتها على بنية Hugging Face التحتية. قم بجدولة سكربتات الاستيعاب لتشغيلها على فترات محددة باستخدام صيغة Cron.
تردد عالٍ باستخدام دلاء التخزين
على عكس مستودعات Dataset التي تعتمد على git، يمكنك تحديث الملفات في Storage Buckets بمعدل مرتفع جداً، مما يوفر استيعاباً شبه فوري.
استخدم batch_bucket_files() في huggingface_hub لتحديث الملفات في الدلو:
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 على fsspec الذي يملك حجم كتلة افتراضيًا قدره 5 ميغابايت، مما يعني أن عملية التفريغ ترفع البيانات فعليًا فقط بعد إضافة كتلة كاملة من البيانات الجديدة بحجم 5 ميغابايت.
إذا كنت ترغب في الرفع بشكل أكثر تكرارًا، فقلّل قيمة blocksize في hffs.open() (مثلًا hffs.open(..., blocksize=100 * 2 ** 10) للحصول على 100 كيلوبايت) أو استخدم f.flush(force=True).
يعتمد تخزين Hugging Face على Xet مما يتيح إدخالاً وإخراجاً فعالين عند الإضافة إلى الملفات: حيث يتم إزالة التكرار من عمليات الرفع ولا يتم رفع البيانات الجديدة فقط. اعثر على مزيد من المعلومات حول إجراء استهلاك البيانات الديناميكي في الدلاء في توثيق الدلاء الخاص بالرفع وفي توثيق تحرير مجموعات البيانات.
بشكل شبه فوري باستخدام CommitScheduler
الفكرة هي تشغيل مهمة في الخلفية تقوم بشكل دوري بدفع مجلد محلي إلى Hub. تريد حفظ البيانات في 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")
...اطّلع على كيفية إدخال بيانات ديناميكية دون الحاجة إلى إعادة رفع كل شيء في كل مرة في التوثيق الخاص بـ تعديل مجموعات البيانات.
يمكنك العثور على مزيد من المعلومات حول عمليات الرفع المجدولة في توثيق huggingface_hub.
استناداً إلى Cron باستخدام Hugging Face Jobs
جدولة سكربتات بايثون لاستهلاك البيانات وفقاً لجدول زمني
على سبيل المثال، لتشغيل السكربت ingest.py كل 5 دقائق:
hf jobs scheduled uv run "*/5 * * * *" ingest.pyأعلن عن تبعيات السكربت في ترويسة السكربت أو استخدم --with.
على سبيل المثال، لتشغيل خط أنابيب dlt كل يوم في منتصف الليل:
hf jobs scheduled uv run --with "dlt[hf]" "0 0 * * *" pipeline.pyيمكنك التحقق من سجلات كل تشغيل باستخدام hf jobs logs أو مباشرةً في صفحة Jobs في حسابك على Hugging Face.
اطّلع على مزيد من المعلومات حول وظائف Hugging Face في توثيق الوظائف.
Update on GitHub