Сьогодні ми раді оголосити про можливість точного налаштування моделей Code Llama за допомогою Meta Amazon SageMaker JumpStart. Сімейство моделей великих мов (LLM) Code Llama — це набір попередньо підготовлених і точно налаштованих моделей генерації коду, які мають масштаб від 7 до 70 мільярдів параметрів. Тонко налаштовані моделі Code Llama забезпечують кращу точність і пояснюваність порівняно з базовими моделями Code Llama, як це видно під час їх тестування на HumanEval і набори даних MBPP. Ви можете точно налаштувати та розгорнути моделі Code Llama за допомогою SageMaker JumpStart за допомогою Студія Amazon SageMaker Інтерфейс користувача кількома клацаннями миші або за допомогою SDK SageMaker Python. Точне налаштування моделей Llama базується на сценаріях, наданих у Рецепти лами на GitHub із Meta за допомогою PyTorch FSDP, PEFT/LoRA та методів квантування Int8.
У цій публікації ми розповідаємо, як точно налаштувати попередньо навчені моделі Code Llama за допомогою SageMaker JumpStart за допомогою інтерфейсу користувача одним клацанням миші та SDK, доступного в наступному GitHub сховище.
Що таке SageMaker JumpStart
Завдяки SageMaker JumpStart спеціалісти з машинного навчання (ML) можуть вибирати з широкого вибору загальнодоступних базових моделей. Практикуючі ML можуть розгортати базові моделі на спеціальному Amazon SageMaker екземпляри з мережевого ізольованого середовища та налаштовуйте моделі за допомогою SageMaker для навчання та розгортання моделі.
Що таке Code Llama
Code Llama — це спеціалізована версія коду полум'я 2 який було створено шляхом подальшого навчання Llama 2 його специфічним кодам наборів даних і довшого відбору даних із того самого набору даних. Code Llama має розширені можливості кодування. Він може генерувати код і природну мову про код як з коду, так і з підказок на природній мові (наприклад, «Напишіть мені функцію, яка виводить послідовність Фібоначчі»). Ви також можете використовувати його для завершення коду та налагодження. Він підтримує багато найпопулярніших мов програмування, які використовуються сьогодні, включаючи Python, C++, Java, PHP, Typescript (JavaScript), C#, Bash тощо.
Навіщо тонко налаштовувати моделі Code Llama
Meta опублікувала тести продуктивності Code Llama на HumanEval і MBPP для поширених мов кодування, таких як Python, Java та JavaScript. Продуктивність моделей Code Llama Python на HumanEval продемонструвала різну продуктивність для різних мов програмування та завдань у діапазоні від 38% на моделі 7B Python до 57% на моделях 70B Python. Крім того, точно налаштовані моделі Code Llama на мові програмування SQL показали кращі результати, як це видно в тестах оцінювання SQL. Ці опубліковані тести підкреслюють потенційні переваги тонкого налаштування моделей Code Llama, що забезпечує кращу продуктивність, налаштування та адаптацію до конкретних доменів кодування та завдань.
Тонка настройка без коду через інтерфейс SageMaker Studio
Щоб розпочати тонке налаштування моделей Llama за допомогою SageMaker Studio, виконайте такі дії:
- На консолі SageMaker Studio виберіть Поштовх у навігаційній панелі.
Ви знайдете списки понад 350 моделей, починаючи від відкритих і запатентованих моделей.
- Пошук моделей Code Llama.
Якщо ви не бачите моделі Code Llama, ви можете оновити версію SageMaker Studio, вимкнувши та перезапустивши програму. Додаткову інформацію про оновлення версій див Вимкніть і оновіть програми Studio. Ви також можете знайти інші варіанти моделі, вибравши Дослідіть усі моделі генерації коду або шукати Code Llama у вікні пошуку.
Наразі SageMaker JumpStart підтримує точне налаштування інструкцій для моделей Code Llama. На наступному знімку екрана показано сторінку тонкого налаштування для моделі Code Llama 2 70B.
- для Розташування навчального набору даних, ви можете вказати на Служба простого зберігання Amazon (Amazon S3), що містить набори даних навчання та перевірки для точного налаштування.
- Налаштуйте конфігурацію розгортання, гіперпараметри та параметри безпеки для точного налаштування.
- Вибирати поїзд щоб розпочати роботу з тонкого налаштування екземпляра SageMaker ML.
У наступному розділі ми обговорюємо формат набору даних, який потрібно підготувати для точного налаштування інструкцій.
- Після точного налаштування моделі ви можете розгорнути її за допомогою сторінки моделі на SageMaker JumpStart.
Опція розгортання точно налаштованої моделі з’явиться після завершення тонкого налаштування, як показано на наступному знімку екрана.
Точне налаштування за допомогою SDK SageMaker Python
У цьому розділі ми демонструємо, як точно налаштувати моделі Code LIama за допомогою SDK SageMaker Python на наборі даних у форматі інструкцій. Зокрема, модель налаштована для набору завдань обробки природної мови (NLP), описаних за допомогою інструкцій. Це допомагає підвищити продуктивність моделі для виконання невидимих завдань із підказками з нульовим ударом.
Виконайте наступні кроки, щоб завершити роботу з тонкого налаштування. Ви можете отримати весь код тонкої настройки з GitHub сховище.
Спочатку розглянемо формат набору даних, необхідний для точного налаштування інструкцій. Навчальні дані мають бути відформатовані у форматі рядків JSON (.jsonl), де кожен рядок є словником, що представляє вибірку даних. Усі навчальні дані повинні бути в одній папці. Однак його можна зберегти в кількох файлах .jsonl. Нижче наведено приклад у форматі рядків JSON:
Навчальна папка може містити a template.json
файл з описом вхідних і вихідних форматів. Нижче наведено приклад шаблону:
Щоб відповідати шаблону, кожен зразок у файлах рядків JSON має містити system_prompt
, question
та response
поля. У цій демонстрації ми використовуємо Набір даних Dolphin Coder від Hugging Face.
Після того, як ви підготуєте набір даних і завантажите його в сегмент S3, ви можете почати тонке налаштування за допомогою такого коду:
Ви можете розгорнути налаштовану модель безпосередньо з кошторису, як показано в наступному коді. Детальніше дивіться в зошиті в GitHub сховище.
Методи тонкого налаштування
Мовні моделі, такі як Llama, мають розмір більше 10 ГБ або навіть 100 ГБ. Для точного налаштування таких великих моделей потрібні екземпляри зі значною кількістю пам’яті CUDA. Крім того, навчання цих моделей може бути дуже повільним через розмір моделі. Тому для ефективного тонкого налаштування ми використовуємо такі оптимізації:
- Адаптація низького рангу (LoRA) – Це тип ефективного точного налаштування параметрів (PEFT) для ефективного точного налаштування великих моделей. За допомогою цього методу ви заморожуєте всю модель і додаєте лише невеликий набір настроюваних параметрів або шарів у модель. Наприклад, замість того, щоб тренувати всі 7 мільярдів параметрів для Llama 2 7B, ви можете точно налаштувати менше ніж 1% параметрів. Це допомагає значно зменшити потребу в пам’яті, оскільки вам потрібно зберігати градієнти, стани оптимізатора та іншу пов’язану з навчанням інформацію лише для 1% параметрів. Крім того, це допомагає скоротити час навчання, а також витрати. Докладніше про цей метод див LoRA: низькорангова адаптація великих мовних моделей.
- Квантування Int8 – Навіть з такими оптимізаціями, як LoRA, такі моделі, як Llama 70B, все ще занадто великі для навчання. Щоб зменшити обсяг пам’яті під час навчання, ви можете використовувати квантування Int8 під час навчання. Квантування зазвичай знижує точність типів даних із плаваючою комою. Хоча це зменшує пам’ять, необхідну для зберігання вагових коефіцієнтів моделі, це погіршує продуктивність через втрату інформації. Квантування Int8 використовує лише чверть точності, але не призводить до погіршення продуктивності, оскільки воно не просто пропускає біти. Він округлює дані від одного типу до іншого. Щоб дізнатися про квантування Int8, зверніться до LLM.int8(): 8-розрядне множення матриці для масштабованих трансформаторів.
- Повністю розділені паралельні дані (FSDP) – Це тип алгоритму паралельного навчання з даними, який розподіляє параметри моделі між паралельними об’єктами обробки даних і за бажанням може перевантажувати частину навчальних обчислень на ЦП. Незважаючи на те, що параметри розділені на різні GPU, обчислення кожної мікропартії є локальним для працівника GPU. Він розподіляє параметри більш рівномірно та забезпечує оптимізовану продуктивність завдяки накладенню зв’язку та обчислень під час навчання.
У наведеній нижче таблиці наведено деталі кожної моделі з різними налаштуваннями.
Model | Налаштування за замовчуванням | ЛОРА + ФСДП | LORA + Без FSDP | Квантування Int8 + LORA + Без FSDP |
Код Лама 2 7B | ЛОРА + ФСДП | Так | Так | Так |
Код Лама 2 13B | ЛОРА + ФСДП | Так | Так | Так |
Код Лама 2 34B | INT8 + LORA + БЕЗ FSDP | Немає | Немає | Так |
Код Лама 2 70B | INT8 + LORA + БЕЗ FSDP | Немає | Немає | Так |
Точне налаштування моделей Llama базується на сценаріях, наданих нижче GitHub репо.
Підтримувані гіперпараметри для навчання
Точне налаштування Code Llama 2 підтримує низку гіперпараметрів, кожен із яких може впливати на вимоги до пам’яті, швидкість навчання та продуктивність налаштованої моделі:
- епоха – Кількість проходів, які виконує алгоритм точного налаштування через навчальний набір даних. Має бути цілим числом, більшим за 1. За замовчуванням 5.
- швидкість_навчання – Швидкість, з якою вагові коефіцієнти моделі оновлюються після опрацювання кожної групи навчальних прикладів. Має бути позитивне значення з плаваючою точкою більше 0. За замовчуванням 1e-4.
- інструкція_налаштована – Тренувати інструкцію моделі чи ні. Повинно бути
True
orFalse
. За замовчуванням єFalse
. - per_device_train_batch_size – Розмір пакету на ядро GPU/CPU для навчання. Має бути додатним цілим числом. За замовчуванням 4.
- per_device_eval_batch_size – Розмір партії на ядро GPU/CPU для оцінки. Має бути додатним цілим числом. За замовчуванням 1.
- max_train_samples – З метою налагодження чи швидшого навчання скоротіть кількість навчальних прикладів до цього значення. Значення -1 означає використання всіх навчальних зразків. Має бути додатним цілим числом або -1. Типове значення -1.
- max_val_samples – З метою налагодження чи швидшого навчання скоротіть кількість прикладів перевірки до цього значення. Значення -1 означає використання всіх зразків перевірки. Має бути додатним цілим числом або -1. Типове значення -1.
- max_input_length – Максимальна загальна довжина послідовності введення після токенізації. Послідовності, довші за це, буде скорочено. Якщо -1,
max_input_length
встановлюється на мінімум 1024 і максимальну довжину моделі, визначену токенізатором. Якщо встановлено додатне значення,max_input_length
встановлено мінімальне із наданих значень іmodel_max_length
визначається токенізатором. Має бути додатним цілим числом або -1. Типове значення -1. - validation_split_ratio – Якщо канал перевірки є
none
, співвідношення розподілу перевірки поїзда з даних поїзда має бути між 0–1. За замовчуванням 0.2. - train_data_split_seed – Якщо дані перевірки відсутні, це виправляє випадковий розподіл вхідних даних навчання на дані навчання та перевірки, які використовуються алгоритмом. Має бути цілим числом. За замовчуванням 0.
- preprocessing_num_workers – Кількість процесів для попередньої обробки. Якщо
None
, основний процес використовується для попередньої обробки. За замовчуваннямNone
. - lora_r – Лора Р. Має бути додатним цілим числом. За замовчуванням 8.
- lora_alpha – Лора Альфа. Має бути додатним цілим числом. За замовчуванням 32
- lora_dropout – Лора Дропаут. має бути додатним числом з плаваючою речовиною між 0 і 1. За замовчуванням 0.05.
- int8_quantization – Якщо
True
, модель завантажується з 8-бітною точністю для навчання. За замовчуванням для 7B і 13B єFalse
. За замовчуванням для 70B єTrue
. - enable_fsdp – Якщо True, навчання використовує 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
) для більш швидкого та ефективного навчання.
Підтримувані типи екземплярів для навчання
У наведеній нижче таблиці підсумовано підтримувані типи екземплярів для навчання різних моделей.
Model | Тип екземпляра за замовчуванням | Підтримувані типи екземплярів |
Код Лама 2 7B | мл.g5.12xвеликий |
ml.g5.12xlarge, ml.g5.24xlarge, ml.g5.48xlarge, ml.p3dn.24xlarge, ml.g4dn.12xlarge |
Код Лама 2 13B | мл.g5.12xвеликий |
ml.g5.24xlarge, ml.g5.48xlarge, ml.p3dn.24xlarge, ml.g4dn.12xlarge |
Код Лама 2 70B | мл.g5.48xвеликий |
мл.g5.48xвеликий ml.p4d.24xlarge |
Вибираючи тип екземпляра, враховуйте наступне:
- Примірники G5 забезпечують найефективніше навчання серед підтримуваних типів примірників. Тому, якщо у вас є доступні екземпляри G5, ви повинні використовувати їх.
- Час навчання значною мірою залежить від кількості графічних процесорів і доступної пам’яті CUDA. Таким чином, навчання на екземплярах з однаковою кількістю графічних процесорів (наприклад, ml.g5.2xlarge та ml.g5.4xlarge) є приблизно однаковим. Тому для навчання можна використовувати дешевший екземпляр (ml.g5.2xlarge).
- При використанні екземплярів p3 навчання виконуватиметься з 32-бітною точністю, оскільки bfloat16 не підтримується в цих екземплярах. Таким чином, завдання навчання споживатиме подвійний обсяг пам’яті CUDA під час навчання на екземплярах p3 порівняно з екземплярами g5.
Щоб дізнатися про вартість навчання за інстанцію, див Примірники Amazon EC2 G5.
Оцінка
Оцінка є важливим кроком для оцінки продуктивності точно налаштованих моделей. Ми представляємо як якісні, так і кількісні оцінки, щоб показати покращення точно налаштованих моделей порівняно з неточно налаштованими. У якісному оцінюванні ми показуємо приклад відповіді від точно налаштованих і неточно налаштованих моделей. У кількісній оцінці використовуємо HumanEval, набір тестів, розроблений OpenAI для генерації коду Python для перевірки здатності отримувати правильні та точні результати. Репозиторій HumanEval знаходиться під ліцензією MIT. Ми налагодили варіанти Python усіх моделей Code LIama для різних розмірів (Code LIama Python 7B, 13B, 34B і 70B на Набір даних Dolphin Coder), і представити результати оцінювання в наступних розділах.
Якісна оцінка
Після розгортання вашої точно налаштованої моделі ви можете почати використовувати кінцеву точку для створення коду. У наступному прикладі ми представляємо відповіді як базового, так і тонко налаштованого варіантів коду LIama 34B Python на тестовому зразку в Набір даних Dolphin Coder:
Тонко налаштована модель Code Llama, окрім надання коду для попереднього запиту, створює детальне пояснення підходу та псевдокод.
Код Llama 34b Неточно налаштована відповідь Python:
Код Llama 34B Точна відповідь Python
Грунтова правда
Цікаво, що наша вдосконалена версія Code Llama 34B Python надає рішення на основі динамічного програмування для найдовшого паліндромного підрядка, яке відрізняється від рішення, наданого в основній правді з вибраного тестового прикладу. Наша детально налаштована модель обґрунтовує та пояснює рішення на основі динамічного програмування. З іншого боку, модель без точного налаштування галюцинує потенційні результати відразу після print
оператор (показаний у лівій комірці), оскільки результат axyzzyx
не є найдовшим паліндромом у даному рядку. З точки зору часової складності рішення динамічного програмування, як правило, краще, ніж початковий підхід. Рішення динамічного програмування має часову складність O(n^2), де n — довжина вхідного рядка. Це ефективніше, ніж вихідне рішення з неточно налаштованої моделі, яка також мала квадратичну часову складність O(n^2), але з менш оптимізованим підходом.
Це виглядає багатообіцяюче! Пам’ятайте, що ми лише налаштували варіант Code LIama Python на 10% від Набір даних Dolphin Coder. Є ще багато чого для вивчення!
Незважаючи на докладні інструкції у відповіді, нам все одно потрібно перевірити правильність коду Python, наданого у рішенні. Далі ми використовуємо систему оцінювання під назвою Оцінка людини запустити інтеграційні тести на згенеровану відповідь від Code LIama, щоб систематично перевірити її якість.
Кількісна оцінка за допомогою HumanEval
HumanEval — це система оцінки для оцінки можливостей LLM розв’язувати проблеми програмування на основі Python, як описано в статті Оцінка великих мовних моделей, навчених на коді. Зокрема, він складається зі 164 оригінальних задач програмування на основі Python, які оцінюють здатність мовної моделі генерувати код на основі наданої інформації, як-от підпис функції, рядок документації, тіло та модульні тести.
Кожне запитання щодо програмування на основі Python ми надсилаємо в модель Code LIama, розгорнуту на кінцевій точці SageMaker, щоб отримати k відповідей. Далі ми запускаємо кожну з k відповідей на інтеграційні тести в репозиторії HumanEval. Якщо будь-яка відповідь з k відповідей проходить інтеграційні тести, ми вважаємо, що цей тестовий випадок успішний; інакше не вдалося. Потім ми повторюємо процес, щоб обчислити відношення успішних кейсів як кінцеву оцінку pass@k
. Дотримуючись стандартної практики, ми встановили k як 1 у нашій оцінці, щоб створити лише одну відповідь на запитання та перевірити, чи вона проходить інтеграційний тест.
Нижче наведено приклад коду для використання репозиторію HumanEval. Ви можете отримати доступ до набору даних і створити одну відповідь за допомогою кінцевої точки SageMaker. Детальніше дивіться в зошиті в GitHub сховище.
У наведеній нижче таблиці показано покращення точно налаштованих моделей Code LIama Python порівняно з моделями без точного налаштування для різних розмірів моделей. Щоб забезпечити правильність, ми також розгортаємо неналаштовані моделі Code LIama в кінцевих точках SageMaker і проводимо оцінювання Human Eval. The pass@1 числа (перший рядок у наступній таблиці) збігаються з повідомленими числами в Дослідницька стаття Code Llama. Параметри висновку послідовно встановлюються як "parameters": {"max_new_tokens": 384, "temperature": 0.2}
.
Як ми бачимо з результатів, усі точно налаштовані варіанти Code LIama Python демонструють значне покращення порівняно з моделями без точного налаштування. Зокрема, Code LIama Python 70B перевершує модель без точного налаштування приблизно на 12%.
. | 7B Python | 13B Python | 34B | 34B Python | 70B Python |
Продуктивність попередньо навченої моделі (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 для Python (Boto3), Інтерфейс командного рядка AWS (AWS CLI) або консоль SageMaker. Для отримання додаткової інформації див Видалити кінцеві точки та ресурси. Крім того, ви можете вимкніть ресурси SageMaker Studio які більше не потрібні.
Висновок
У цій публікації ми обговорювали тонке налаштування моделей Code Llama 2 від Meta за допомогою SageMaker JumpStart. Ми показали, що ви можете використовувати консоль SageMaker JumpStart у SageMaker Studio або SageMaker Python SDK для точного налаштування та розгортання цих моделей. Ми також обговорили техніку тонкого налаштування, типи екземплярів і підтримувані гіперпараметри. Крім того, ми виклали рекомендації щодо оптимізації навчання на основі різноманітних тестів, які ми провели. Як ми бачимо з цих результатів тонкого налаштування трьох моделей на двох наборах даних, точне налаштування покращує узагальнення порівняно з моделями без точного налаштування. Як наступний крок ви можете спробувати точно налаштувати ці моделі на власному наборі даних, використовуючи код, наданий у сховищі GitHub, щоб протестувати та порівняти результати для ваших випадків використання.
Про авторів
Доктор Синь Хуан є старшим прикладним науковим співробітником Amazon SageMaker JumpStart і вбудованих алгоритмів Amazon SageMaker. Він зосереджується на розробці масштабованих алгоритмів машинного навчання. Його дослідницькі інтереси стосуються обробки природної мови, пояснюваного глибокого навчання на табличних даних і надійного аналізу непараметричної просторово-часової кластеризації. Він опублікував багато статей на конференціях ACL, ICDM, KDD і Королівського статистичного товариства: серія A.
Вішаал Яламанчалі є архітектором рішень для стартапів, який працює з компаніями, що займаються генеруванням штучного інтелекту, робототехніки та автономних транспортних засобів. Vishaal працює зі своїми клієнтами, щоб надати передові рішення ML, і особисто зацікавлений у навчанні з підкріпленням, оцінці LLM і створенні коду. До AWS Вішаал був студентом UCI, зосереджуючись на біоінформатиці та інтелектуальних системах.
Мінакшісундарам Тандавараян працює в AWS спеціалістом зі штучного інтелекту та машинного навчання. Він має пристрасть до проектування, створення та просування орієнтованих на людину даних і аналітики. Meena зосереджується на розробці стійких систем, які забезпечують вимірні конкурентні переваги для стратегічних клієнтів AWS. Міна — мислитель з питань зв’язку та дизайну, який прагне спонукати бізнес до нових способів роботи через інновації, інкубацію та демократизацію.
Доктор Ашиш Хетан є старшим прикладним науковим співробітником із вбудованими алгоритмами Amazon SageMaker і допомагає розробляти алгоритми машинного навчання. Він отримав ступінь доктора філософії в Іллінойському університеті Урбана-Шампейн. Він активно досліджує машинне навчання та статистичні висновки та опублікував багато статей на конференціях NeurIPS, ICML, ICLR, JMLR, ACL та EMNLP.
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- PlatoData.Network Vertical Generative Ai. Додайте собі сили. Доступ тут.
- PlatoAiStream. Web3 Intelligence. Розширення знань. Доступ тут.
- ПлатонЕСГ. вуглець, CleanTech, Енергія, Навколишнє середовище, Сонячна, Поводження з відходами. Доступ тут.
- PlatoHealth. Розвідка про біотехнології та клінічні випробування. Доступ тут.
- джерело: https://aws.amazon.com/blogs/machine-learning/fine-tune-code-llama-on-amazon-sagemaker-jumpstart/