Інформація про дані Платона.
Вертикальний пошук і штучний інтелект.

Точне налаштування Code Llama на Amazon SageMaker JumpStart | Веб-сервіси Amazon

Дата:

Сьогодні ми раді оголосити про можливість точного налаштування моделей 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, виконайте такі дії:

  1. На консолі SageMaker Studio виберіть Поштовх у навігаційній панелі.

Ви знайдете списки понад 350 моделей, починаючи від відкритих і запатентованих моделей.

  1. Пошук моделей Code Llama.

Якщо ви не бачите моделі Code Llama, ви можете оновити версію SageMaker Studio, вимкнувши та перезапустивши програму. Додаткову інформацію про оновлення версій див Вимкніть і оновіть програми Studio. Ви також можете знайти інші варіанти моделі, вибравши Дослідіть усі моделі генерації коду або шукати Code Llama у вікні пошуку.

Наразі SageMaker JumpStart підтримує точне налаштування інструкцій для моделей Code Llama. На наступному знімку екрана показано сторінку тонкого налаштування для моделі Code Llama 2 70B.

  1. для Розташування навчального набору даних, ви можете вказати на Служба простого зберігання Amazon (Amazon S3), що містить набори даних навчання та перевірки для точного налаштування.
  2. Налаштуйте конфігурацію розгортання, гіперпараметри та параметри безпеки для точного налаштування.
  3. Вибирати поїзд щоб розпочати роботу з тонкого налаштування екземпляра SageMaker ML.

У наступному розділі ми обговорюємо формат набору даних, який потрібно підготувати для точного налаштування інструкцій.

  1. Після точного налаштування моделі ви можете розгорнути її за допомогою сторінки моделі на SageMaker JumpStart.

Опція розгортання точно налаштованої моделі з’явиться після завершення тонкого налаштування, як показано на наступному знімку екрана.

Точне налаштування за допомогою SDK SageMaker Python

У цьому розділі ми демонструємо, як точно налаштувати моделі Code LIama за допомогою SDK SageMaker Python на наборі даних у форматі інструкцій. Зокрема, модель налаштована для набору завдань обробки природної мови (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'
}

Навчальна папка може містити a template.json файл з описом вхідних і вихідних форматів. Нижче наведено приклад шаблону:

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

Щоб відповідати шаблону, кожен зразок у файлах рядків JSON має містити system_prompt, question та response поля. У цій демонстрації ми використовуємо Набір даних Dolphin Coder від Hugging Face.

Після того, як ви підготуєте набір даних і завантажите його в сегмент 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) – Це тип алгоритму паралельного навчання з даними, який розподіляє параметри моделі між паралельними об’єктами обробки даних і за бажанням може перевантажувати частину навчальних обчислень на ЦП. Незважаючи на те, що параметри розділені на різні 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 or False. За замовчуванням є 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:

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 Неточно налаштована відповідь Python:

### 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

### 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% від Набір даних 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 сховище.

%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. 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.

spot_img

Остання розвідка

spot_img

Зв'яжіться з нами!

Привіт! Чим я можу вам допомогти?