هوش داده افلاطون
جستجوی عمودی و هوش مصنوعی

تنظیم دقیق کد لاما در Amazon SageMaker JumpStart | خدمات وب آمازون

تاریخ:

امروز، ما هیجان زده هستیم که قابلیت تنظیم دقیق مدل های Code Llama توسط متا را با استفاده از Amazon SageMaker JumpStart. خانواده مدل‌های زبان بزرگ Code Llama (LLMs) مجموعه‌ای از مدل‌های تولید کد از پیش آموزش‌دیده و تنظیم‌شده در مقیاس ۷ تا ۷۰ میلیارد پارامتر است. مدل‌های Code Llama با تنظیم دقیق، دقت و توضیح بهتری را نسبت به مدل‌های Code Llama پایه ارائه می‌کنند، همانطور که در آزمایش آن در برابر مشهود است. HumanEval و مجموعه داده های MBPP. می‌توانید با استفاده از SageMaker JumpStart مدل‌های Code Llama را تنظیم و اجرا کنید Amazon SageMaker Studio UI با چند کلیک یا با استفاده از SageMaker Python SDK. تنظیم دقیق مدل های Llama بر اساس اسکریپت های ارائه شده در مخزن GitHub دستور العمل های لاما از متا با استفاده از PyTorch FSDP، PEFT/LoRA، و تکنیک های کوانتیزه سازی Int8.

در این پست، نحوه تنظیم دقیق مدل‌های از پیش آموزش‌دیده Code Llama از طریق SageMaker JumpStart را از طریق تجربه UI و SDK با یک کلیک که در موارد زیر در دسترس است توضیح می‌دهیم. مخزن GitHub.

SageMaker JumpStart چیست؟

با SageMaker JumpStart، متخصصان یادگیری ماشین (ML) می‌توانند از میان مجموعه وسیعی از مدل‌های پایه در دسترس عموم انتخاب کنند. پزشکان ML می توانند مدل های پایه را به صورت اختصاصی به کار گیرند آمازون SageMaker نمونه هایی از یک محیط جدا شده از شبکه و سفارشی کردن مدل ها با استفاده از SageMaker برای آموزش و استقرار مدل.

کد لاما چیست؟

Code Llama یک نسخه کد تخصصی است لاما 2 که با آموزش بیشتر Llama 2 در مجموعه داده‌های کد خاص آن و نمونه‌برداری از داده‌های بیشتر از همان مجموعه داده برای مدت طولانی‌تر ایجاد شد. Code Llama دارای قابلیت های کدگذاری پیشرفته ای است. می‌تواند کد و زبان طبیعی درباره کد، هم از کد و هم از اعلان‌های زبان طبیعی تولید کند (به عنوان مثال، «برای من تابعی بنویس که دنباله فیبوناچی را خروجی می‌کند»). همچنین می توانید از آن برای تکمیل کد و اشکال زدایی استفاده کنید. این برنامه از بسیاری از محبوب ترین زبان های برنامه نویسی مورد استفاده امروزه پشتیبانی می کند، از جمله Python، C++، Java، PHP، Typescript (JavaScript)، C#، Bash و غیره.

چرا مدل های Code Llama را دقیق تنظیم کنید

متا معیارهای عملکرد Code Llama را منتشر کرد HumanEval و MBPP برای زبان های کدنویسی رایج مانند پایتون، جاوا و جاوا اسکریپت. عملکرد مدل‌های Code Llama Python در HumanEval عملکرد متفاوتی را در زبان‌های برنامه‌نویسی مختلف و وظایف مختلف از 38٪ در مدل 7B Python تا 57٪ در مدل‌های 70B Python نشان داد. علاوه بر این، مدل‌های Code Llama با تنظیم دقیق در زبان برنامه‌نویسی SQL نتایج بهتری را نشان داده‌اند، همانطور که در معیارهای ارزیابی SQL مشهود است. این معیارهای منتشر شده مزایای بالقوه تنظیم دقیق مدل‌های Code Llama را برجسته می‌کنند که عملکرد بهتر، سفارشی‌سازی و انطباق با حوزه‌ها و وظایف برنامه‌نویسی خاص را ممکن می‌سازد.

تنظیم دقیق بدون کد از طریق رابط کاربری SageMaker Studio

برای شروع به تنظیم دقیق مدل های Llama با استفاده از SageMaker Studio، مراحل زیر را انجام دهید:

  1. در کنسول SageMaker Studio، را انتخاب کنید شروع به کار در صفحه ناوبری

لیستی از بیش از 350 مدل از مدل های منبع باز و اختصاصی را خواهید یافت.

  1. مدل های Code Llama را جستجو کنید.

اگر مدل‌های Code Llama را نمی‌بینید، می‌توانید نسخه SageMaker Studio خود را با خاموش کردن و راه‌اندازی مجدد به‌روزرسانی کنید. برای اطلاعات بیشتر در مورد به روز رسانی نسخه، مراجعه کنید برنامه های استودیو را خاموش و به روز کنید. شما همچنین می توانید مدل های دیگر را با انتخاب پیدا کنید تمام مدل های تولید کد را کاوش کنید یا کد لاما را در کادر جستجو جستجو کنید.

SageMaker JumpStart در حال حاضر از تنظیم دقیق دستورالعمل برای مدل های Code Llama پشتیبانی می کند. تصویر زیر صفحه تنظیم دقیق مدل Code Llama 2 70B را نشان می دهد.

  1. برای مکان مجموعه داده های آموزشی، می توانید به آن اشاره کنید سرویس ذخیره سازی ساده آمازون سطل (Amazon S3) حاوی مجموعه داده‌های آموزشی و اعتبارسنجی برای تنظیم دقیق.
  2. پیکربندی استقرار، فراپارامترها و تنظیمات امنیتی خود را برای تنظیم دقیق تنظیم کنید.
  3. را انتخاب کنید قطار برای شروع کار تنظیم دقیق در یک نمونه SageMaker ML.

در بخش بعدی در مورد قالب مجموعه داده ای که برای تنظیم دقیق دستورالعمل ها نیاز دارید صحبت می کنیم.

  1. پس از تنظیم دقیق مدل، می توانید آن را با استفاده از صفحه مدل در SageMaker JumpStart اجرا کنید.

همانطور که در تصویر زیر نشان داده شده است، گزینه استقرار مدل تنظیم شده پس از اتمام تنظیم دقیق ظاهر می شود.

تنظیم دقیق از طریق SageMaker Python SDK

در این بخش، نحوه تنظیم دقیق مدل‌های Code LIama را با استفاده از SageMaker Python SDK بر روی یک مجموعه داده با فرمت دستورالعمل نشان می‌دهیم. به طور خاص، این مدل برای مجموعه‌ای از وظایف پردازش زبان طبیعی (NLP) که با استفاده از دستورالعمل‌ها شرح داده شده‌اند، تنظیم شده است. این به بهبود عملکرد مدل برای کارهای غیرقابل مشاهده با اعلان‌های شات صفر کمک می‌کند.

مراحل زیر را برای تکمیل کار تنظیم دقیق خود انجام دهید. می توانید کل کد تنظیم دقیق را از مخزن GitHub.

ابتدا، اجازه دهید به قالب مجموعه داده مورد نیاز برای تنظیم دقیق دستورالعمل نگاه کنیم. داده های آموزشی باید در قالب خطوط JSON (jsonl.) قالب بندی شوند، که در آن هر خط یک فرهنگ لغت است که نمونه داده را نشان می دهد. تمام داده های آموزشی باید در یک پوشه واحد باشد. با این حال، می توان آن را در چندین فایل .jsonl ذخیره کرد. نمونه زیر در قالب خطوط JSON است:

{
	'system_prompt': 'a chat',
	'question': 'Please focus on the efficiency of this problem and provide code in python:nYou are given two strings `s` and `t` consisting of only lowercase English letters.nnReturn _the minimum number of characters that need to be appended to the end of_ `s` _so that_ `t` _becomes a **subsequence** of_ `s`.nnA **subsequence** is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.nn**Example 1:**nn**Input:** s = "coaching ", t = "coding "n**Output:** 4n**Explanation:** Append the characters "ding " to the end of s so that s = "coachingding ".nNow, t is a subsequence of s ( "**co**aching**ding** ").nIt can be shown that appending any 3 characters to the end of s will never make t a subsequence.nn**Example 2:**nn**Input:** s = "abcde ", t = "a "n**Output:** 0n**Explanation:** t is already a subsequence of s ( "**a**bcde ").nn**Example 3:**nn**Input:** s = "z ", t = "abcde "n**Output:** 5n**Explanation:** Append the characters "abcde " to the end of s so that s = "zabcde ".nNow, t is a subsequence of s ( "z**abcde** ").nIt can be shown that appending any 4 characters to the end of s will never make t a subsequence.nn**Constraints:**nn* `1 <= s.length, t.length <= 105`n* `s` and `t` consist only of lowercase English letters.',
	'response': '### Explanationn The algorithm maintains two pointers, `i` and `j`, to iterate through the given strings `s` and `t`. The pointer `i` iterates through the string `s` and the pointer `j` iterates through the string `t`. While iterating through `s`, if we find a character that matches the current character in `t`, we increment the `j` pointer. This is because the matched character can be a part of the subsequence we are looking for. The iteration stops when either `i` reaches the end of `s` or `j` reaches the end of `t`.nnAt the end, we subtract the index `j` from the length of `t`. This gives us the minimum number of characters that need to be appended to the end of `s` so that `t` becomes a subsequence of `s`.nn### Pseudocode:n```nMIN-ADDITION(s, t)n s_len = LENGTH(s)n t_len = LENGTH(t)n i = 1n j = 1n WHILE i <= s_len AND j <= t_lenn IF s[i] == t[j]n j = j + 1n ENDIFn i = i + 1n ENDWHILEn RETURN t_len - j + 1nENDMIN-ADDITIONn```nn### Coden```pythonndef min_addition(s: str, t: str) -> int:n s_len = len(s)n t_len = len(t)n i, j = 0, 0n while i < s_len and j < t_len:n if s[i] == t[j]:n j += 1n i += 1n return t_len - jn```n'
}

پوشه آموزش می تواند حاوی یک template.json فایلی که فرمت های ورودی و خروجی را توصیف می کند. نمونه زیر نمونه ای از قالب است:

{
    "prompt": "{system_prompt} ### Input: {question}",
    "completion": "{response}"
}

برای مطابقت با الگو، هر نمونه در فایل‌های خطوط JSON باید شامل شود system_prompt, questionو response زمینه های. در این نمایش از مجموعه داده کدگذار دلفین از در آغوش گرفتن صورت.

پس از اینکه مجموعه داده را آماده کردید و آن را در سطل S3 آپلود کردید، می توانید با استفاده از کد زیر تنظیم دقیق را شروع کنید:

from sagemaker.jumpstart.estimator import JumpStartEstimator

model_id = "meta-textgeneration-llama-codellama-7b" 
model_version = "*"
train_data_location = f"s3://{your_own_bucket_hosting_training_data}/" # training data in s3 bucket

estimator = JumpStartEstimator(
    model_id=model_id,
    model_version=model_version,
    hyperparameters= hyperparameters,
    environment={
        "accept_eula": "false"
    },  # please change `accept_eula` to be `true` to accept EULA.
)

estimator.fit({"training": train_data_location})

همانطور که در کد زیر نشان داده شده است، می توانید مدل تنظیم شده را مستقیماً از تخمینگر مستقر کنید. برای جزئیات، به نوت بوک در مخزن GitHub.

finetuned_predictor = estimator.deploy()

تکنیک های تنظیم دقیق

مدل های زبانی مانند Llama بیش از 10 گیگابایت یا حتی 100 گیگابایت حجم دارند. تنظیم دقیق چنین مدل های بزرگی به نمونه هایی با حافظه CUDA بسیار بالا نیاز دارد. علاوه بر این، آموزش این مدل ها به دلیل اندازه مدل می تواند بسیار کند باشد. بنابراین، برای تنظیم دقیق کارآمد، از بهینه‌سازی‌های زیر استفاده می‌کنیم:

  • سازگاری با رتبه پایین (LoRA) - این یک نوع تنظیم دقیق کارآمد پارامتر (PEFT) برای تنظیم دقیق کارآمد مدل های بزرگ است. با این روش کل مدل را فریز می کنید و فقط مجموعه کوچکی از پارامترها یا لایه های قابل تنظیم را به مدل اضافه می کنید. به عنوان مثال، به جای آموزش تمام 7 میلیارد پارامتر برای Llama 2 7B، می توانید کمتر از 1٪ از پارامترها را تنظیم کنید. این به کاهش قابل توجه نیاز به حافظه کمک می کند زیرا فقط برای 1٪ از پارامترها باید گرادیان ها، حالت های بهینه ساز و سایر اطلاعات مربوط به آموزش را ذخیره کنید. علاوه بر این، این به کاهش زمان آموزش و همچنین کاهش هزینه کمک می کند. برای جزئیات بیشتر در مورد این روش، مراجعه کنید LoRA: انطباق با رتبه پایین مدل های زبان بزرگ.
  • کوانتیزاسیون Int8 – حتی با بهینه‌سازی‌هایی مانند LoRA، مدل‌هایی مانند Llama 70B هنوز برای آموزش بسیار بزرگ هستند. برای کاهش ردپای حافظه در حین تمرین، می توانید از کوانتیزاسیون Int8 در حین تمرین استفاده کنید. کوانتیزاسیون معمولاً دقت انواع داده های ممیز شناور را کاهش می دهد. اگرچه این باعث کاهش حافظه مورد نیاز برای ذخیره وزن مدل می شود، اما به دلیل از دست دادن اطلاعات، عملکرد را کاهش می دهد. کوانتیزاسیون Int8 فقط از یک چهارم دقت استفاده می کند، اما باعث کاهش عملکرد نمی شود زیرا به سادگی بیت ها را رها نمی کند. داده ها را از یک نوع به نوع دیگر گرد می کند. برای آشنایی با کوانتیزاسیون Int8 به ادامه مطلب مراجعه کنید LLM.int8(): ضرب ماتریس 8 بیتی برای ترانسفورماتورها در مقیاس.
  • موازی داده کاملاً خرد شده (FSDP) - این یک نوع الگوریتم آموزشی موازی داده است که پارامترهای مدل را در بین کارگران موازی داده تقسیم می کند و می تواند به صورت اختیاری بخشی از محاسبات آموزشی را به CPU ها بارگذاری کند. اگرچه پارامترها در بین GPU های مختلف تقسیم می شوند، محاسبه هر میکروبچ برای کارگر GPU محلی است. پارامترها را به طور یکنواخت‌تر خرد می‌کند و از طریق ارتباط و همپوشانی محاسباتی در طول آموزش، عملکرد بهینه‌ای را به دست می‌آورد.

جدول زیر جزئیات هر مدل را با تنظیمات مختلف خلاصه می کند.

مدل تنظیمات پیشفرض LORA + FSDP LORA + بدون FSDP Quantization Int8 + LORA + بدون FSDP
کد Llama 2 7B LORA + FSDP بله بله بله
کد Llama 2 13B LORA + FSDP بله بله بله
کد Llama 2 34B INT8 + LORA + NO FSDP نه نه بله
کد Llama 2 70B INT8 + LORA + NO FSDP نه نه بله

تنظیم دقیق مدل های Llama بر اساس اسکریپت های ارائه شده توسط زیر است GitHub repo.

هایپرپارامترهای پشتیبانی شده برای آموزش

تنظیم دقیق Code Llama 2 از تعدادی فراپارامتر پشتیبانی می کند که هر کدام می توانند بر نیاز حافظه، سرعت تمرین و عملکرد مدل تنظیم شده تأثیر بگذارند:

  • دوره - تعداد پاس هایی که الگوریتم تنظیم دقیق از مجموعه داده آموزشی انجام می دهد. باید یک عدد صحیح بزرگتر از 1 باشد. پیش فرض 5 است.
  • یادگیری_نرخ – سرعتی که وزن های مدل پس از کار در هر دسته از نمونه های آموزشی به روز می شوند. باید یک شناور مثبت بزرگتر از 0 باشد. پیش فرض 1e-4 است.
  • instruction_tuned – اینکه آیا مدل را آموزش می دهد یا نه. باید باشد True or False. پیش فرض است False.
  • اندازه هر_دستگاه_قطار_بچ - اندازه دسته در هر هسته GPU/CPU برای آموزش. باید یک عدد صحیح مثبت باشد. پیش فرض 4 است.
  • اندازه هر_دستگاه_eval_batch - اندازه دسته در هر هسته GPU/CPU برای ارزیابی. باید یک عدد صحیح مثبت باشد. پیش فرض 1 است.
  • max_train_samples - برای اهداف اشکال زدایی یا آموزش سریعتر، تعداد نمونه های آموزشی را به این مقدار کاهش دهید. مقدار -1 به معنای استفاده از تمام نمونه های آموزشی است. باید یک عدد صحیح مثبت یا -1 باشد. پیش فرض -1 است.
  • max_val_samples - برای اهداف اشکال زدایی یا آموزش سریعتر، تعداد نمونه های اعتبارسنجی را به این مقدار کوتاه کنید. مقدار -1 به معنای استفاده از تمام نمونه های اعتبار سنجی است. باید یک عدد صحیح مثبت یا -1 باشد. پیش فرض -1 است.
  • حداکثر_طول_ورودی - حداکثر طول توالی ورودی کل پس از توکن سازی. دنباله های طولانی تر از این کوتاه می شوند. اگر -1، max_input_length روی حداقل 1024 و حداکثر طول مدل تعریف شده توسط توکنایزر تنظیم شده است. اگر روی مقدار مثبت تنظیم شود، max_input_length بر روی حداقل مقدار ارائه شده تنظیم شده است model_max_length توسط توکنایزر تعریف شده است. باید یک عدد صحیح مثبت یا -1 باشد. پیش فرض -1 است.
  • اعتبار_شکل_نسبت - اگر کانال اعتبارسنجی باشد none، نسبت تقسیم اعتبار قطار از داده های قطار باید بین 0-1 باشد. پیش فرض 0.2 است.
  • train_data_split_seed - اگر داده های اعتبار سنجی وجود نداشته باشد، این تقسیم تصادفی داده های آموزشی ورودی به داده های آموزشی و اعتبار سنجی مورد استفاده توسط الگوریتم را برطرف می کند. باید یک عدد صحیح باشد. پیش فرض 0 است.
  • preprocessing_num_workers - تعداد فرآیندهایی که برای پیش پردازش استفاده می شود. اگر None، فرآیند اصلی برای پیش پردازش استفاده می شود. پیش فرض است None.
  • lora_r – Lora R. باید یک عدد صحیح مثبت باشد. پیش فرض 8 است.
  • lora_alpha - لورا آلفا. باید یک عدد صحیح مثبت باشد. پیش فرض 32 است
  • lora_droopout - ترک تحصیل لورا باید شناور مثبت بین 0 و 1 باشد. پیش فرض 0.05 است.
  • int8_quantization - اگر True، مدل با دقت 8 بیت برای آموزش بارگذاری شده است. پیش فرض برای 7B و 13B است False. پیش فرض برای 70B است True.
  • enable_fsdp - اگر درست باشد، آموزش از FSDP استفاده می کند. پیش‌فرض 7B و 13B True است. پیش فرض 70B False است. توجه داشته باشید که int8_quantization با FSDP پشتیبانی نمی شود.

هنگام انتخاب هایپرپارامترها، موارد زیر را در نظر بگیرید:

  • محیط int8_quantization=True نیاز به حافظه را کاهش می دهد و منجر به تمرین سریعتر می شود.
  • کاهنده per_device_train_batch_size و max_input_length نیاز به حافظه را کاهش می دهد و بنابراین می تواند در نمونه های کوچکتر اجرا شود. با این حال، تنظیم مقادیر بسیار پایین ممکن است زمان تمرین را افزایش دهد.
  • اگر از کوانتیزاسیون Int8 استفاده نمی کنید (int8_quantization=False، از FSDP استفاده کنید (enable_fsdp=True) برای آموزش سریعتر و کارآمدتر.

انواع نمونه های پشتیبانی شده برای آموزش

جدول زیر انواع نمونه های پشتیبانی شده برای آموزش مدل های مختلف را خلاصه می کند.

مدل نوع نمونه پیش فرض انواع نمونه های پشتیبانی شده
کد Llama 2 7B ml.g5.12xlarge

ml.g5.12xlarge،

ml.g5.24xlarge،

ml.g5.48xlarge،

ml.p3dn.24xlarge،

ml.g4dn.12xlarge

کد Llama 2 13B ml.g5.12xlarge

ml.g5.24xlarge،

ml.g5.48xlarge،

ml.p3dn.24xlarge،

ml.g4dn.12xlarge

کد Llama 2 70B ml.g5.48xlarge

ml.g5.48xlarge

ml.p4d.24xlarge

هنگام انتخاب نوع نمونه، موارد زیر را در نظر بگیرید:

  • نمونه های G5 کارآمدترین آموزش را در بین انواع نمونه های پشتیبانی شده ارائه می دهند. بنابراین، اگر نمونه های G5 در دسترس دارید، باید از آنها استفاده کنید.
  • زمان آموزش تا حد زیادی به تعداد GPU ها و حافظه CUDA موجود بستگی دارد. بنابراین، آموزش روی نمونه‌هایی با تعداد واحد پردازش گرافیکی (مثلاً ml.g5.2xlarge و ml.g5.4xlarge) تقریباً یکسان است. بنابراین، می‌توانید از نمونه ارزان‌تر برای آموزش استفاده کنید (ml.g5.2xlarge).
  • هنگام استفاده از نمونه های p3، آموزش با دقت 32 بیتی انجام می شود زیرا bfloat16 در این نمونه ها پشتیبانی نمی شود. بنابراین، کار آموزش در مقایسه با نمونه های g3، دو برابر مقدار حافظه CUDA را هنگام آموزش روی نمونه های p5 مصرف می کند.

برای اطلاع از هزینه آموزش به ازای هر نمونه به نمونه های آمازون EC2 G5.

ارزیابی

ارزیابی گام مهمی برای ارزیابی عملکرد مدل‌های تنظیم‌شده است. ما هر دو ارزیابی کیفی و کمی را برای نشان دادن بهبود مدل‌های تنظیم‌شده نسبت به مدل‌های تنظیم نشده ارائه می‌کنیم. در ارزیابی کیفی، ما یک پاسخ نمونه را از هر دو مدل تنظیم دقیق و غیر دقیق نشان می دهیم. در ارزیابی کمی استفاده می کنیم HumanEvalیک مجموعه آزمایشی که توسط OpenAI برای تولید کد پایتون برای آزمایش توانایی‌های تولید نتایج صحیح و دقیق ایجاد شده است. مخزن HumanEval تحت مجوز MIT است. ما انواع پایتون را از تمام مدل‌های Code LIama در اندازه‌های مختلف تنظیم کردیم (Code LIama Python 7B، 13B، 34B، و 70B در مجموعه داده کدگذار دلفین) و نتایج ارزیابی را در بخش های بعدی ارائه دهید.

ارزیابی کیفی

با استقرار مدل دقیق تنظیم شده خود، می توانید از نقطه پایانی برای تولید کد استفاده کنید. در مثال زیر، ما پاسخ هایی را از هر دو نوع پایه و تنظیم دقیق کد LIama 34B پایتون بر روی یک نمونه آزمایشی در مجموعه داده کدگذار دلفین:

alpaca_format = """{system_prompt}

### Input:
{question}

### Response:n"""

system="You are a coding AI"
prompt = """Please explain the reasoning behind the following solution and 
provide code in python: Given a string `s`, return the longest palindromic 
substring in `s`. **Example 1:** **Input:** s = "babad " **Output:** "bab " 
**Explanation:** "aba " is also a valid answer. **Example 2:** 
**Input:** s = "cbbd " **Output:** "bb " 
**Constraints:** * `1 <= s.length <= 1000` * `s` consist of only digits 
and English letters."""

payload = json.dumps({
    "inputText": alpaca_format.format(system_prompt=system, question=prompt),
    "textGenerationConfig": {
    "maxTokenCount": 2048,
    "temperature":0.2
}})

finetuned_response = finetuned_predictor.predict(payload)
finetuned_response["generated_text"]

مدل Code Llama با تنظیم دقیق، علاوه بر ارائه کد برای پرس و جو قبلی، توضیح مفصلی از رویکرد و یک شبه کد ایجاد می کند.

کد Llama 34b پایتون پاسخ دقیق تنظیم نشده:

### Code
def longestPalindrome(s):
    # Fill this in.
    longest = ""
    for i in range(len(s)):
        for j in range(len(s), i, -1):
            if len(longest) >= j-i:
                break
            elif s[i:j] == s[i:j][::-1]:
                longest = s[i:j]
                break
    return longest

print(longestPalindrome("abaxyzzyxf"))
# axyzzyx
###Reference:
- [https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/]
(https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/)

کد Llama 34B Python Fine-Tuned Response

### Explanation
The algorithm uses dynamic programming to find the longest palindromic substring. 
It initializes a 2D boolean table `dp` with the same dimensions as the input string `s`. 
The `dp[i][j]` value is set to `true` if the substring from index `i` to index `j` is a palindrome.

The algorithm then iterates through the string in a nested loop, starting from the first character to the last. 
It checks if the substring from index `i` to index `j` is a palindrome. 
If it is, it sets the `dp[i][j]` value to `true`. 
If the substring is of length 2 or 3, it sets the `dp[i][j]` value to `true` as well.

After the nested loop, the algorithm iterates through the `dp` table to find the longest palindromic substring. 
It keeps track of the maximum length and the starting and ending indices of the substring.

Finally, the algorithm returns the substring from the starting index to the ending index.

### Code
```python
def longestPalindrome(s: str) -> str:
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    for i in range(n):
        dp[i][i] = True
        if i + 1 < n:
            dp[i][i + 1] = s[i] == s[i + 1]

    max_len = 1
    start = 0
    end = 0

    for i in range(n - 1):
        for j in range(i + 1, n):
            if j - i == 1 or dp[i + 1][j - 1]:
                dp[i][j] = s[i] == s[j]
                if j - i + 1 > max_len:
                    max_len = j - i + 1
                    start = i
                    end = j

    return s[start:end + 1]
```

حقیقت زمینی

### Explanation 
1. Initialize `start` and `maxLength` for result substring. 
2. Iterate through the given string `s` using the index `i`. 
3. For each index `i`, create two pointers `l` and `r` starting at `i`. 
4. Check if there's a consecutive sequence of identical characters, increment the right pointer `r` until the end of the sequence is reached. 
5. Update the index `i` to the current value of `r`. 
6. Expand the pointers `l` and `r` outwards to find the longest palindromic substring, checking that characters on both sides are equal. 
7. If the current length of the substring is greater than `maxLength`, update `start` and `maxLength`. 
8. Return the longest palindromic substring using the `start` and `maxLength`. 

### Code 
```python 
def longest_palindromic_substring(s: str) → str:
    n = len(s)
    if n == 0:
        return ""
    
    start, max_length = 0, 1
    for i in range(n):
        l, r = i, i
        while r < n - 1 and s[r] == s[r + 1]:
            r += 1
            i = r
        while l > 0 and r < n - 1 and s[l - 1] == s[r + 1]:
            l -= 1
            r += 1
        length = r - l + 1
        if length > max_length:
            start, max_length = l, length
    return s[start:start + max_length]
```

جالب توجه است که نسخه تنظیم شده ما از Code Llama 34B Python یک راه حل مبتنی بر برنامه نویسی پویا را برای طولانی ترین زیررشته پالیندرومیک ارائه می دهد که با راه حل ارائه شده در حقیقت زمین از نمونه آزمایشی انتخاب شده متفاوت است. مدل دقیق ما راه حل مبتنی بر برنامه نویسی پویا را با جزئیات توضیح داده و توضیح می دهد. از سوی دیگر، مدل تنظیم نشده خروجی های بالقوه را بلافاصله پس از توهم ایجاد می کند print عبارت (در سلول سمت چپ نشان داده شده است) زیرا خروجی axyzzyx طولانی ترین پالیندروم در رشته داده شده نیست. از نظر پیچیدگی زمانی، راه حل برنامه نویسی پویا به طور کلی بهتر از رویکرد اولیه است. راه حل برنامه نویسی پویا دارای پیچیدگی زمانی O(n^2) است که n طول رشته ورودی است. این کارآمدتر از راه حل اولیه از مدل بدون تنظیم دقیق است، که همچنین دارای پیچیدگی زمانی درجه دوم O(n^2) اما با رویکرد بهینه کمتر است.

این امیدوار کننده به نظر می رسد! به یاد داشته باشید، ما فقط نوع Code LIama Python را با 10 درصد تنظیم دقیق کردیم مجموعه داده کدگذار دلفین. چیزهای بیشتری برای کشف وجود دارد!

با وجود دستورالعمل های کامل در پاسخ، ما هنوز باید صحت کد پایتون ارائه شده در راه حل را بررسی کنیم. در مرحله بعد از یک چارچوب ارزیابی به نام استفاده می کنیم ارزش انسانی برای اجرای تست های یکپارچه سازی روی پاسخ تولید شده از Code LIama برای بررسی سیستماتیک کیفیت آن.

ارزیابی کمی با HumanEval

HumanEval یک مهار ارزیابی برای ارزیابی قابلیت های حل مسئله LLM در مسائل کدگذاری مبتنی بر پایتون است، همانطور که در مقاله توضیح داده شد. ارزیابی مدل های زبان بزرگ آموزش داده شده بر روی کد. به طور خاص، شامل 164 مشکل برنامه نویسی اصلی مبتنی بر پایتون است که توانایی یک مدل زبان را برای تولید کد بر اساس اطلاعات ارائه شده مانند امضای تابع، رشته مستند، بدنه و تست های واحد ارزیابی می کند.

برای هر سوال برنامه نویسی مبتنی بر پایتون، آن را به یک مدل Code LIama مستقر در نقطه پایانی SageMaker می فرستیم تا k پاسخ دریافت کنیم. سپس، هر یک از پاسخ‌های k را روی تست‌های یکپارچه‌سازی در مخزن HumanEval اجرا می‌کنیم. اگر هر یک از پاسخ‌های k تست‌های یکپارچه‌سازی را پشت سر بگذارد، آن مورد آزمایش را موفق حساب می‌کنیم. در غیر این صورت شکست خورد سپس فرآیند را تکرار می کنیم تا نسبت موارد موفق را به عنوان امتیاز ارزیابی نهایی که نامگذاری شده است، محاسبه کنیم pass@k. با پیروی از روش استاندارد، ما k را به عنوان 1 در ارزیابی خود قرار می دهیم تا فقط یک پاسخ در هر سوال ایجاد کنیم و آزمایش کنیم که آیا آزمون یکپارچه سازی را قبول می کند یا خیر.

کد زیر نمونه ای برای استفاده از مخزن HumanEval است. شما می توانید به مجموعه داده دسترسی داشته باشید و با استفاده از نقطه پایانی SageMaker یک پاسخ واحد ایجاد کنید. برای جزئیات، به نوت بوک در مخزن GitHub.

%pip3 install human_eval
import json
from human_eval.evaluation import evaluate_functional_correctness
from human_eval.data import write_jsonl, read_problems
from tqdm import tqdm
problems = read_problems()

num_samples_per_task = 1 # value k: number of responses for each question
samples = [
    dict(task_id=task_id, completion=generate_one_completion(problems[task_id]["prompt"]))
    for task_id in tqdm(problems)
    for _ in range(num_samples_per_task)
]
write_jsonl("samples.jsonl", samples)

evaluate_functional_correctness('./samples.jsonl')

جدول زیر پیشرفت‌های مدل‌های Code LIama Python را نسبت به مدل‌های تنظیم نشده در اندازه‌های مختلف مدل نشان می‌دهد. برای اطمینان از صحت، ما همچنین مدل‌های Code LIama تنظیم نشده را در نقاط پایانی SageMaker مستقر کرده و ارزیابی‌های Human Eval را اجرا می‌کنیم. را pass@1 اعداد (ردیف اول در جدول زیر) با اعداد گزارش شده مطابقت دارند مقاله پژوهشی کد لاما. پارامترهای استنتاج به طور مداوم به صورت تنظیم شده است "parameters": {"max_new_tokens": 384, "temperature": 0.2}.

همانطور که از نتایج می بینیم، همه انواع کد LIama پایتون تنظیم شده بهبود قابل توجهی را نسبت به مدل های تنظیم نشده نشان می دهند. به طور خاص، Code LIama Python 70B تقریباً 12٪ از مدل تنظیم نشده بهتر عمل می کند.

. 7B پایتون 13B پایتون 34B 34B پایتون 70B پایتون
عملکرد مدل از پیش آموزش دیده (pass@1) 38.4 43.3 48.8 53.7 57.3
عملکرد مدل با تنظیم دقیق (pass@1) 45.12 45.12 59.1 61.5 69.5

اکنون می توانید مدل های Code LIama را در مجموعه داده های خود تنظیم دقیق کنید.

پاک کردن

اگر تصمیم گرفتید که دیگر نمی‌خواهید نقطه پایانی SageMaker را در حال اجرا نگه دارید، می‌توانید با استفاده از آن آن را حذف کنید AWS SDK برای پایتون (Boto3), رابط خط فرمان AWS (AWS CLI)، یا کنسول SageMaker. برای اطلاعات بیشتر ببین نقاط پایانی و منابع را حذف کنید. علاوه بر این، شما می توانید منابع SageMaker Studio را ببندید که دیگر مورد نیاز نیستند

نتیجه

در این پست، ما در مورد تنظیم دقیق مدل های Meta's Code Llama 2 با استفاده از SageMaker JumpStart صحبت کردیم. ما نشان دادیم که می‌توانید از کنسول SageMaker JumpStart در SageMaker Studio یا SageMaker Python SDK برای تنظیم دقیق و استقرار این مدل‌ها استفاده کنید. ما همچنین در مورد تکنیک تنظیم دقیق، انواع نمونه‌ها و فراپارامترهای پشتیبانی شده بحث کردیم. علاوه بر این، بر اساس آزمایش‌های مختلفی که انجام دادیم، توصیه‌هایی برای آموزش بهینه ارائه کردیم. همانطور که از این نتایج تنظیم دقیق سه مدل در دو مجموعه داده می‌بینیم، تنظیم دقیق، خلاصه‌سازی را در مقایسه با مدل‌های تنظیم نشده بهبود می‌بخشد. به عنوان گام بعدی، می‌توانید با استفاده از کد ارائه شده در مخزن GitHub، این مدل‌ها را روی مجموعه داده‌های خود تنظیم دقیق کنید تا نتایج را برای موارد استفاده خود آزمایش و محک بزنید.


درباره نویسنده

دکتر شین هوانگ یک دانشمند کاربردی ارشد برای آمازون SageMaker JumpStart و آمازون SageMaker الگوریتم های داخلی است. او بر توسعه الگوریتم‌های یادگیری ماشینی مقیاس‌پذیر تمرکز دارد. علایق تحقیقاتی او در زمینه پردازش زبان طبیعی، یادگیری عمیق قابل توضیح بر روی داده های جدولی، و تجزیه و تحلیل قوی خوشه بندی ناپارامتری فضا-زمان است. او مقالات زیادی را در کنفرانس‌های ACL، ICDM، KDD، و انجمن آماری سلطنتی: سری A منتشر کرده است.

ویشال یالامانچالی یک معمار راه حل های استارتاپی است که با شرکت های هوش مصنوعی، رباتیک و خودروهای خودمختار در مراحل اولیه کار می کند. Vishaal با مشتریان خود برای ارائه راه حل های پیشرفته ML کار می کند و شخصاً به یادگیری تقویتی، ارزیابی LLM و تولید کد علاقه مند است. قبل از AWS، ویشال در دانشگاه UCI در مقطع لیسانس بود و بر روی بیوانفورماتیک و سیستم های هوشمند متمرکز بود.

میناکشیسوندارام تانداوارایان برای AWS به عنوان متخصص AI/ML کار می کند. او علاقه زیادی به طراحی، ایجاد و ترویج داده ها و تجربیات تجزیه و تحلیل انسان محور دارد. Meena بر توسعه سیستم‌های پایدار تمرکز دارد که مزایای قابل اندازه‌گیری و رقابتی را برای مشتریان استراتژیک AWS ارائه می‌کند. مینا یک متفکر رابط و طراحی است و تلاش می‌کند تا کسب‌وکارها را از طریق نوآوری، رشد و دموکراسی‌سازی به سمت روش‌های جدید کار سوق دهد.

دکتر آشیش ختان یک دانشمند کاربردی ارشد با الگوریتم های داخلی Amazon SageMaker است و به توسعه الگوریتم های یادگیری ماشین کمک می کند. او دکترای خود را از دانشگاه ایلینویز Urbana-Champaign گرفت. او یک محقق فعال در یادگیری ماشین و استنتاج آماری است و مقالات زیادی در کنفرانس های NeurIPS، ICML، ICLR، JMLR، ACL و EMNLP منتشر کرده است.

نقطه_img

جدیدترین اطلاعات

نقطه_img

چت با ما

سلام! چگونه می توانم به شما کمک کنم؟