С помощью этого руководства вы подготовите датасет GitHub Issue в формате Alpaca для использования в сервисе ML Finetuning.
Датасет предназначен для дообучения моделей, которые решают задачу генерации заголовка на основе текстового описания проблемы.
В качестве исходного используется датасет mlfoundations-dev/github-issues. В результате получится набор данных в формате Alpaca, опубликованный на HuggingFace Hub.
Вы будете использовать следующие сервисы:
Notebooks — сервис для запуска сред ML и работы DS-специалистов в ноутбуках на платформе Evolution.
Huggingface — платформа для публикации и использования моделей машинного обучения.
Шаги:
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
Убедитесь, что в личном кабинете Cloud.ru подключен сервис Notebooks.
Создайте токен Huggingface.
Войдите или зарегистрируйтесь на https://huggingface.co.
Перейдите в раздел Access Tokens.
Нажмите Create new token.
Выберите тип Write.
Введите название токена.
Нажмите Create token.
Скопируйте токен и сохраните его, например в блокнот. После закрытия страницы он будет недоступен.
1. Подготовьте среду
Создайте ноутбук со следующими параметрами:
Конфигурация — ncpu.medium.4.
Образ — Cloud.ru Jupyter (Conda) 0.3.2.
На главной странице сервиса Notebooks в строке нужного ноутбука нажмите JupyterLab — вы перейдете в среду разработки.
Установите библиотеки, выполнив код:
pip install matplotlib numpy datasets huggingface_hub langdetectИмпортируйте прочие библиотеки, добавив код:
import matplotlib.pyplot as pltimport numpy as npfrom datasets import load_datasetfrom huggingface_hub import loginfrom langdetect import detectfrom langdetect.lang_detect_exception import LangDetectException# HuggingFace Authentication# Specify your HuggingFace Tokenlogin()
2. Загрузите и исследуйте исходный датасет
Для загрузки датасета Github Issue добавьте следующий код:
dataset = load_dataset("mlfoundations-dev/github-issues", split="train")Чтобы понять структуру данных, ознакомьтесь с примерами записей в датасете:
def show_samples(dataset, num_samples=3):"""Отображение примеров записей из набора данных."""sample = dataset.shuffle().select(range(num_samples))for example in sample:print(f" >> Заголовок: {example['title']}")print("-" * 50)print(f" >> Тело: \n {example['body']}")print("=" * 80)print()print()show_samples(dataset)Постройте распределение длин поля body — текстовых описаний проблем:
# Вычисление длин тел для всех проблемbody_lengths = [len(str(item['body'])) for item in dataset]body_lengths = np.array(body_lengths)# Отображение статистикиprint("Примерная статистика длин тел:")print(f"Минимум: {body_lengths.min()}")print(f"Максимум: {body_lengths.max()}")print(f"Среднее: {body_lengths.mean():.2f}")print(f"Медиана: {np.median(body_lengths):.2f}")print(f"Стандартное отклонение: {body_lengths.std():.2f}")print(f"90-й процентиль: {np.percentile(body_lengths, 90):.2f}")print(f"95-й процентиль: {np.percentile(body_lengths, 95):.2f}")print(f"99-й процентиль: {np.percentile(body_lengths, 99):.2f}")plt.figure(figsize=(10, 6))plt.hist(body_lengths, bins=50, log=True)plt.xlabel('Длина тела')plt.ylabel('Количество проблем')plt.title('Распределение длин тел проблем')plt.show()
3. Отфильтруйте датасет
Оставьте только те строки, где значение body находится в диапазоне от 100 до 5 000 символов:
def filter_by_body_length(example):"""Фильтрация проблем по длине тела (100-5000 символов)."""length = len(str(example['body']))return 100 <= length <= 5000filtered_dataset = dataset.filter(filter_by_body_length)print(f"Общее количество проблем после фильтрации по длине: {len(filtered_dataset)}")Оставьте только записи на английском языке:
def is_english(example):"""Checking whether the title and body are written in English"""try:return detect(example["title"]) == "en" and detect(example["body"]) == "en"except LangDetectException:return False# For faster processing, you can apply filtering to a subset of the dataset# english_ds = filtered_dataset.select(range(100000)).filter(is_english, num_proc=4)english_ds = filtered_dataset.filter(is_english, num_proc=4)print(f"Количество английских примеров: {len(english_ds)}")
4. Преобразуйте датасет в формат Alpaca
Преобразуйте датасет в формат Alpaca, в котором каждый пример — это словарь с тремя полями:
instruction — текстовое задание для модели;
input — входные данные;
output — целевой ответ.
def convert_to_alpaca_format(example):return {"instruction": "Write short and clear GitHib issue title that captures main problem.","input": example["body"],"output": example["title"],}alpaca_dataset = english_ds.map(convert_to_alpaca_format)alpaca_dataset = alpaca_dataset.remove_columns([col for col in alpaca_dataset.column_names if col not in ["instruction", "input", "output"]])
5. Загрузите датасет на HuggingFace Hub
Опубликуйте итоговый датасет в ваш репозиторий на HuggingFace Hub, подставив свои данные:
alpaca_dataset.push_to_hub("your_login/hf-repository_name")
Вы можете скачать готовый ноутбук, содержащий код и инструкции для обработки датасета из этого практического руководства.
Результат
Вы подготовили очищенный и структурированный датасет для задач генерации заголовков GitHub Issue по их описанию, преобразовали его в формат Alpaca и опубликовали на HuggingFace Hub для использования в сервисе ML Finetuning. Теперь вы можете дообучить модель из Huggingface, используя подготовленный датасет.
Узнавайте больше о прикладных сценариях и примерах решения бизнес-задач, получайте навыки управления облаком, выполняя практические руководства.