تطبيق ويب chatbot + نقاط نهاية HTTP وWebSocket لاستدلال LLM مع عميل Petals
يمكنك تجربتها على https://chat.petals.dev أو تشغيل الواجهة الخلفية على خادمك باستخدام هذه الأوامر:
git clone https://github.com/petals-infra/chat.petals.dev.git
cd chat.petals.dev
pip install -r requirements.txt
flask run --host=0.0.0.0 --port=5000
؟ تريد أن تخدم اللاما 2؟ اطلب الوصول إلى أوزانها على موقع ♾️ Meta AI و؟ Model Hub، ثم قم بتشغيل huggingface-cli login
في الجهاز قبل بدء تطبيق الويب. إذا كنت لا تريد Llama 2، فما عليك سوى إزالة نماذج meta-llama
من config.py.
؟ النشر باستخدام Gunicorn. في الإنتاج، نوصي باستخدام gunicorn بدلاً من خادم Flask dev:
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
تستخدم الدردشة WebSocket API تحت الغطاء.
توفر الواجهة الخلفية نقطتي نهاية لواجهات برمجة التطبيقات:
/api/v2/generate
، مستحسن)/api/v1/...
)الرجاء استخدام WebSocket API عندما يكون ذلك ممكنًا - فهو أسرع بكثير، وأكثر قوة، ويستهلك موارد أقل.
إذا قمت بتطوير تطبيق الويب الخاص بك، فيمكنك استخدام نقطة النهاية الخاصة بنا على https://chat.petals.dev/api/...
للبحث والتطوير، ثم قم بإعداد الواجهة الخلفية الخاصة بك للإنتاج باستخدام الأوامر أعلاه.
ملاحظة: لا ننصح باستخدام نقطة النهاية الموجودة على
https://chat.petals.dev/api/...
في الإنتاج. لديها إنتاجية محدودة، ويمكننا إيقافها مؤقتًا أو إيقافها في أي وقت.
إذا كنت تستخدم خادم وحدة المعالجة المركزية فقط، فستحتاج إلى ذاكرة وصول عشوائي كافية لتناسب عمليات التضمين لجميع الطرازات (راجع الجدول أدناه).
إذا كانت وحدة المعالجة المركزية الخاصة بك تدعم AVX512، فسيتم تحميل التضمينات بحجم 16 بت، وإلا فسيتم تحميلها بحجم 32 بت (= ذاكرة أكبر بمقدار 2x). وذلك لأن مضاعفة أوزان 16 بت بدون AVX512 تكون بطيئة وقد تؤدي إلى تباطؤ قدره 1-2 ثانية/الرمز المميز. يتوفر دعم AVX512 على وحدات المعالجة المركزية Intel Xeon الأحدث (على سبيل المثال، على قطرات DigitalOcean المزودة بوحدة معالجة مركزية مخصصة).
إذا كنت تستخدم خادم GPU، فستحتاج إلى ذاكرة GPU كافية لتناسب التضمينات لجميع الطرز. سيتم تحميل التضمينات في 16 بت.
ليس عليك أن تخدم جميع النماذج. إذا لم تكن لديك ذاكرة كافية، فقم بإزالة بعض النماذج في config.py.
العائلة النموذجية | يدمج في 16 بت | يدمج في 32 بت |
---|---|---|
لاما 2 (70ب، 70ب-شات)، لاما-65ب، جواناكو-65ب | 1.05 جيجابايت | 2.1 جيجابايت |
بلوم-176ب، بلومز-176ب | 7.19 جيجابايت | 14.38 جيجابايت |
/api/v2/generate
)تشير واجهة برمجة التطبيقات هذه إلى أنك تفتح اتصال WebSocket وتتبادل الطلبات والاستجابات المشفرة بترميز JSON. ويمكن القيام بذلك من أي لغة برمجة.
يفتح هذا الرمز جلسة استدلال باستخدام نموذج Stabilai/StableBeluga2، ويرسل المطالبة "جلست قطة"، ويأخذ عينات من الرموز المميزة الجديدة حتى يصل الطول الإجمالي إلى 30 رمزًا مميزًا. يتم أخذ العينات بدرجة حرارة = 0.6 وtop_p = 0.9.
const ws = new WebSocket ( `wss://chat.petals.dev/api/v2/generate` ) ;
ws . onopen = ( ) => {
const prompt = "A cat sat on" ;
const maxLength = 30 ;
ws . send ( JSON . stringify ( {
type : "open_inference_session" , model : "stabilityai/StableBeluga2" , max_length : maxLength
} ) ) ;
ws . send ( JSON . stringify ( {
type : "generate" , inputs : prompt , max_length : maxLength , do_sample : 1 , temperature : 0.6 , top_p : 0.9
} ) ) ;
ws . onmessage = event => {
const response = JSON . parse ( event . data ) ;
if ( response . ok ) {
if ( response . outputs === undefined ) {
console . log ( "Session opened, generating..." ) ;
} else {
console . log ( "Generated: " + prompt + response . outputs ) ;
ws . close ( ) ;
}
} else {
console . log ( "Error: " + response . traceback ) ;
ws . close ( ) ;
}
} ;
} ;
؟ هل تستخدم بايثون على Linux/macOS؟ يرجى النظر في تشغيل عميل Petals الأصلي بدلاً من ذلك. بهذه الطريقة، يمكنك الاتصال بالسرب مباشرة (بدون نقطة نهاية واجهة برمجة التطبيقات هذه) وحتى إجراء الضبط الدقيق.
يجب أن تتبع الطلبات هذا البروتوكول:
يجب أن يكون الطلب الأول من النوع open_inference_session ويتضمن هذه المعلمات:
ملحوظات:
طلب:
{ type : "open_inference_session" , max_length : 1024 }
إجابة:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
يجب أن تكون الطلبات التالية من النوع "إنشاء" وتتضمن نفس المعلمات الموجودة في /api/v1/generate HTTP API. على عكس HTTP API، يمكنك استخدام واجهة برمجة التطبيقات هذه بطريقة البث، وإنشاء رمز استجابة تلو الآخر وقبول المطالبات المتوسطة من المستخدم (على سبيل المثال، لإنشاء روبوت دردشة).
الميزة الجديدة لـ WebSocket API هي معلمة stop_sequence
(str، اختيارية). إذا قمت بتعيينه، فسيستمر الخادم في الإنشاء بنفس المعلمات ما لم ينشئ stop_sequence
، لذلك قد تحصل على استجابات متعددة دون الحاجة إلى إرسال الطلب مرة أخرى وانتظار زمن الوصول لرحلة الذهاب والإياب.
تحتوي الاستجابات المتوسطة على حقل stop: false
، والاستجابة الأخيرة تحتوي على stop: true
. على سبيل المثال، يمكنك تعيين max_new_tokens: 1
واستلام الرموز المميزة واحدًا تلو الآخر، بمجرد إنشائها. تحقق من رمز الواجهة الأمامية للدردشة للحصول على مثال تفصيلي لكيفية القيام بذلك.
طلب:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
الاستجابة (واحدة أو متعددة):
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)حدود:
معلمات التوليد (متوافقة مع .generate() من؟ المحولات):
0
(افتراضي)، فسيتم تشغيل التوليد الجشع. إذا كان 1
، يتم إجراء أخذ العينات باستخدام المعلمات أدناه.ملحوظات:
max_length
أو max_new_tokens
.do_sample=0
(افتراضي).do_sample=1, temperature=0.6, top_p=0.9
.المرتجعات (JSON):
ok == False
مثال (الضفيرة):
$ curl -X POST " https://chat.petals.dev/api/v1/generate " -d " model=meta-llama/Llama-2-70b-chat-hf " -d " inputs=Once upon a time, " -d " max_new_tokens=20 "
{ " ok " :true, " outputs " : " there was a young woman named Sophia who lived in a small village nestled in the rolling hills " }