Введение

В последние годы обработка естественного языка (NLP) значительно продвинулась вперед благодаря мощным моделям больших языков, таким как Falcon 7B.

Falcon 7B — это современный LLM, основанный на архитектуре Transformer (https://huggingface.co/blog/falcon). В то время как Falcon 7B предлагает впечатляющую готовую производительность, тонкая настройка инструкций позволяет вам создать свой собственный LLM с учетом контекста и знаний о ваших данных.

В этой статье мы рассмотрим, как настроить Falcon7B на основе пользовательских данных часто задаваемых вопросов (FAQ), что позволит вам создать мощного и точного чат-бота на основе часто задаваемых вопросов, адаптированного к вашим конкретным потребностям.

Понимание тонкой настройки

Тонкая настройка — это метод трансферного обучения, который включает в себя использование предварительно обученной модели, такой как Falcon 7B, и ее адаптацию для выполнения конкретной задачи. Предварительно обученная модель уже обладает знаниями о языке, грамматике и контексте, полученными в результате обширного обучения на большом массиве текстов.

Тонкая настройка позволяет нам использовать эти существующие знания и точно настраивать модель для более конкретных задач, таких как анализ тональности, распознавание именованных объектов или классификация текста.

Точная настройка инструкцийиспользует набор помеченных примеров в виде пар {подсказка, ответ} для дальнейшего обучения предварительно обученной модели адекватному прогнозированию ответа на подсказку. .

Тонкая настройка Falcon 7B обычно включает два основных этапа:

  1. Подготовка данных. Вам понадобится помеченный набор данных, соответствующий вашей конкретной задаче НЛП. Набор данных должен быть предварительно обработан и организован во входные последовательности, совместимые с моделью.
  2. Тонкая настройка: на этом этапе вы будете использовать помеченные данные для обновления параметров Falcon 7B, сохраняя при этом общее понимание языка. Тонкую настройку можно выполнить с помощью библиотек Python, таких как transformers и tensorflow или pytorch Hugging Face.

Подготовка данных

Чтобы приступить к тонкой настройке Falcon 7B, вам сначала нужно подготовить размеченный набор данных. Набор данных должен быть отформатирован так, чтобы его могла понять модель. Для точной настройки инструкций данные могут быть организованы в формате CSV или JSON, где каждая строка содержит вопрос и ответ на него.

Убедитесь, что данные чистые и предварительно обработаны соответствующим образом. Предварительная обработка данных может включать в себя токенизацию, преобразование нижнего регистра, удаление специальных символов и обработку пропущенных значений. При подготовке данных крайне важно сохранить смысл и контекст текста.

import transformers
from datasets import load_dataset, Dataset
import pandas as pd


def gen_prompt(text_input):
    return f"""
    <human>: {text_input["question"]}
    <assistant>: {text_input["answer"]}
    """.strip()

def gen_and_tok_prompt(text_input):
    full_input = gen_prompt(text_input)
    tok_full_prompt = tokenizer(full_input, padding = True , truncation =True)
    return tok_full_prompt


data = Dataset.from_pandas(df_faq[['question', 'answer']])

Процесс тонкой настройки

Вот пошаговое руководство по тонкой настройке Falcon 7B с использованием Python и библиотеки transformers:

Шаг 1: Установите библиотеки

Прежде чем мы начнем, убедитесь, что у вас установлены необходимые библиотеки:

# If you are using PyTorch backendpy
pip install torch==2.0.1
pip install transformers @ git+https://github.com/huggingface/transformers@de9255de27abfcae4a1f816b904915f0b1e23cd9
#lightning @ git+https://github.com/Lightning-AI/lightning@master
pip install tokenizers==0.13.3
pip install peft @ git+https://github.com/huggingface/peft.git@9f7492577ff91c51077308f98dade45bf32c268a
pip install jsonargparse[signatures]  # CLI
pip install bitsandbytes==0.39.1 # quantize
pip install accelerate @ git+https://github.com/huggingface/accelerate@e0f5e030098aada5e112708eee3537475dea3a83
pip install datasets==2.13.1  # quantize/gptq.py
pip install zstandard==0.19.0  # prepare_redpajama.py
pip install scipy
pip install loralib==0.1.1
pip install einops==0.6.1

Шаг 2: Загрузите предварительно обученную модель Falcon 7B

Используйте класс AutoModelForSequenceClassification из transformers для загрузки предварительно обученной модели Falcon 7B:

from transformers import AutoTokenizer, AutoModelForCausalLM
# model_name = "tiiuae/falcon-7b-instruct" 
model = AutoModelForCausalLM.from_pretrained(
    "tiiuae/falcon-7b-instruct",
#     load_in_8bit=True,  #if you want to load the 8-bit model
#     device_map='auto', 
    trust_remote_code=True,
)

tokenizer = AutoTokenizer.from_pretrained(
    "tiiuae/falcon-7b-instruct",
)

Шаг 3: токенизировать данные

Используйте загруженный токенизатор для токенизации и кодирования ваших текстовых данных:

tokenizer.pad_token = tokenizer.eos_token
data = data.map(gen_and_tok_prompt)

Обязательно токенизируйте данные обучения и оценки.

Шаг 4: Подготовьте модель к тонкой настройке

Перед обучением такой модели int8 с помощью peft необходимо выполнить некоторую предварительную обработку, поэтому давайте импортируем вспомогательную функцию prepare_model_for_kbit_training, которая будет:

Приводит все модули, отличные от int8, к полной точности (fp32) для стабильности

Добавьте forward_hook к входному слою встраивания, чтобы включить вычисление градиента входных скрытых состояний.

Включите контрольные точки градиента для более эффективного обучения памяти

from peft import prepare_model_for_kbit_training

model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)

def print_trainable_parameters(model):
    """
    Prints the number of trainable parameters in the model.
    """
    trainable_params = 0
    all_param = 0
    for _, param in model.named_parameters():
        all_param += param.numel()
        if param.requires_grad:
            trainable_params += param.numel()
    print(
        f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}"
    )
from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["query_key_value"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, config)
print_trainable_parameters(model)

Приведенный выше код подготовит модель и распечатает обучаемые параметры. Поскольку мы используем LoRA, обучаемые параметры будут намного меньше по сравнению с фактическими параметрами модели.

trainable params: 4718592 || all params: 6926439296 || trainable%: 0.06812435363037071

Шаг 5: Тонкая настройка модели

Настройте Falcon 7B, используя подготовленный набор данных:

training_args = transformers.TrainingArguments(
    gradient_accumulation_steps=4,
    num_train_epochs=3,
    learning_rate=2e-4,
    fp16=True,
    save_total_limit=4,
    logging_steps=25,
    output_dir="output_dir", # give the location where you want to store checkpoints 
    save_strategy='epoch',
    optim="paged_adamw_8bit",
    lr_scheduler_type = 'cosine',
    warmup_ratio = 0.05,
)

trainer = transformers.Trainer(
    model=model,
    train_dataset=data,
    args=training_args,
    data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
model.config.use_cache = False  # silence the warnings. Please re-enable for inference!
trainer.train()

Шаг 6: Сохраните доработанную модель

Сохраните доработанную модель для использования в будущем:

model.save_pretrained('location where you  want the model to be stored')

Шаг 7: Вывод

После тонкой настройки сделаем вывод из сохраненной модели:

config = PeftConfig.from_pretrained("location where new model is stored")
model = AutoModelForCausalLM.from_pretrained(
    config.base_model_name_or_path,
#     load_in_8bit=True,
#     device_map='auto',
    trust_remote_code=True,

)

tokenizer = AutoTokenizer.from_pretrained(
    config.base_model_name_or_path)

model_inf = PeftModel.from_pretrained(model,"location where new model is stored" )


# create your own prompt  
prompt = f"""
    <human>: How can i use BDB Data Science LAB?
    <assistant>: 
    """.strip()

# encode the prompt 
encoding = tokenizer(prompt, return_tensors= "pt").to(model.device)

# set teh generation configuration params 
gen_config = model_inf.generation_config
gen_config.max_new_tokens = 200
gen_config.temperature = 0.2
gen_config.top_p = 0.7
gen_config.num_return_sequences = 1
gen_config.pad_token_id = tokenizer.eos_token_id
gen_config.eos_token_id = tokenizer.eos_token_id

# do the inference 
with torch.inference_mode():
    outputs = model.generate(input_ids = encoding.input_ids, attention_mask = encoding.attention_mask,generation_config = gen_config )
print(tokenizer.decode(outputs[0], skip_special_tokens = True ))

Заключение

Проинструктировав Falcon 7B по тонкой настройке, вы сможете использовать возможности расширенных языковых моделей и адаптировать их к уникальным требованиям вашей организации и создать собственный LLM. Удачной тонкой настройки!