
Введение
В последние годы обработка естественного языка (NLP) значительно продвинулась вперед благодаря мощным моделям больших языков, таким как Falcon 7B.
Falcon 7B — это современный LLM, основанный на архитектуре Transformer (https://huggingface.co/blog/falcon). В то время как Falcon 7B предлагает впечатляющую готовую производительность, тонкая настройка инструкций позволяет вам создать свой собственный LLM с учетом контекста и знаний о ваших данных.
В этой статье мы рассмотрим, как настроить Falcon7B на основе пользовательских данных часто задаваемых вопросов (FAQ), что позволит вам создать мощного и точного чат-бота на основе часто задаваемых вопросов, адаптированного к вашим конкретным потребностям.
Понимание тонкой настройки
Тонкая настройка — это метод трансферного обучения, который включает в себя использование предварительно обученной модели, такой как Falcon 7B, и ее адаптацию для выполнения конкретной задачи. Предварительно обученная модель уже обладает знаниями о языке, грамматике и контексте, полученными в результате обширного обучения на большом массиве текстов.
Тонкая настройка позволяет нам использовать эти существующие знания и точно настраивать модель для более конкретных задач, таких как анализ тональности, распознавание именованных объектов или классификация текста.
Точная настройка инструкцийиспользует набор помеченных примеров в виде пар {подсказка, ответ} для дальнейшего обучения предварительно обученной модели адекватному прогнозированию ответа на подсказку. .
Тонкая настройка Falcon 7B обычно включает два основных этапа:
- Подготовка данных. Вам понадобится помеченный набор данных, соответствующий вашей конкретной задаче НЛП. Набор данных должен быть предварительно обработан и организован во входные последовательности, совместимые с моделью.
- Тонкая настройка: на этом этапе вы будете использовать помеченные данные для обновления параметров Falcon 7B, сохраняя при этом общее понимание языка. Тонкую настройку можно выполнить с помощью библиотек Python, таких как
transformersиtensorflowилиpytorchHugging 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. Удачной тонкой настройки!