سرویس‌دهی مدل‌های Qwen در Databricks

خلاصه

  • استقرار مدل‌های Qwen در Databricks با تطبیق آن‌ها برای زیرساخت مبتنی بر Llama.
  • بهره‌گیری از سرویس‌دهی با کارایی بالا با نقاط پایانی (endpoints) دارای تأخیر کم و توان عملیاتی بالا.
  • دنبال کردن یک گردش کار ساده برای تبدیل، ثبت و سرویس‌دهی کارآمد مدل‌های Qwen.

مدل‌های Qwen که توسط علی‌بابا توسعه یافته‌اند، عملکرد قدرتمندی در وظایف تکمیل کد و اجرای دستورالعمل‌ها نشان داده‌اند. در این بلاگ، نشان خواهیم داد که چگونه می‌توانید مدل‌های Qwen را با استفاده از رویکردی مشابه معماری‌های مبتنی بر Llama، در Databricks ثبت و مستقر کنید. با دنبال کردن این مراحل، می‌توانید از نقاط پایانی مدل پایه (Foundation Model) دیتابریکس (توان عملیاتی رزرو شده یا Provisioned Throughput) بهره‌مند شوید که از تأخیر کم و توان عملیاتی بالا سود می‌برند.

انگیزه: چرا مدل‌های Qwen را در Databricks سرویس‌دهی کنیم؟

برای بسیاری از بارِکارهای سازمانی، Databricks یک پلتفرم جامع برای آموزش، ثبت و سرویس‌دهی مدل‌های زبان بزرگ (LLMs) است. با استفاده از سرویس‌دهی مدل هوش مصنوعی Databricks Mosaic، می‌توان به راحتی مدل‌های پایه یا تنظیم دقیق شده (fine-tuned) را مستقر کرد و از آن‌ها برای وظایف استنتاج بی‌درنگ یا دسته‌ای استفاده نمود.

سری مدل‌های Qwen 2.5 که اخیراً منتشر شده‌اند، عملکرد قدرتمندی در وظایف تکمیل کد و اجرای دستورالعمل‌ها ارائه می‌دهند. مدل‌های Qwen 2.5 در زمان انتشار خود، مدل‌های با اندازه مشابه را در بنچمارک‌های استاندارد مانند MMLU، ARC-C، MATH، HumanEval و بنچمارک‌های چندزبانه مانند Multi-Exam و Multi-Understanding شکست دادند. مدل‌های Qwen 2.5 Coder نیز پیشرفت‌های مشابهی در بنچمارک‌های کدنویسی نشان می‌دهند. این ممکن است انگیزه قوی برای مشتریان فراهم کند تا این مدل‌ها را در سرویس‌دهی مدل Databricks برای تقویت موارد استفاده خود مستقر کنند.

سرویس‌دهی یک مدل Qwen در Databricks شامل چهار مرحله است:

  1. اجرای یک نوت‌بوک برای تبدیل فایل‌های مدل Qwen تا با معماری Llama و سرویس‌دهی مدل Databricks سازگار شوند.
  2. ثبت مدل Qwen در Unity Catalog.
  3. استقرار مدل ثبت شده در سرویس‌دهی مدل پایه (Foundation Model Serving) در Databricks.
  4. انجام تست کیفیت بر روی استقرار، مانند تست دستی یا اجرای بنچمارک‌های استاندارد به طور مستقیم روی نقطه پایانی (endpoint).

ایده اصلی

سرویس‌دهی مدل پایه Databricks عملکرد بهینه‌سازی شده‌ای را برای مدل‌هایی مانند مدل‌های Llama متا ارائه می‌دهد. مشتریان می‌توانند این مدل‌ها را با توان عملیاتی رزرو شده (provisioned throughput) مستقر کرده و به تأخیر کم و توان عملیاتی بالا دست یابند. اگرچه ساختار مدل زیربنایی Qwen بسیار شبیه به ساختار مدل‌های Llama است، اما برای بهره‌مندی از زیرساخت سرویس‌دهی مدل Databricks، نیاز به تغییرات خاصی وجود دارد. مراحل زیر توضیح می‌دهند که چگونه مشتریان می‌توانند تغییرات لازم را اعمال کنند.

پیاده‌سازی: راهنمای کد با توضیحات

بخش ۱) بازنویسی وزن‌ها و پیکربندی Qwen برای سازگاری با مدل‌های Llama.

مراحل موجود در modify_qwen.py یک مدل Qwen2.5 را گرفته و آن را بازنویسی می‌کنند تا با معماری Llama که برای توان عملیاتی رزرو شده در Databricks بهینه‌سازی شده است، سازگار باشد. در اینجا مراحل کلیدی کد آورده شده است:

  1. بارگذاری دیکشنری وضعیت (State Dict) Qwen: جمع‌آوری فایل‌های .safetensors از دایرکتوری اصلی Qwen.
  2. کپی و تنظیم وزن‌ها: درج بایاس‌های صفر برای خروجی‌های توجه (attention) در جایی که Llama انتظار دارد.
  3. بازنویسی پیکربندی (Config): به‌روزرسانی فیلدهایی مانند "architectures" و "model_type" به "llama" و حذف پرچم‌های مخصوص Qwen.
  4. کپی فایل‌های توکنایزر (Tokenizer): اطمینان از انتقال فایل‌های tokenizer.json، merges.txt و غیره.
  5. ایجاد پوشه خروجی نهایی: فایل‌های موجود در دایرکتوری جدید باعث می‌شوند که شبیه یک مدل Llama معمولی به نظر برسد.

در پایان این مرحله، شما یک مدل Qwen سازگار با Llama دارید. می‌توانید مدل را در vLLM بارگذاری کنید و باید آن را به عنوان یک مدل Llama در نظر بگیرد و بسته به مدلی که استفاده کرده‌اید، قادر به تولید کد یا دنبال کردن دستورالعمل‌ها باشد.

نکته: می‌توانید از huggingface_hub.snapshot_download برای دریافت یکی از مدل‌های Qwen مانند Qwen/Qwen2.5-Coder-7B-Instruct از Hugging Face به یک دایرکتوری قبل از انجام تبدیل استفاده کنید.

بخش ۲) ثبت و سرویس‌دهی Qwen در Databricks

در ادامه بر روی نحوه ثبت لاگ و سرویس‌دهی مدل "Qwen به عنوان Llama" در Databricks تمرکز خواهیم کرد. این کار توسط register_qwen.py انجام می‌شود. مراحل اینجا اطمینان می‌دهند که مدل دارای پیکربندی مورد انتظار سرویس‌دهی مدل برای یک مدل Llama است. مراحل کلیدی عبارتند از:

  1. مشخص کردن مسیر مدل تبدیل شده از مرحله قبل.
  2. تغییر پیکربندی‌های توکنایزر (به ویژه حذف chat_template و تنظیم tokenizer_class).
  3. تنظیم config.json برای منعکس کردن طول دنباله‌های سازگار با Llama.
  4. به‌روزرسانی مدل با فراداده‌های شبیه Llama قبل از ثبت لاگ.
  5. ثبت مدل با MLflow، تا بتوان آن را در یک نقطه پایانی GPU سرویس‌دهی کرد.

پس از اجرای این نوت‌بوک، مدل در Unity Catalog ثبت می‌شود. به مدل بروید و روی "Serve this model" کلیک کنید تا نقطه پایانی را تنظیم کنید. باید گزینه تنظیم نقطه پایانی با ورودی رزرو شده با نرخ‌های مختلف توکن بر ثانیه را مشاهده کنید.

تست نقطه پایانی (Endpoint)

هنگامی که نقطه پایانی آماده شد، می‌توانید چند تست اولیه برای تأیید عملکرد صحیح آن انجام دهید. فرض کنید که مدل Qwen2.5-Coder-7B را پس از انجام تبدیل و ثبت فوق مستقر کرده‌ایم. این مدل قادر به تکمیل یک قطعه کد یا انجام تکمیل در وسط (fill-in-the-middle) است. بیایید از آن برای تکمیل یک تابع مرتب‌سازی ساده استفاده کنیم. زیر منوی کشویی "Use"، روی "Query" کلیک کنید و درخواست زیر را وارد نمایید:

نمونه تکمیل کد: کد الگوریتم مرتب‌سازی را در این بلاگ وارد کنید.

متن در پاسخ شامل بقیه پیاده‌سازی است:

عملکرد و محدودیت‌ها

  1. قالب‌بندی دستی چت
    از آنجایی که قالب چت (chat template) داخلی Qwen را حذف می‌کنیم، باید پیام‌های سیستم/کاربر/دستیار را به صورت دستی در کد کلاینت خود قالب‌بندی کنید. این تضمین می‌کند که مدل همچنان بتواند نوبت‌های مکالمه را به درستی تفسیر کند.
  2. حداکثر نشانه‌گذاری موقعیت (Max Position Embeddings)
    ما max_position_embeddings را روی ۱۶۰۰۰ توکن تنظیم می‌کنیم تا با محدودیت‌های خاص Databricks مطابقت داشته باشد. اگر Qwen در اصل از مقدار بیشتری پشتیبانی می‌کرد، ممکن است مقداری از حداکثر طول زمینه (context length) را از دست بدهید. با این حال، همچنان از پشتیبانی توان عملیاتی رزرو شده بهره‌مند خواهید شد.

خلاصه و مراحل بعدی

اگرچه Databricks امروزه مستقیماً از مدل‌های Qwen در سرویس‌دهی مدل با توان عملیاتی رزرو شده پشتیبانی نمی‌کند، روش فوق به شما امکان می‌دهد این مدل‌ها را با موفقیت ثبت و سرویس‌دهی کنید، با هماهنگ‌سازی آن‌ها برای سازگاری با معماری مدل‌های Llama. این راه حل جایگزین به ویژه اگر تیم شما به قابلیت‌های Qwen نیاز دارد اما همچنین راحتی نقاط پایانی سرویس‌دهی مدل Databricks و توان عملیاتی رزرو شده را می‌خواهد، مفید است.

نکته کلیدی

  • مدل‌های Qwen و Llama به اندازه‌ای شباهت‌های معماری مشترک دارند که با چند تغییر جزئی (یعنی در پیکربندی توکنایزر و فراداده مدل)، زیرساخت سرویس‌دهی مدل Databricks می‌تواند به راحتی مدل‌های Qwen را با استفاده از توان عملیاتی رزرو شده سرویس‌دهی کند.

ملاحظات آینده

  • توصیه می‌کنیم مراقب پشتیبانی رسمی Qwen در سرویس‌دهی مدل Databricks باشید.
  • سربار عملکرد ناشی از محدود کردن اجباری اندازه زمینه را ارزیابی کنید.
  • اگر به پرامپت‌های چت متکی هستید، به یاد داشته باشید که پرامپت‌های خود را به صورت دستی در سمت کلاینت قالب‌بندی کنید.

سپاسگزاری‌ها

  • hiyouga's llamafy_qwen.py برای نمونه اولیه‌ای که اساس تبدیل Qwen را فراهم کرد.
  • تیم مهندسی Databricks برای روشن کردن محدودیت‌های داخلی سرویس‌دهی.
  • همه اعضای جامعه که این رویکرد را آزمایش و اصلاح کردند.