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

تأثير نماذج اللغات الكبيرة على خصوصية المستخدمين

على الرغم من جاذبية LLMs، إلا أن المخاوف المتعلقة بالخصوصية لا تزال قائمة فيما يتعلق باستعلامات المستخدم التي تتم معالجتها بواسطة هذه النماذج. من ناحية، يعد الاستفادة من قوة LLM أمرًا مرغوبًا فيه، ولكن من ناحية أخرى، هناك خطر تسرب معلومات حساسة إلى مزود خدمة LLM. في بعض المجالات، مثل الرعاية الصحية أو التمويل أو القانون، تعد مخاطر الخصوصية هذه أمرًا عائقًا.

أحد الحلول الممكنة لهذه المشكلة هو النشر داخل المؤسسة، حيث يقوم مالك LLM بنشر نموذجه على جهاز العميل. ومع ذلك، فإن هذا ليس الحل الأمثل، حيث أن إنشاء LLM قد يكلف ملايين الدولارات (4.6 مليون دولار لـ GPT3) كما أن النشر داخل الشركة يعرضك لخطر تسريب نموذج الملكية الفكرية (IP).

تؤمن Zama أنه يمكنك الحصول على أفضل ما في كلا العالمين: طموحنا هو حماية خصوصية المستخدم والملكية الفكرية للنموذج. في هذه المدونة، ستشاهد كيفية الاستفادة من مكتبة محولات Hugging Face وتشغيل أجزاء من هذه النماذج على البيانات المشفرة. يمكن العثور على الكود الكامل في مثال حالة الاستخدام هذا.

يمكن للتشفير المتماثل بالكامل (FHE) حل تحديات الخصوصية في LLM

يتمثل حل Zama لتحديات نشر LLM في استخدام التشفير المتماثل بالكامل (FHE) والذي يتيح تنفيذ الوظائف على البيانات المشفرة. من الممكن تحقيق هدف حماية IP الخاص بمالك النموذج مع الحفاظ على خصوصية بيانات المستخدم. يوضح هذا العرض التوضيحي أن نموذج LLM المطبق في FHE يحافظ على جودة تنبؤات النموذج الأصلي. للقيام بذلك، من الضروري تكييف تطبيق GPT2 من مكتبة محولات Hugging Face، وإعادة صياغة أقسام الاستدلال باستخدام Concrete-Python، مما يتيح تحويل وظائف Python إلى مكافئاتها من FHE.

الشكل 1. بنية GPT2. المصدر: https://en.wikipedia.org/wiki/GPT-2

يوضح الشكل 1 بنية GPT2 التي لها بنية متكررة: سلسلة من طبقات الانتباه متعدد الرؤوس (MHA) المطبقة على التوالي. تقوم كل طبقة MHA بعرض المدخلات باستخدام أوزان النموذج، وتحسب آلية الانتباه، وتعيد عرض مخرجات الانتباه إلى موتر جديد.

في TFHE، يتم تمثيل أوزان النماذج وعمليات التنشيط بأعداد صحيحة. يجب تنفيذ الوظائف غير الخطية من خلال عملية Bootstrapping القابلة للبرمجة (PBS). تنفذ PBS عملية بحث جدول (TLU) على البيانات المشفرة بينما تقوم أيضًا بتحديث النصوص المشفرة للسماح بالحساب التعسفي. على الجانب السلبي، يهيمن وقت حساب PBS على العمليات الخطية. من خلال الاستفادة من هذين النوعين من العمليات، يمكنك التعبير عن أي جزء فرعي من، أو حتى حساب LLM الكامل، في FHE.

تنفيذ طبقة LLM مع FHE

بعد ذلك، سترى كيفية تشفير رأس انتباه واحد لكتلة الانتباه متعدد الرؤوس (MHA). يمكنك أيضًا العثور على مثال لكتلة MHA الكاملة في مثال حالة الاستخدام هذا.

الشكل 2. تشغيل أجزاء من نموذج اللغة الكبير في FHE.

ويبين الشكل 2. نظرة عامة مبسطة على التنفيذ الأساسي. يبدأ العميل الاستدلال محليًا حتى الطبقة الأولى التي تمت إزالتها من النموذج المشترك. يقوم المستخدم بتشفير العمليات الوسيطة ويرسلها إلى الخادم. يطبق الخادم جزءًا من آلية الانتباه ثم يتم إرجاع النتائج إلى العميل الذي يمكنه فك تشفيرها ومتابعة الاستدلال المحلي.

التكميم

أولاً، من أجل إجراء استنتاج النموذج على القيم المشفرة، يجب قياس أوزان النموذج وتنشيطه وتحويلها إلى أعداد صحيحة. والمثالي هو استخدام التكميم بعد التدريب الذي لا يتطلب إعادة تدريب النموذج. تتمثل العملية في تنفيذ آلية اهتمام متوافقة مع FHE، واستخدام الأعداد الصحيحة وPBS، ثم فحص التأثير على دقة LLM.

لتقييم تأثير التكميم، قم بتشغيل نموذج GPT2 الكامل باستخدام رئيس LLM واحد يعمل على البيانات المشفرة. ثم قم بتقييم الدقة التي تم الحصول عليها عند تغيير عدد بتات التكميم لكل من الأوزان وعمليات التنشيط.

متوسط ​​انتباه الرأس الكمي الفردي لدقة Top-k

يوضح هذا الرسم البياني أن تكميم 4 بت يحافظ على 96% من الدقة الأصلية. يتم إجراء التجربة باستخدام مجموعة بيانات مكونة من 80 جملة تقريبًا. يتم حساب المقاييس من خلال مقارنة التنبؤ بالسجلات من النموذج الأصلي مع النموذج مع نموذج الرأس الكمي.

تطبيق FHE على نموذج Hugging Face GPT2

بناءً على مكتبة المحولات من Hugging Face، أعد كتابة المسار الأمامي للوحدات النمطية التي تريد تشفيرها، من أجل تضمين العوامل الكمية. أنشئ مثيل SingleHeadQGPT2Model عن طريق تحميل GPT2LMHeadModel أولاً ثم استبدل يدويًا أول وحدة انتباه متعددة الرؤوس على النحو التالي باستخدام وحدة QGPT2SingleHeadAttention. يمكن العثور على التنفيذ الكامل هنا .

self.transformer.h[0].attn = QGPT2SingleHeadAttention(config, n_bits=n_bits)

تتم بعد ذلك الكتابة فوق التمرير الأمامي بحيث يتم تنفيذ الرأس الأول لآلية الانتباه متعدد الرؤوس، بما في ذلك التوقعات التي تم إجراؤها لبناء الاستعلام والمفاتيح ومصفوفات القيمة، باستخدام مشغلين متوافقين مع FHE. يمكن العثور على وحدة QGPT2 التالية هنا.

class SingleHeadAttention(QGPT2):
    """Class representing a single attention head implemented with quantization methods."""


    def run_numpy(self, q_hidden_states: np.ndarray):

        
        q_x = DualArray(
            float_array=self.x_calib,
            int_array=q_hidden_states,
            quantizer=self.quantizer
        )

        
        mha_weights_name = f"transformer.h.{self.layer}.attn."

        
        head_0_indices = [
            list(range(i * self.n_embd, i * self.n_embd + self.head_dim)) 
            for i in range(3)
        ]
        q_qkv_weights = ...
        q_qkv_bias = ...

        
        q_qkv = q_x.linear(
            weight=q_qkv_weights,
            bias=q_qkv_bias,
            key=f"attention_qkv_proj_layer_{self.layer}",
        )

        
        q_qkv = q_qkv.expand_dims(axis=1, key=f"unsqueeze_{self.layer}")
        q_q, q_k, q_v = q_qkv.enc_split(
            3, 
            axis=-1, 
            key=f"qkv_split_layer_{self.layer}"
        )

        
        q_y = self.attention(q_q, q_k, q_v)

        return self.finalize(q_y)

تظل الحسابات الأخرى في النموذج بفاصلة عائمة وغير مشفرة ومن المتوقع أن يتم تنفيذها بواسطة العميل داخل الشركة.

تحميل الأوزان المدربة مسبقًا في نموذج GPT2 المعدل بهذه الطريقة، يمكنك بعد ذلك استدعاء يولد طريقة:

qgpt2_model = SingleHeadQGPT2Model.from_pretrained(
    "gpt2_model", n_bits=4, use_cache=False
)


output_ids = qgpt2_model.generate(input_ids)

على سبيل المثال، يمكنك أن تطلب من النموذج الكمي إكمال عبارة “التشفير هو”. مع دقة تكميمية كافية عند تشغيل النموذج في FHE، يكون مخرجات التوليد كما يلي:

“يعد التشفير جزءًا مهمًا جدًا من أمان جهاز الكمبيوتر الخاص بك”

عندما تكون دقة القياس منخفضة جدًا، ستحصل على:

“التشفير هو وسيلة رائعة للتعرف على العالم من حولك”

تجميع لFHE

يمكنك الآن تجميع رأس الانتباه باستخدام كود Concrete-ML التالي:

circuit_head = qgpt2_model.compile(input_ids)

عند تشغيل هذا، ستشاهد النسخة المطبوعة التالية: “دائرة مجمعة بعرض 8 بت”. يُظهر هذا التكوين، المتوافق مع FHE، الحد الأقصى لعرض البت اللازم لإجراء العمليات في FHE.

تعقيد

في نماذج المحولات، العملية الأكثر كثافة حسابيًا هي آلية الانتباه التي تضاعف الاستعلامات والمفاتيح والقيم. في FHE، تتضاعف التكلفة بسبب خصوصية الضرب في المجال المشفر. علاوة على ذلك، مع زيادة طول التسلسل، يزداد عدد هذه الضربات الصعبة بشكل تربيعي.

بالنسبة للرأس المشفر، يتطلب تسلسل بطول 6 11622 عملية PBS. هذه هي التجربة الأولى التي لم يتم تحسينها للأداء. على الرغم من أنه يمكن تشغيله في غضون ثوانٍ، إلا أنه يتطلب قدرًا كبيرًا من قوة الحوسبة. لحسن الحظ، ستعمل الأجهزة على تحسين زمن الوصول بمقدار 1000x إلى 10000x، مما يجعل الأمور تنتقل من عدة دقائق على وحدة المعالجة المركزية إلى <100 مللي ثانية على ASIC بمجرد توفرها في غضون بضع سنوات. لمزيد من المعلومات حول هذه التوقعات، راجع منشور المدونة هذا.

خاتمة

تعد نماذج اللغات الكبيرة أدوات مساعدة رائعة في مجموعة واسعة من حالات الاستخدام ولكن تنفيذها يثير مشكلات كبيرة فيما يتعلق بخصوصية المستخدم. في هذه المدونة، رأيت الخطوة الأولى نحو جعل LLM بالكامل يعمل على البيانات المشفرة حيث سيتم تشغيل النموذج بالكامل في السحابة مع احترام خصوصية المستخدمين بشكل كامل.

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

تسمح مكتبات Zama Concrete وConcrete-ML (لا تنسَ تمييز المستودعات بنجمة على GitHub ⭐️💛) ببناء نموذج ML مباشر وتحويله إلى ما يعادل FHE للقدرة على الحساب والتنبؤ بالبيانات المشفرة.

أتمنى أن تستمتع بهذا المنشور؛ لا تتردد في مشاركة أفكارك / تعليقاتك!

شاركها.
اترك تعليقاً