From 330737d34553f9fa7f58479cd47ea9c1318759d5 Mon Sep 17 00:00:00 2001 From: Ben Browning Date: Tue, 10 Dec 2024 15:02:37 -0500 Subject: [PATCH] Update README.md with newer content from research team Co-authored-by: shivchander Co-authored-by: abhi1092 Signed-off-by: Ben Browning --- .spellcheck-en-custom.txt | 7 ++ README.md | 147 +++++++++++++++++++++++++++++++------- assets/imgs/overview.png | Bin 0 -> 31798 bytes 3 files changed, 127 insertions(+), 27 deletions(-) create mode 100644 assets/imgs/overview.png diff --git a/.spellcheck-en-custom.txt b/.spellcheck-en-custom.txt index 64aeae66..eb773134 100644 --- a/.spellcheck-en-custom.txt +++ b/.spellcheck-en-custom.txt @@ -5,8 +5,11 @@ Backport backported CLI codebase +composable +Composable config configs +customizable Dataset dataset datasets @@ -20,6 +23,7 @@ freeform ICL icl ie +instructlab Jinja JSON Langchain's @@ -38,8 +42,11 @@ Pregenerated qna quantized repo +Reusability +scalable sdg Splitter +src subdirectory subfolder Tatsu diff --git a/README.md b/README.md index 1ea8e267..dcfa8866 100644 --- a/README.md +++ b/README.md @@ -9,59 +9,152 @@ ![`e2e-nvidia-l4-x1.yaml` on `main`](https://github.com/instructlab/sdg/actions/workflows/e2e-nvidia-l4-x1.yml/badge.svg?branch=main) ![`e2e-nvidia-l40s-x4.yml` on `main`](https://github.com/instructlab/sdg/actions/workflows/e2e-nvidia-l40s-x4.yml/badge.svg?branch=main) -Python library for Synthetic Data Generation +The SDG Framework is a modular, scalable, and efficient solution for creating synthetic data generation workflows in a “no-code” manner. At its core, this framework is designed to simplify data creation for LLMs, allowing users to chain computational units and build powerful pipelines for generating data and processing tasks. -## Introduction +## Core Design Principles -Synthetic Data Generation (SDG) is a process that creates an artificially generated dataset that mimics real data based on provided examples. SDG uses a YAML file containing question-and-answer pairs as input data. +The framework is built around the following principles: -## Installing the SDG library +1. **Modular Design**: Highly composable blocks form the building units of the framework, allowing users to build workflows effortlessly. +2. **No-Code Workflow Creation**: Specify workflows using simple YAML configuration files. +3. **Scalability and Performance**: Optimized for handling large-scale workflows with millions of records. -Clone the library and navigate to the repo: +--- -```bash -git clone https://github.com/instructlab/sdg -cd sdg -``` +## Framework Architecture -Install the library: +![overview](assets/imgs/overview.png) -```bash -pip install . -``` +### Blocks: The Fundamental Unit -### Using the library +At the heart of the framework is the **Block**. Each block is a self-contained computational unit that performs specific tasks, such as: -You can import SDG into your Python files with the following items: +- Making LLM calls +- Performing data transformations +- Applying filters -```python - from instructlab.sdg.generate_data import generate_data - from instructlab.sdg.utils import GenerateException -``` +Blocks are designed to be: + +- **Modular**: Reusable across multiple pipelines. +- **Composable**: Easily chained together to create workflows. + +These blocks are implemented in the [src/instructlab/sdg/blocks](src/instructlab/sdg/blocks) directory. -## Pipelines +### Pipelines: Higher-Level Abstraction -A pipeline is a series of steps to execute in order to generate data. +Blocks can be chained together to form a **Pipeline**. Pipelines enable: + +- Linear or recursive chaining of blocks. +- Execution of complex workflows by chaining multiple pipelines together. There are three default pipelines shipped in SDG: `simple`, `full`, and `eval`. Each pipeline requires specific hardware specifications -### Simple Pipeline +#### Simple Pipeline The [simple pipeline](src/instructlab/sdg/pipelines/simple) is designed to be used with [quantized Merlinite](https://huggingface.co/instructlab/merlinite-7b-lab-GGUF) as the teacher model. It enables basic data generation results on low-end consumer grade hardware, such as laptops and desktops with small or no discrete GPUs. -### Full Pipeline +#### Full Pipeline The [full pipeline](src/instructlab/sdg/pipelines/full) is designed to be used with [Mixtral-8x7B-Instruct-v0.1](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1) as the the teacher model, but has also been successfully tested with smaller models such as [Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) and even some quantized versions of the two teacher models. This is the preferred data generation pipeline on higher end consumer grade hardware and all enterprise hardware. -### Eval Pipeline +#### Eval Pipeline The [eval pipeline](src/instructlab/sdg/pipelines/eval) is used to generate [MMLU](https://en.wikipedia.org/wiki/MMLU) benchmark data that can be used to later evaluate a trained model on your knowledge dataset. It does not generate data for use during model training. -### Pipeline architecture +--- + +### YAML-Based Workflow: The Pipeline Configuration + +The Pipeline YAML configuration file is central to defining data generation workflows in the SDG Framework. This configuration file describes how blocks and pipelines are orchestrated to process and generate data efficiently. By leveraging YAML, users can create highly customizable and modular workflows without writing any code. + +Pipeline configuration must adhere to our [JSON schema](src/instructlab/sdg/pipelines/schema/v1.json) to be considered valid. + +#### Key Features of Pipeline Configuration + +1. **Modular Design**: + - Pipelines are composed of blocks, which can be chained together. + - Each block performs a specific task, such as generating, filtering, or transforming data. + +2. **Reusability**: + - Blocks and their configurations can be reused across different workflows. + - YAML makes it easy to tweak or extend workflows without significant changes. + +3. **Ease of Configuration**: + - Users can specify block types, configurations, and data processing details in a simple and intuitive manner. + +--- + +### Sample Pipeline Configuration + +Here is an example of a Pipeline configuration: + +```yaml +version: "1.0" +blocks: + - name: gen_questions + type: LLMBlock + config: + config_path: configs/skills/freeform_questions.yaml + output_cols: + - question + batch_kwargs: + num_samples: 30 + drop_duplicates: + - question + - name: filter_questions + type: FilterByValueBlock + config: + filter_column: score + filter_value: 1.0 + operation: eq + convert_dtype: float + drop_columns: + - evaluation + - score + - num_samples + - name: gen_responses + type: LLMBlock + block_config: + config_path: configs/skills/freeform_responses.yaml + output_cols: + - response +``` + +### Data Flow and Storage + +- **Data Representation**: Data flow between blocks and pipelines is handled using **Hugging Face Datasets**, which are based on Arrow tables. This provides: + - Native parallelization capabilities (e.g., maps, filters). + - Support for efficient data transformations. + +- **Data Checkpoints**: Intermediate caches of generated data. Checkpoints allow users to: + - Resume workflows from the last successful state if interrupted. + - Improve reliability for long-running workflows. -All the pipelines are written in a YAML format and must adhere to a [specific schema](src/instructlab/sdg/pipelines/schema/v1.json). +--- -The pipelines that generate data for model training (simple and full pipelines) expect to have three different pipeline configs - one each for knowledge, grounded skills, and freeform skills. They are expected to exist in files called `knowledge.yaml`, `grounded_skills.yaml`, and `freeform_skills.yaml` respectively. For background on the difference in knowledge, grounded skills, and freeform skills, refer to the [InstructLab Taxonomy repository](https://github.com/instructlab/taxonomy). +## Installing the SDG library + +Clone the library and navigate to the repo: + +```bash +git clone https://github.com/instructlab/sdg +cd sdg +``` + +Install the library: + +```bash +pip install . +``` + +### Using the library + +You can import SDG into your Python files with the following items: + +```python + from instructlab.sdg.generate_data import generate_data + from instructlab.sdg.utils import GenerateException +``` ## Repository structure diff --git a/assets/imgs/overview.png b/assets/imgs/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..f54b5e61b5ca855f97c0f62bd4848f681a4d2b8c GIT binary patch literal 31798 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 PX{e^8rHGKf6Y~E6qjRxX literal 0 HcmV?d00001