ملاحظة
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
هام
- تم إيقاف هذه الوثائق وقد لا يتم تحديثها. لم تعد المنتجات أو الخدمات أو التقنيات المذكورة في هذا المحتوى مدعومة.
- توصي Databricks باستخدام
ai_query
للاستدلال الدفعي بدلا من ذلك. راجع تنفيذ الاستدلال الدفعي باستخدام ai_query.
توضح هذه المقالة كيفية استخدام Hugging Face Transformers لاستدلال نموذج معالجة اللغة الطبيعية (NLP).
يوفر معانقة محولات الوجه فئة المسارات لاستخدام النموذج المدرب مسبقا للاستدلال. 🤗 تدعم مسارات المحولات مجموعة واسعة من مهام NLP التي يمكنك استخدامها بسهولة على Azure Databricks.
المتطلبات
- MLflow 2.3
- يمكن استخدام أي نظام مجموعة مع مكتبة Hugging Face
transformers
المثبتة للاستدلال الدفعي.transformers
تأتي المكتبة مثبتة مسبقا على Databricks Runtime 10.4 LTS ML وما فوق. تعمل العديد من نماذج NLP الشائعة بشكل أفضل على أجهزة GPU، لذلك قد تحصل على أفضل أداء باستخدام أجهزة GPU الحديثة ما لم تستخدم نموذجا محسنا خصيصا للاستخدام على وحدات المعالجة المركزية.
استخدام Pandas UDFs لتوزيع حساب النموذج على مجموعة Spark
عند تجربة النماذج المدربة مسبقا، يمكنك استخدام Pandas UDFs لتضمين النموذج وإجراء الحساب على وحدات المعالجة المركزية العاملة أو وحدات معالجة الرسومات . توزع Pandas UDFs النموذج على كل عامل.
يمكنك أيضا إنشاء خط أنابيب معانقة Face Transformers للترجمة الآلية واستخدام Pandas UDF لتشغيل البنية الأساسية لبرنامج ربط العمليات التجارية على عمال مجموعة Spark:
import pandas as pd
from transformers import pipeline
import torch
from pyspark.sql.functions import pandas_udf
device = 0 if torch.cuda.is_available() else -1
translation_pipeline = pipeline(task="translation_en_to_fr", model="t5-base", device=device)
@pandas_udf('string')
def translation_udf(texts: pd.Series) -> pd.Series:
translations = [result['translation_text'] for result in translation_pipeline(texts.to_list(), batch_size=1)]
return pd.Series(translations)
device
يضمن تعيين بهذه الطريقة استخدام وحدات معالجة الرسومات إذا كانت متوفرة على نظام المجموعة.
ترجع مسارات Face المعانقة للترجمة قائمة بعناصر Python dict
، كل منها بمفتاح translation_text
واحد وقيمة تحتوي على النص المترجم. يستخرج UDF هذا الترجمة من النتائج لإرجاع سلسلة Pandas مع النص المترجم فقط. إذا تم إنشاء البنية الأساسية لبرنامج ربط العمليات التجارية الخاصة بك لاستخدام وحدات معالجة الرسومات عن طريق تعيين device=0
، فسيعيد Spark تعيين وحدات معالجة الرسومات تلقائيا على العقد العاملة إذا كان نظام المجموعة الخاص بك يحتوي على مثيلات مع وحدات معالجة الرسومات متعددة.
لاستخدام UDF لترجمة عمود نص، يمكنك استدعاء UDF في عبارة select
:
texts = ["Hugging Face is a French company based in New York City.", "Databricks is based in San Francisco."]
df = spark.createDataFrame(pd.DataFrame(texts, columns=["texts"]))
display(df.select(df.texts, translation_udf(df.texts).alias('translation')))
إرجاع أنواع النتائج المعقدة
باستخدام Pandas UDFs يمكنك أيضا إرجاع إخراج أكثر تنظيما. على سبيل المثال، في التعرف على الكيان المسمى، ترجع المسارات قائمة dict
الكائنات التي تحتوي على الكيان، وامتداده، ونوعه، ودرجة مقترنة به. على الرغم من أنه مشابه لمثال الترجمة، فإن نوع الإرجاع للتعلية @pandas_udf
التوضيحية أكثر تعقيدا في حالة التعرف على الكيان المسمى.
يمكنك الحصول على فكرة عن أنواع الإرجاع لاستخدامها من خلال فحص نتائج البنية الأساسية لبرنامج ربط العمليات التجارية، على سبيل المثال عن طريق تشغيل البنية الأساسية لبرنامج ربط العمليات التجارية على برنامج التشغيل.
في هذا المثال، استخدم التعليمات البرمجية التالية:
from transformers import pipeline
import torch
device = 0 if torch.cuda.is_available() else -1
ner_pipeline = pipeline(task="ner", model="Davlan/bert-base-multilingual-cased-ner-hrl", aggregation_strategy="simple", device=device)
ner_pipeline(texts)
للحصول على التعليقات التوضيحية:
[[{'entity_group': 'ORG',
'score': 0.99933606,
'word': 'Hugging Face',
'start': 0,
'end': 12},
{'entity_group': 'LOC',
'score': 0.99967843,
'word': 'New York City',
'start': 42,
'end': 55}],
[{'entity_group': 'ORG',
'score': 0.9996372,
'word': 'Databricks',
'start': 0,
'end': 10},
{'entity_group': 'LOC',
'score': 0.999588,
'word': 'San Francisco',
'start': 23,
'end': 36}]]
لتمثيل هذا كنوع إرجاع، يمكنك استخدام أحد array
struct
الحقول، مع سرد dict
الإدخالات كالحقول في struct
:
import pandas as pd
from pyspark.sql.functions import pandas_udf
@pandas_udf('array<struct<word string, entity_group string, score float, start integer, end integer>>')
def ner_udf(texts: pd.Series) -> pd.Series:
return pd.Series(ner_pipeline(texts.to_list(), batch_size=1))
display(df.select(df.texts, ner_udf(df.texts).alias('entities')))
ضبط الأداء
هناك العديد من الجوانب الرئيسية لضبط أداء UDF. الأول هو استخدام كل وحدة معالجة الرسومات بشكل فعال، والتي يمكنك ضبطها عن طريق تغيير حجم الدفعات المرسلة إلى وحدة معالجة الرسومات بواسطة مسار المحولات. والثاني هو التأكد من أن DataFrame مقسم جيدا لاستخدام نظام المجموعة بأكمله.
وأخيرا، قد ترغب في تخزين نموذج Hugging Face مؤقتا لتوفير وقت تحميل النموذج أو تكاليف الدخول.
اختيار حجم دفعة
في حين أن UDFs الموضحة أعلاه يجب أن تعمل خارج الصندوق مع batch_size
1، قد لا يستخدم هذا الموارد المتاحة للعمال بكفاءة. لتحسين الأداء، قم بضبط حجم الدفعة إلى النموذج والأجهزة في نظام المجموعة. توصي Databricks بتجربة أحجام دفعات مختلفة للبنية الأساسية لبرنامج ربط العمليات التجارية على نظام المجموعة للعثور على أفضل أداء. اقرأ المزيد حول دفعات البنية الأساسية لبرنامج ربط العمليات التجارية وخيارات الأداء الأخرى في وثائق Hugging Face.
حاول العثور على حجم دفعة كبير بما يكفي بحيث يدفع استخدام GPU الكامل ولكن لا يؤدي إلى CUDA out of memory
أخطاء. عندما تتلقى CUDA out of memory
أخطاء أثناء الضبط، تحتاج إلى فصل دفتر الملاحظات وإعادة إرفاقه لتحرير الذاكرة المستخدمة من قبل النموذج والبيانات في وحدة معالجة الرسومات.
راقب أداء وحدة معالجة الرسومات من خلال عرض مقاييس نظام المجموعة المباشرة لنظام المجموعة، واختيار مقياس، مثل gpu0-util
استخدام معالج GPU أو gpu0_mem_util
لاستخدام ذاكرة GPU.
ضبط التوازي مع الجدولة على مستوى المرحلة
بشكل افتراضي، يقوم Spark بجدولة مهمة واحدة لكل وحدة معالجة الرسومات على كل جهاز. لزيادة التوازي، يمكنك استخدام الجدولة على مستوى المرحلة لإخبار Spark بعدد المهام التي يجب تشغيلها لكل وحدة معالجة الرسومات. على سبيل المثال، إذا كنت ترغب في أن يقوم Spark بتشغيل مهمتين لكل وحدة معالجة الرسومات، يمكنك تحديد ذلك بالطريقة التالية:
from pyspark.resource import TaskResourceRequests, ResourceProfileBuilder
task_requests = TaskResourceRequests().resource("gpu", 0.5)
builder = ResourceProfileBuilder()
resource_profile = builder.require(task_requests).build
rdd = df.withColumn('predictions', loaded_model(struct(*map(col, df.columns)))).rdd.withResources(resource_profile)
إعادة تقسيم البيانات لاستخدام جميع الأجهزة المتوفرة
الاعتبار الثاني للأداء هو الاستفادة الكاملة من الأجهزة في مجموعتك. بشكل عام، يعمل مضاعف صغير من عدد وحدات معالجة الرسومات على العاملين لديك (لمجموعات GPU) أو عدد الذاكرات الأساسية عبر العاملين في مجموعتك (لمجموعات وحدة المعالجة المركزية) بشكل جيد. قد يحتوي إدخال DataFrame بالفعل على أقسام كافية للاستفادة من توازي نظام المجموعة. لمعرفة عدد الأقسام التي يحتويها DataFrame، استخدم df.rdd.getNumPartitions()
. يمكنك إعادة تقسيم DataFrame باستخدام repartitioned_df = df.repartition(desired_partition_count)
.
تخزين النموذج مؤقتا في DBFS أو على نقاط التحميل
إذا كنت تقوم بتحميل نموذج بشكل متكرر من مجموعات مختلفة أو تمت إعادة تشغيلها، فقد ترغب أيضا في تخزين نموذج Hugging Face مؤقتا في وحدة تخزين جذر DBFS أو على نقطة تحميل. يمكن أن يؤدي ذلك إلى تقليل تكاليف الدخول وتقليل الوقت لتحميل النموذج على نظام مجموعة جديد أو تمت إعادة تشغيله. للقيام بذلك، قم بتعيين TRANSFORMERS_CACHE
متغير البيئة في التعليمات البرمجية الخاصة بك قبل تحميل البنية الأساسية لبرنامج ربط العمليات التجارية.
على سبيل المثال:
import os
os.environ['TRANSFORMERS_CACHE'] = '/dbfs/hugging_face_transformers_cache/'
بدلا من ذلك، يمكنك تحقيق نتائج مماثلة عن طريق تسجيل النموذج إلى MLflow مع نكهة MLflowtransformers
.
دفتر الملاحظات: استدلال محولات الوجه المعانق وتسجيل MLflow
للبدء بسرعة باستخدام مثال التعليمات البرمجية، يعد دفتر الملاحظات هذا مثالا شاملا لتلخيص النص باستخدام استدلال مسارات Hugging Face Transformers وتسجيل MLflow.
معانقة Face Transformers pipelines inference notebook
الموارد الإضافية
يمكنك ضبط نموذج Hugging Face الخاص بك باستخدام الدلائل التالية:
تعرف على المزيد حول ما هي معانقة محولات الوجه؟