Hub documentation
Distilabel
Distilabel
Distilabel — это фреймворк для генерации синтетических данных и получения обратной связи от ИИ, предназначенный для инженеров, которым нужны быстрые, надёжные и масштабируемые пайплайны, основанные на проверенных научных статьях.
Distilabel можно использовать для генерации синтетических данных и обратной связи от ИИ для широкого спектра проектов, включая традиционные задачи предсказательного NLP (классификация, извлечение и т. д.), а также сценарии с генеративными моделями и большими языковыми моделями (следование инструкциям, генерация диалогов, оценка и т. д.). Программный подход Distilabel позволяет создавать масштабируемые конвейеры для генерации данных и получения обратной связи от ИИ. Цель distilabel — ускорить разработку ваших ИИ-решений за счёт быстрой генерации высококачественных и разнообразных наборов данных на основе проверенных исследовательских методологий генерации и оценки с использованием обратной связи от ИИ.
Что люди создают с помощью distilabel?
Сообщество Argilla использует distilabel для создания потрясающих наборов данных и моделей.
- Датасет 1M OpenHermesPreference содержит около 1 миллиона предпочтений ИИ, сгенерированных с помощью LLM teknium/OpenHermes-2.5. Это отличный пример того, как можно использовать distilabel для масштабирования и ускорения разработки датасетов.
- набор данных distilabeled Intel Orca DPO, использованный для дообучения улучшенной модели OpenHermes. Этот набор данных был создан путём объединения ручной разметки в Argilla с обратной связью от ИИ, полученной с помощью distilabel, что привело к появлению улучшенной версии набора данных Intel Orca и к превосходству над моделями, дообученными на исходном наборе данных.
- Данные haiku DPO — это пример того, как любой может создать синтетический датасет для конкретной задачи, который после отбора и оценки можно использовать для дообучения кастомных LLM.
Предварительные требования
Сначала войдите в свой аккаунт Hugging Face:
hf auth login
Убедитесь, что distilabel установлен:
pip install -U distilabel[vllm]
Конвейеры Distilabel
Пайплайны Distilabel можно строить из любого количества взаимосвязанных шагов или задач. Выходные данные одного шага или задачи передаются на вход другому. Последовательность шагов можно объединить, чтобы создать сложные пайплайны обработки и генерации данных с помощью LLM. Входом для каждого шага является батч данных, содержащий список словарей, где каждый словарь представляет строку набора данных, а ключи — имена столбцов. Для передачи данных из Hugging Face hub и в него мы определили класс Distiset как абстракцию datasets.DatasetDict.
Distiset как объект набора данных
Pipeline в distilabel возвращает специальный тип Hugging Face datasets.DatasetDict, который называется Distiset.
Pipeline может выводить несколько подмножеств в Distiset, который представляет собой объект, похожий на словарь, с одним элементом на каждое подмножество. Затем Distiset можно бесшовно отправить в Hugging Face Hub, сохранив все подмножества в одном репозитории.
Загрузка данных из Hub в Distiset
Чтобы продемонстрировать пример загрузки данных из Hub, мы воспроизведем статью Prometheus 2 и используем задачу PrometheusEval, реализованную в distilabel. Задачи Prometheus 2 и Prometheuseval — это задачи прямой оценки и парного ранжирования, то есть оценка качества одного изолированного ответа на заданную инструкцию с эталонным ответом или без него, а также оценка качества одного ответа по сравнению с другим на заданную инструкцию с эталонным ответом или без него, соответственно. Мы будем использовать эти задачи на наборе данных, загруженном из Hub, который был создан командой H4 Hugging Face и называется HuggingFaceH4/instruction-dataset.
from distilabel.llms import vLLM
from distilabel.pipeline import Pipeline
from distilabel.steps import KeepColumns, LoadDataFromHub
from distilabel.steps.tasks import PrometheusEval
if __name__ == "__main__":
with Pipeline(name="prometheus") as pipeline:
load_dataset = LoadDataFromHub(
name="load_dataset",
repo_id="HuggingFaceH4/instruction-dataset",
split="test",
output_mappings={"prompt": "instruction", "completion": "generation"},
)
task = PrometheusEval(
name="task",
llm=vLLM(
model="prometheus-eval/prometheus-7b-v2.0",
chat_template="[INST] {{ messages[0]['content'] }}\n{{ messages[1]['content'] }}[/INST]",
),
mode="absolute",
rubric="factual-validity",
reference=False,
num_generations=1,
group_generations=False,
)
keep_columns = KeepColumns(
name="keep_columns",
columns=["instruction", "generation", "feedback", "result", "model_name"],
)
load_dataset >> task >> keep_columnsЗатем нам нужно вызвать pipeline.run с параметрами времени выполнения, чтобы запустить конвейер и сохранить данные в объекте Distiset.
distiset = pipeline.run(
parameters={
task.name: {
"llm": {
"generation_kwargs": {
"max_new_tokens": 1024,
"temperature": 0.7,
},
},
},
},
)Загрузка Distiset из distilabel в Hub
Загрузите Distiset в репозиторий Hugging Face, где каждый поднабор будет соответствовать отдельной конфигурации:
distiset.push_to_hub(
"my-org/my-dataset",
commit_message="Initial commit",
private=False,
token=os.getenv("HF_TOKEN"),
)📚 Ресурсы
- 🚀 Документация Distilabel
- 🚀 Документация Distilabel - distiset
- 🚀 Документация Distilabel - prometheus
- 🆕 Знакомство с distilabel