Настройте Fein-tune Llama 2 с использованием QLoRA и разверните его на Amazon SageMaker с помощью AWS Inferentia2

Оптимизируйте Fein-tune Llama 2 с помощью QLoRA и разверните его на Amazon SageMaker с помощью AWS Inferentia2

В этой статье мы покажем что значит точная настройка модели Llama 2 с использованием метода Fine-Tuning (PEFT) и развертывание настроенной модели на устройстве AWS Inferentia2. Мы используем набор инструментов для разработки ПО AWS Neuron (SDK) для доступа к устройству AWS Inferentia2 и получения высокой производительности. Затем мы используем контейнер для вывода большой модели, работающей на движке Deep Java Library (DJLServing) в качестве решения по обслуживанию модели.

Обзор решения

Эффективное донастраивание Llama2 с использованием QLoRa

Семейство больших моделей языка Llama 2 (LLM) представляет собой коллекцию предварительно обученных и донастраиваемых генеративных текстовых моделей с разным числом параметров от 7 миллиардов до 70 миллиардов. Llama 2 была предварительно обучена на 2 трлн токенов данных из общедоступных источников. AWS-клиенты иногда выбирают донастройку моделей Llama 2 с использованием своих собственных данных для достижения лучшей производительности для последующих задач. Однако из-за большого количества параметров модели Llama 2 полная донастройка может быть слишком дорогостоящей и затратной по времени. Метод эффективной настройки параметров (PEFT) может решить эту проблему, предоставляя возможность донастраивать только небольшое количество дополнительных параметров модели, в то время как большинство параметров предварительно обученной модели остаются неизменными. Дополнительную информацию о PEFT можно найти в этой статье. В этой статье мы используем QLoRa для донастройки модели Llama 2 7B.

Развертывание настроенной модели на Inf2 с использованием Amazon SageMaker

AWS Inferentia2 – это специализированный аппаратный ускоритель машинного обучения (ML), предназначенный для выполнения нагрузочных работ по выводу и обеспечивающий высокую производительность при более низкой стоимости для генеративного ИИ и LLM-нагрузок по сравнению с другими оптимизированными для вывода экземплярами на AWS. В этой статье мы используем экземпляр Amazon Elastic Compute Cloud (Amazon EC2) Inf2, оснащенный AWS Inferentia2 — акселератором второго поколения Inferentia2, каждый из которых содержит два NeuronCores-v2. Каждый NeuronCore-v2 представляет собой независимое, гетерогенное вычислительное устройство с четырьмя основными двигателями: Tensor, Vector, Scalar и GPSIMD. Он включает память SRAM, управляемую программным обеспечением на микросхеме для максимизации локальности данных. Поскольку на данный момент было опубликовано несколько блогов о Inf2, читатели могут обратиться к этой статье и нашей документации для получения дополнительной информации об Inf2.

Для развертывания моделей на Inf2 нам необходимо иметь SDK AWS Neuron в качестве программного слоя, работающего поверх аппаратных средств Inf2. AWS Neuron — это SDK, используемое для выполнения машинного обучения на устройствах AWS Inferentia и AWS Trainium. Оно позволяет осуществлять полный жизненный цикл разработки с использованием машинного обучения: создание новых моделей, их обучение и оптимизацию, а также развертывание моделей в производственной среде. AWS Neuron включает компилятор глубокого обучения, среду выполнения и инструменты, которые интегрированы с популярными фреймворками, такими как TensorFlow и PyTorch. В этом блоге мы собираемся использовать “transformers-neuronx”, который является частью SDK AWS Neuron для рабочих процессов декодирования трансформирующих моделей. Он поддерживает целый ряд популярных моделей, включая Llama 2.

Для развертывания моделей на Amazon SageMaker мы обычно используем контейнер, который содержит необходимые библиотеки, такие как Neuron SDK и transformers-neuronx, а также компонент обслуживания модели. Amazon SageMaker поддерживает контейнеры для глубокого обучения (DLC) с популярными библиотеками с открытым исходным кодом для размещения больших моделей. В этом посте мы используем контейнер для вывода больших моделей на Neuron. В этом контейнере есть все, что вам нужно для развертывания вашей модели Llama 2 на Inf2. Для получения ресурсов для начала работы с LMI на Amazon SageMaker, пожалуйста, обратитесь к нашим существующим статьям (статья 1, статья 2, статья 3) по этой теме. Короче говоря, вы можете запустить контейнер без дополнительного кода. Вы можете использовать обработчик по умолчанию для безупречного пользовательского опыта и передавать одно из поддерживаемых имен моделей и любые настраиваемые параметры времени загрузки. Это компилирует и обслуживает LLM на экземпляре Inf2. Например, для развертывания OpenAssistant/llama2-13b-orca-8k-3319, вы можете предоставить следующую конфигурацию (в виде файла serving.properties). В serving.properties мы указываем тип модели как llama2-13b-orca-8k-3319, размер пакета 4, параллельное количество тензоров 2, и все. Полный список настраиваемых параметров смотрите в Все параметры конфигурации DJL.

# Engine to use: MXNet, PyTorch, TensorFlow, ONNX, PaddlePaddle, DeepSpeed, etc.engine = Python # default handler for model servingoption.entryPoint = djl_python.transformers_neuronx# The Hugging Face ID of a model or the s3 url of the model artifacts. option.model_id = meta-llama/Llama-2-7b-chat-hf#the dynamic batch size, default is 1.option.batch_size=4# This option specifies number of tensor parallel partitions performed on the model.option.tensor_parallel_degree=2# The input sequence lengthoption.n_positions=512#Enable iteration level batching using one of "auto", "scheduler", "lmi-dist"option.rolling_batch=auto# The data type to which you plan to cast the model defaultoption.dtype=fp16# worker load model timeoutoption.model_loading_timeout=1500

В качестве альтернативы, вы можете написать свой собственный файл обработчика модели, как показано в этом примере, но это требует реализации методов загрузки модели и вывода, чтобы служить мостом между API DJLServing.

Предварительные требования

В следующем списке описаны предварительные требования для развертывания модели, описанной в этой статье блога. Вы можете реализовать их либо через AWS Management Console, либо с использованием последней версии AWS Command Line Interface (AWS CLI).

Прохождение

В следующем разделе мы рассмотрим код в двух частях:

  1. Тонкая настройка модели Llama2-7b и загрузка артефактов модели в указанное место в Amazon S3 bucket.
  2. Развертывание модели в Inferentia2 с использованием контейнера обслуживания DJL, размещенного в Amazon SageMaker.

Полные примеры кода с инструкциями можно найти в этом репозитории GitHub.

Часть 1: Тонкая настройка модели Llama2-7b с использованием PEFT

Мы собираемся использовать недавно представленный метод в статье QLoRA: Quantization-aware Low-Rank Adapter Tuning for Language Generation от Tim Dettmers и др. QLoRA – это новая техника для уменьшения потребления памяти большими моделями языка во время тонкой настройки без ущерба производительности.

Примечание: Тонкая настройка модели llama2-7b, показанная ниже, была протестирована на заметке Amazon SageMaker Studio с использованием ядра Python 2.0 GPU Optimized и экземпляром ml.g5.2xlarge. Как рекомендуется, мы рекомендуем использовать среду разработки Amazon SageMaker Studio, запущенную в вашей собственной Amazon Virtual Private Cloud (Amazon VPC). Это позволяет вам контролировать, отслеживать и проверять сетевой трафик внутри и вне вашей VPC с использованием стандартных сетевых возможностей и возможностей безопасности AWS. Дополнительную информацию см. В разделе Обеспечение подключения Amazon SageMaker Studio с использованием частной VPC.

Квантификация базовой модели

Сначала мы загружаем квантифицированную модель с использованием библиотеки Huggingface transformers следующим образом:

# The base pretrained model for fine-tuningmodel_name = "NousResearch/Llama-2-7b-chat-hf"# The instruction dataset to usedataset_name = "mlabonne/guanaco-llama2-1k"#Activate 4-bit precision base model loadinguse_4bit = Truebnb_4bit_compute_dtype = "float16"bnb_4bit_quant_type = "nf4"use_nested_quant = Falsecompute_dtype = getattr(torch, bnb_4bit_compute_dtype)bnb_config = BitsAndBytesConfig(load_in_4bit=use_4bit,bnb_4bit_quant_type=bnb_4bit_quant_type,bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=use_nested_quant,)# Load base model and tokenizermodel = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=bnb_config,device_map=device_map)model.config.pretraining_tp = 1tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

Загрузка набора данных для обучения

Затем мы загружаем набор данных для подачи его на модель для этапа тонкой настройки, показанный ниже:

# Load dataset (you can process it here)dataset = load_dataset(dataset_name, split="train")

Добавление слоя адаптера

Здесь мы добавляем небольшой обучаемый слой адаптера, настроенный как LoraConfig, определенный в библиотеке Hugging Face’s peft.

# include linear layers to apply LoRA to.modules = find_all_linear_names(model)## Setting up LoRA configurationlora_r = 64# Alpha parameter for LoRA scalinglora_alpha = 16# Dropout probability for LoRA layerslora_dropout = 0.1peft_config = LoraConfig(lora_alpha=lora_alpha,lora_dropout=lora_dropout,r=lora_r,bias="none",task_type="CAUSAL_LM",target_modules=modules)

Обучение модели

Используя представленную выше конфигурацию LoRA, мы приступим к настройке модели Llama2 вместе с гиперпараметрами. Фрагмент кода для обучения модели показан ниже:

# Установка параметров обученияtraining_arguments = TrainingArguments(...)trainer = SFTTrainer(model=model,train_dataset=dataset,peft_config=peft_config, # Конфигурация LoRAdataset_text_field="text",max_seq_length=max_seq_length,tokenizer=tokenizer,args=training_arguments,packing=packing,)# Обучение моделиtrainer.train()# Сохранение обученной моделиtrainer.model.save_pretrained(new_model)

Объединение весов модели

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

# Повторная загрузка модели в формате FP16 и объединение с весами LoRAbase_model = AutoModelForCausalLM.from_pretrained(model_name,low_cpu_mem_usage=True,return_dict=True,torch_dtype=torch.float16,device_map=device_map,)model = PeftModel.from_pretrained(base_model, new_model)model = model.merge_and_unload()save_dir = "merged_model"model.save_pretrained(save_dir, safe_serialization=True, max_shard_size="2GB")# Повторная загрузка токенизатора для сохранения егоtokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)tokenizer.pad_token = tokenizer.eos_tokentokenizer.padding_side = "right"tokenizer.save_pretrained(save_dir)

Загрузка весов модели в Amazon S3

В завершающем этапе части 1 мы будем сохранять веса объединенной модели в указанном месте в Amazon S3. Веса модели будут использоваться контейнером обслуживания моделей в Amazon SageMaker для размещения модели с использованием инстанса Inferentia2.

model_data_s3_location = "s3://<bucket_name>/<prefix>/"!cd {save_dir} && aws s3 cp —recursive . {model_data_s3_location}

Часть 2: Размещение модели QLoRA для вывода результатов с помощью AWS Inf2 с использованием контейнера SageMaker LMI

В данном разделе рассмотрим шаги развертывания настроенной модели QLoRA в среде размещения Amazon SageMaker. Мы будем использовать контейнер DJL serving из пакета DLC SageMaker, который интегрируется с библиотекой transformers-neuronx для размещения этой модели. Настройка позволяет загружать модели на ускорители AWS Inferentia2, параллелизировать модель на несколько ядер NeuronCore и обслуживать их через HTTP-конечные точки.

Подготовка артефактов модели

DJL поддерживает множество оптимизационных библиотек глубокого обучения, включая DeepSpeed, FasterTransformer и другие. Для конкретных настроек модели мы предоставляем файл serving.properties с ключевыми параметрами, такими как tensor_parallel_degree и model_id, для определения параметров загрузки модели. model_id может быть идентификатором модели Hugging Face или путем Amazon S3, где хранятся веса модели. В нашем примере мы предоставляем местоположение на Amazon S3 нашей настроенной модели. В следующем фрагменте кода показаны свойства, используемые для обслуживания модели:

%%writefile serving.propertiesengine=Pythonoption.entryPoint=djl_python.transformers_neuronxoption.model_id=<место расположения данных модели s3>option.batch_size=4option.neuron_optimize_level=2option.tensor_parallel_degree=8option.n_positions=512option.rolling_batch=autooption.dtype=fp16option.model_loading_timeout=1500

Пожалуйста, обратитесь к документации для получения дополнительной информации о настраиваемых параметрах, доступных через serving.properties. Обратите внимание, что в этом блоге мы используем option.n_position=512 для ускоренной компиляции AWS Neuron. Если вы хотите попробовать более большую длину ввода токена, то мы рекомендуем заранее предварительно скомпилировать модель (см. AOT предварительная компиляция модели на EC2). В противном случае, возможна ошибка тайм-аута, если время компиляции слишком велико.

После определения файла serving.properties мы упакуем файл в формат tar.gz следующим образом:

%%shmkdir mymodelmv serving.properties mymodel/tar czvf mymodel.tar.gz mymodel/rm -rf mymodel

Затем мы загрузим tar.gz в указанное место в хранилище Amazon S3:

s3_code_prefix = "large-model-lmi/code"bucket = sess.default_bucket()  # bucket для размещения артефактовcode_artifact = sess.upload_data("mymodel.tar.gz", bucket, s3_code_prefix)print(f"S3 Код или архивная модель загружена в ---> {code_artifact}")

Создание точки доступа модели Amazon SageMaker

Для использования экземпляра Inf2 для обслуживания мы используем контейнер Amazon SageMaker LMI с поддержкой DJL neuronX. Более подробную информацию о использовании контейнера DJL NeuronX для вывода можно найти в этом сообщении. В следующем коде показано, как развернуть модель с помощью Amazon SageMaker Python SDK:

# Получение URI изображения Docker DJL-neuronximage_uri = image_uris.retrieve(framework="djl-neuronx",region=sess.boto_session.region_name,version="0.24.0")# Определение типа экземпляра inf2 для использования при обслуживанииinstance_type = "ml.inf2.48xlarge"endpoint_name = sagemaker.utils.name_from_base("lmi-model")# Разворачивание модели для выводаmodel.deploy(initial_instance_count=1,instance_type=instance_type,container_startup_health_check_timeout=1500,volume_size=256,endpoint_name=endpoint_name)# наши запросы и ответы будут в формате json, поэтому мы указываем сериализатор и десериализаторpredictor = sagemaker.Predictor(endpoint_name=endpoint_name,sagemaker_session=sess,serializer=serializers.JSONSerializer(),)

Тестирование точки доступа модели

После успешного разворачивания модели мы можем проверить точку доступа, отправив образец запроса предиктору:

prompt="What is machine learning?"input_data = f"<s>[INST] <<SYS>>\nAs a data scientist\n<</SYS>>\n{prompt} [/INST]"response = predictor.predict({"inputs": input_data, "parameters": {"max_new_tokens":300, "do_sample":"True"}})print(json.loads(response)['generated_text'])

Образец вывода показан ниже:

В контексте анализа данных, машинное обучение (ML) относится к статистической технике, способной извлекать предсказательную силу из набора данных с растущей сложностью и точностью путем итеративного сужения области статистики.

Машинное обучение – это не новая статистическая техника, а скорее комбинация существующих техник. Более того, оно не было разработано для использования с конкретным набором данных или для получения конкретного результата. Оно было разработано достаточно гибким для адаптации к любому набору данных и для предсказания любого результата.

Удаление

Если вы решите прекратить работу точки доступа SageMaker, вы можете удалить ее с помощью SDK для Python AWS (boto3), AWS CLI или Amazon SageMaker Console. Кроме того, вы также можете выключить ресурсы Amazon SageMaker Studio, которые больше не требуются.

Вывод

В этом посте мы показали вам, как настроить модель Llama2-7b, используя адаптер LoRA с квантованием 4 бита, при помощи единственного экземпляра GPU. Затем мы развернули модель на экземпляре Inf2, размещенном в Amazon SageMaker, используя контейнер-сервер DJL. Наконец, мы проверили точку доступа модели Amazon SageMaker с помощью предсказания генерации текста с использованием SageMaker Python SDK. Дерзайте и попробуйте, нам было бы интересно услышать ваш отзыв. Следите за обновлениями по возможностям и новыми инновациями с AWS Inferentia.

Для получения дополнительных примеров по AWS Neuron посмотрите aws-neuron-samples.