هذه مشاركة مدونة ضيف بواسطة فريق Zama. Zama هي شركة تشفير مفتوحة المصدر تقوم ببناء أحدث حلول FHE لـ blockchain و AI.
منذ ثمانية عشر شهرًا، بدأت Zama شركة Concrete ML، وهو إطار تعلم الآلة الذي يحافظ على الخصوصية مع ارتباطات بأطر تعلم الآلة التقليدية مثل scikit-learn وONNX وPyTorch وTensorFlow. لضمان خصوصية بيانات المستخدمين، تستخدم Zama التشفير المتماثل بالكامل (FHE)، وهي أداة تشفير تسمح بإجراء حسابات مباشرة على البيانات المشفرة، دون معرفة المفتاح الخاص على الإطلاق.
منذ البداية، أردنا تجميع بعض الشبكات الملائمة لـ FHE مسبقًا وإتاحتها في مكان ما على الإنترنت، مما يسمح للمستخدمين باستخدامها بشكل تافه. نحن جاهزون اليوم! وليس في مكان عشوائي على شبكة الإنترنت، ولكن مباشرة على Hugging Face.
وبشكل أكثر دقة، نستخدم Hugging Face Endpoints ومعالجات الاستدلال المخصصة، حتى نتمكن من تخزين نماذج ML Concrete الخاصة بنا والسماح للمستخدمين بالنشر على أجهزة HF بنقرة واحدة. في نهاية منشور المدونة هذا، ستفهم كيفية استخدام النماذج المجمعة مسبقًا وكيفية إعداد نماذجك. يمكن أيضًا اعتبار هذه المدونة بمثابة برنامج تعليمي آخر لمعالجات الاستدلال المخصصة.
نشر نموذج تم تجميعه مسبقًا
لنبدأ بنشر نموذج صديق لـ FHE (تم إعداده بواسطة Zama أو جهات خارجية – راجع قسم إعداد النموذج المُجمَّع مسبقًا أدناه لمعرفة كيفية إعداد النموذج الخاص بك).
أولاً، ابحث عن النموذج الذي تريد نشره: لقد قمنا مسبقًا بتجميع مجموعة من النماذج على صفحة Zama’s HF (أو يمكنك العثور عليها مع العلامات). لنفترض أنك اخترت شجرة القرار المحددة: كما هو موضح في الوصف، يتيح لك هذا النموذج المترجم مسبقًا اكتشاف البريد العشوائي دون النظر إلى محتوى الرسالة بشكل واضح.
كما هو الحال مع أي طراز آخر متوفر على منصة Hugging Face، حدد نشر وثم نقطة نهاية الاستدلال (مخصصة):

نقطة نهاية الاستدلال (مخصصة)
بعد ذلك، اختر اسم نقطة النهاية أو المنطقة، والأهم من ذلك، وحدة المعالجة المركزية (لا تستخدم نماذج ML الحقيقية وحدات معالجة الرسومات في الوقت الحالي؛ ونحن نعمل عليها) بالإضافة إلى أفضل جهاز متاح – في المثال أدناه اخترنا ثمانية وحدات معالجة مركزية افتراضية. الآن انقر على إنشاء نقطة النهاية وانتظر حتى تنتهي عملية التهيئة.

إنشاء نقطة النهاية
وبعد بضع ثوانٍ، يتم نشر نقطة النهاية، ويكون نموذج الحفاظ على الخصوصية لديك جاهزًا للتشغيل.

يتم إنشاء نقطة النهاية
: لا تنس حذف نقطة النهاية (أو على الأقل إيقافها مؤقتًا) عندما لا تستخدمها، وإلا فستكلفك أكثر من المتوقع.
استخدام نقطة النهاية
تثبيت جانب العميل
الهدف ليس فقط نشر نقطة النهاية الخاصة بك ولكن أيضًا السماح للمستخدمين باللعب بها. للقيام بذلك، يحتاجون إلى استنساخ المستودع الموجود على أجهزة الكمبيوتر الخاصة بهم. ويتم ذلك عن طريق الاختيار مستودع النسخ، في القائمة المنسدلة:

مستودع النسخ
سيتم إعطاؤهم سطر أوامر صغيرًا يمكنهم تشغيله في المحطة الطرفية الخاصة بهم:
git clone https://huggingface.co/zama-fhe/concrete-ml-encrypted-decisiontree
بمجرد الانتهاء من الأمر، يذهبون إلى concrete-ml-encrypted-decisiontree الدليل وفتح play_with_endpoint.py مع محررهم. هنا، سوف يجدون السطر مع API_URL = … ويجب استبداله بعنوان URL الجديد لنقطة النهاية التي تم إنشاؤها في القسم السابق.
API_URL = "https://vtx9w974oxrq54ff.us-east-1.aws.endpoints.huggingface.cloud"
بالطبع، املأها بـ لك عنوان URL لنقطة الدخول. حدد أيضًا رمز الوصول وقم بتخزينه في متغير البيئة:
export HF_TOKEN=[your token hf_XX..XX]
أخيرًا، تحتاج أجهزة المستخدم الخاصة بك إلى تثبيت Concrete ML محليًا: قم بإنشاء بيئة افتراضية، ومصدرها، وتثبيت التبعيات الضرورية:
python3.10 -m venv .venv
source .venv/bin/activate
pip install -U setuptools pip wheel
pip install -r requirements.txt
لاحظ أننا نفرض حاليًا استخدام Python 3.10 (وهو أيضًا إصدار python الافتراضي المستخدم في Hugging Face Endpoints). وذلك لأن ملفات التطوير لدينا تعتمد حاليًا على إصدار Python. نحن نعمل على جعلهم مستقلين. وينبغي أن يكون هذا متاحا في نسخة أخرى.
تشغيل الاستدلالات
الآن، يمكن للمستخدمين تشغيل الاستدلال على نقطة النهاية عند تشغيل البرنامج النصي:
python play_with_endpoint.py
يجب أن يُنشئ بعض السجلات المشابهة لما يلي:
Sending 0-th piece of the key (remaining size is 71984.14 kbytes)
Storing the key in the database under uid=3307376977
Sending 1-th piece of the key (remaining size is 0.02 kbytes)
Size of the payload: 0.23 kilobytes
for 0-th input, prediction=0 with expected 0 in 3.242 seconds
for 1-th input, prediction=0 with expected 0 in 3.612 seconds
for 2-th input, prediction=0 with expected 0 in 4.765 seconds
(...)
for 688-th input, prediction=0 with expected 1 in 3.176 seconds
for 689-th input, prediction=1 with expected 1 in 4.027 seconds
for 690-th input, prediction=0 with expected 0 in 4.329 seconds
Accuracy on 691 samples is 0.8958031837916064
Total time: 2873.860 seconds
Duration per inference: 4.123 seconds
التكيف مع طلبك أو احتياجاتك
إذا قمت بتحرير play_with_endpoint.py، سترى أننا نقوم بالتكرار على عينات مختلفة من مجموعة بيانات الاختبار وتشغيل الاستدلالات المشفرة مباشرة على نقطة النهاية.
for i in range(nb_samples):
encrypted_inputs = fhemodel_client.quantize_encrypt_serialize(X_test[i].reshape(1, -1))
payload = {
"inputs": "fake",
"encrypted_inputs": to_json(encrypted_inputs),
"method": "inference",
"uid": uid,
}
if is_first:
print(f"Size of the payload: {sys.getsizeof(payload) / 1024:.2f} kilobytes")
is_first = False
duration -= time.time()
duration_inference = -time.time()
encrypted_prediction = query(payload)
duration += time.time()
duration_inference += time.time()
encrypted_prediction = from_json(encrypted_prediction)
prediction_proba = fhemodel_client.deserialize_decrypt_dequantize(encrypted_prediction)[0]
prediction = np.argmax(prediction_proba)
if verbose:
print(
f"for {i}-th input, {prediction=} with expected {Y_test[i]} in {duration_inference:.3f} seconds"
)
nb_good += Y_test[i] == prediction
وبطبيعة الحال، هذا مجرد مثال على استخدام نقطة الدخول. يتم تشجيع المطورين على تكييف هذا المثال مع حالة الاستخدام أو التطبيق الخاص بهم.
تحت غطاء محرك السيارة
يرجى ملاحظة أن كل هذا يتم بفضل مرونة المعالجات المخصصة، ونحن نعرب عن امتناننا لمطوري Hugging Face لتقديم هذه المرونة. يتم تعريف الآلية في handler.py. كما هو موضح في وثائق Hugging Face، يمكنك تحديد __call__ طريقة EndpointHandler إلى حد كبير كما تريد: في حالتنا، قمنا بتحديد أ method المعلمة التي يمكن أن تكون save_key (لحفظ مفاتيح تقييم FHE)، append_key (لحفظ مفاتيح تقييم FHE قطعة قطعة إذا كان المفتاح كبيرًا جدًا بحيث لا يمكن إرساله في مكالمة واحدة) وأخيراً inference (لتشغيل استنتاجات FHE). تُستخدم هذه الطرق لتعيين مفتاح التقييم مرة واحدة ثم تشغيل كافة الاستدلالات، واحدًا تلو الآخر، كما هو موضح في play_with_endpoint.py.
حدود
ومع ذلك، يمكن ملاحظة أن المفاتيح مخزنة في ذاكرة الوصول العشوائي (RAM) الخاصة بنقطة النهاية، وهو أمر غير مناسب لبيئة الإنتاج: عند كل إعادة تشغيل، يتم فقدان المفاتيح ويجب إعادة إرسالها. بالإضافة إلى ذلك، عندما يكون لديك العديد من الأجهزة للتعامل مع حركة المرور الضخمة، لا تتم مشاركة ذاكرة الوصول العشوائي هذه بين الأجهزة. وأخيرًا، لا توفر أجهزة وحدة المعالجة المركزية (CPU) المتوفرة سوى ثمانية وحدات معالجة مركزية افتراضية (vCPUs) على الأكثر لنقاط النهاية، وهو ما قد يمثل حدًا للتطبيقات عالية التحميل.
تحضير النموذج المترجم مسبقًا
الآن بعد أن عرفت مدى سهولة نشر نموذج تم تجميعه مسبقًا، قد ترغب في إعداد نموذجك الخاص. لهذا، يمكنك تفرع أحد المستودعات التي أعددناها. تحتوي جميع فئات النماذج التي يدعمها Concrete ML (النماذج الخطية، والنماذج المستندة إلى الأشجار، ونماذج MLP المدمجة، ونماذج PyTorch) على مثال واحد على الأقل، يمكن استخدامه كقالب للنماذج الجديدة المجمعة مسبقًا.
ثم قم بالتحرير creating_models.py، وقم بتغيير مهمة ML لتكون المهمة التي تريد معالجتها في نموذجك المُجمَّع مسبقًا: على سبيل المثال، إذا بدأت باستخدام شجرة القرار الملموسة، فقم بتغيير مجموعة البيانات ونوع النموذج.
كما هو موضح سابقًا، يجب أن تكون قد قمت بتثبيت Concrete ML لإعداد النموذج الذي تم تجميعه مسبقًا. لاحظ أنه قد يتعين عليك استخدام نفس إصدار python الذي يستخدمه Hugging Face بشكل افتراضي (3.10 عند كتابة هذه المدونة)، أو قد تحتاج نماذجك إلى أشخاص لاستخدام حاوية مع python الخاص بك أثناء النشر.
الآن يمكنك الانطلاق python creating_models.py. سيؤدي هذا إلى تدريب النموذج وإنشاء ملفات التطوير الضرورية (client.zip, server.zip، و versions.json) في compiled_model دليل. كما هو موضح في الوثائق، تحتوي هذه الملفات على النموذج المترجم مسبقًا. إذا كانت لديك أية مشكلات، يمكنك الحصول على الدعم على fhe.org Discord.
الخطوة الأخيرة هي التعديل play_with_endpoint.py للتعامل أيضًا مع نفس مهمة ML كما في creating_models.py: قم بتعيين مجموعة البيانات وفقًا لذلك.
الآن، يمكنك حفظ هذا الدليل بالملحق compiled_model الدليل والملفات، بالإضافة إلى تعديلاتك في creating_models.py و play_with_endpoint.py على نماذج الوجه المعانقة. بالتأكيد، سوف تحتاج إلى إجراء بعض الاختبارات وإجراء تعديلات طفيفة حتى يعمل. ولا تنسى إضافة أ concrete-ml و FHE العلامة، بحيث يظهر نموذجك المترجم مسبقًا بسهولة في عمليات البحث.
النماذج المجمعة مسبقًا متاحة اليوم
في الوقت الحالي، قمنا بإعداد بعض النماذج المجمعة مسبقًا كأمثلة، على أمل أن يقوم المجتمع بتوسيع نطاق ذلك قريبًا. يمكن العثور على النماذج المجمعة مسبقًا من خلال البحث عن علامات concrete-ml أو FHE.
ضع في اعتبارك أن هناك مجموعة محدودة من خيارات التكوين في Hugging Face لنقاط النهاية المدعومة بوحدة المعالجة المركزية (ما يصل إلى 8 وحدات معالجة مركزية افتراضية مع 16 جيجابايت من ذاكرة الوصول العشوائي اليوم). اعتمادًا على متطلبات الإنتاج وخصائص الطراز لديك، يمكن أن تكون أوقات التنفيذ أسرع في المثيلات السحابية الأكثر قوة. نأمل أن تتوفر قريبًا أجهزة أكثر قوة في Hugging Face Endpoints لتحسين هذه التوقيتات.
موارد إضافية
الخلاصة والخطوات التالية
في منشور المدونة هذا، أظهرنا أن نقاط النهاية المخصصة سهلة جدًا ولكنها قوية الاستخدام. ما نقوم به في Concrete ML يختلف تمامًا عن سير العمل المعتاد لممارسي تعلم الآلة، لكننا لا نزال قادرين على استيعاب نقاط النهاية المخصصة للتعامل مع معظم احتياجاتنا. مجد لمهندسي Hugging Face لتطوير مثل هذا الحل العام.
شرحنا كيف:
- يمكن للمطورين إنشاء نماذجهم المجمعة مسبقًا وإتاحتها على نماذج Hugging Face.
- يمكن للشركات نشر النماذج المجمعة مسبقًا للمطورين وإتاحتها لمستخدميها عبر HF Endpoints.
- يمكن للمستخدمين النهائيين استخدام نقاط النهاية هذه لتشغيل مهام تعلم الآلة الخاصة بهم عبر البيانات المشفرة.
للمضي قدمًا، سيكون من المفيد توفر آلات أكثر قوة في Hugging Face Endpoints لإجراء الاستدلالات بشكل أسرع. أيضًا، يمكننا أن نتخيل أن Concrete ML أصبح أكثر اندماجًا في واجهة Hugging Face ولديه نقطة نهاية الاستدلال الخاصة بالحفاظ على الخصوصية زر، مما يبسط حياة المطورين بشكل أكبر. أخيرًا، من أجل التكامل في العديد من أجهزة الخادم، قد يكون من المفيد أن يكون لديك طريقة لمشاركة الحالة بين الأجهزة والحفاظ على هذه الحالة غير متطايرة (سيتم تخزين مفاتيح استدلال FHE هناك).