Home Машинное обучение Точная настройка Llama 2 с помощью QLoRA и развертывание ее на Amazon SageMaker с помощью AWS Inferentia2. | DeepTech

Точная настройка Llama 2 с помощью QLoRA и развертывание ее на Amazon SageMaker с помощью AWS Inferentia2. | DeepTech

0
Точная настройка Llama 2 с помощью QLoRA и развертывание ее на Amazon SageMaker с помощью AWS Inferentia2.
 | DeepTech

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

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

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

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

Разверните точно настроенную модель на Inf2 с помощью Amazon SageMaker.

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

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

Для развертывания моделей в Amazon SageMaker мы обычно используем контейнер, содержащий необходимые библиотеки, такие как Neuron SDK и transformers-neuronx а также компонент обслуживания модели. Amazon SageMaker поддерживает контейнеры глубокого обучения (DLC) с популярными библиотеками с открытым исходным кодом для размещения больших моделей. В этом посте мы используем Контейнер вывода большой модели для нейрона. В этом контейнере есть все необходимое для развертывания модели 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 serving
option.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 length
option.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 default
option.dtype=fp16
# worker load model timeout
option.model_loading_timeout=1500

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

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

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

Прохождение

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

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

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

Часть 1. Точная настройка модели Llama2-7b с помощью PEFT.

Мы собираемся использовать недавно представленный в статье метод. QLoRA: настройка адаптера низкого ранга с учетом квантования для генерации языка Тим Деттмерс и др. QLoRA — это новый метод, позволяющий уменьшить объем памяти больших языковых моделей во время тонкой настройки без ущерба для производительности.

Примечание: Точная настройка модели llama2-7b, показанная ниже, была протестирована на ноутбуке Amazon SageMaker Studio с ядром, оптимизированным для графического процессора Python 2.0, с использованием мл.г5.2xбольшой тип экземпляра. Мы рекомендуем использовать интегрированную среду разработки (IDE) Amazon SageMaker Studio, запущенную в вашем собственном виртуальном частном облаке Amazon (Amazon VPC). Это позволяет вам контролировать, отслеживать и проверять сетевой трафик внутри и за пределами вашего VPC, используя стандартные возможности сети и безопасности AWS. Дополнительную информацию см. в разделе «Защита подключения к Amazon SageMaker Studio с помощью частного VPC».

Квантовать базовую модель

Сначала мы загружаем квантованную модель с 4-битным квантованием, используя Трансформеры Huggface библиотека следующим образом:

# The base pretrained model for fine-tuning
model_name = "NousResearch/Llama-2-7b-chat-hf"

# The instruction dataset to use
dataset_name = "mlabonne/guanaco-llama2-1k"

#Activate 4-bit precision base model loading
use_4bit = True
bnb_4bit_compute_dtype = "float16"
bnb_4bit_quant_type = "nf4"
use_nested_quant = False

compute_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 tokenizer
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map=device_map
)
model.config.pretraining_tp = 1

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

Загрузить набор обучающих данных

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

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

Прикрепите слой-адаптер

Здесь мы прикрепляем небольшой обучаемый слой адаптера, настроенный как ЛораКонфиг определяется в Обнимающем Лице пефт библиотека.

# include linear layers to apply LoRA to.
modules = find_all_linear_names(model)

## Setting up LoRA configuration
lora_r = 64

# Alpha parameter for LoRA scaling
lora_alpha = 16

# Dropout probability for LoRA layers
lora_dropout = 0.1

peft_config = LoraConfig(
lora_alpha=lora_alpha,
lora_dropout=lora_dropout,
r=lora_r,
bias="none",
task_type="CAUSAL_LM",
target_modules=modules)

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

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

# Set training parameters
training_arguments = TrainingArguments(...)

trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_config, # LoRA config
dataset_text_field="text",
max_seq_length=max_seq_length,
tokenizer=tokenizer,
args=training_arguments,
packing=packing,
)

# Train model
trainer.train()

# Save trained model
trainer.model.save_pretrained(new_model)

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

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

# Reload model in FP16 and merge it with LoRA weights
base_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")

# Reload tokenizer to save it
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
tokenizer.save_pretrained(save_dir)

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

На последнем этапе первой части мы сохраним веса объединенной модели в указанном месте 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-сервировка контейнер от SageMaker DLCкоторый интегрируется с трансформеры-нейронкс библиотека для размещения этой модели. Эта установка облегчает загрузку моделей в ускорители AWS Inferentia2, распараллеливает модель на нескольких нейронных ядрах и обеспечивает обслуживание через конечные точки HTTP.

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

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

%%writefile serving.properties
engine=Python
option.entryPoint=djl_python.transformers_neuronx
option.model_id=<model data s3 location>
option.batch_size=4
option.neuron_optimize_level=2
option.tensor_parallel_degree=8
option.n_positions=512
option.rolling_batch=auto
option.dtype=fp16
option.model_loading_timeout=1500

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

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

%%sh
mkdir mymodel
mv 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 to house artifacts
code_artifact = sess.upload_data("mymodel.tar.gz", bucket, s3_code_prefix)
print(f"S3 Code or Model tar ball uploaded to --- > {code_artifact}")

Создайте конечную точку модели Amazon SageMaker.

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

# Retrieves the DJL-neuronx docker image URI
image_uri = image_uris.retrieve(
framework="djl-neuronx",
region=sess.boto_session.region_name,
version="0.24.0"
)

# Define inf2 instance type to use for serving
instance_type = "ml.inf2.48xlarge"

endpoint_name = sagemaker.utils.name_from_base("lmi-model")

# Deploy the model for inference
model.deploy(initial_instance_count=1,
instance_type=instance_type,
container_startup_health_check_timeout=1500,
volume_size=256,
endpoint_name=endpoint_name)

# our requests and responses will be in json format so we specify the serializer and the deserializer
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'))

Пример вывода показан следующим образом:

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

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

Очистить

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

Заключение

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

Дополнительные примеры об AWS Neuron см. aws-нейрон-образцы.


Об авторах

Вэй Дэ — старший специалист по архитектуре решений AI/ML в AWS. Он с энтузиазмом помогает клиентам продвигать их путь к AWS, уделяя особое внимание сервисам машинного обучения Amazon и решениям на основе машинного обучения. Вне работы он любит активный отдых на свежем воздухе, например, кемпинг, рыбалку и пешие походы со своей семьей.

Цинвея Ли — специалист по машинному обучению в Amazon Web Services. Он получил докторскую степень. в области исследования операций после того, как он сломал счет гранта на исследования своего советника и не смог выплатить обещанную Нобелевскую премию. В настоящее время он помогает клиентам в сфере финансовых услуг и страхования создавать решения машинного обучения на AWS. В свободное время он любит читать и преподавать.

LEAVE A REPLY

Please enter your comment!
Please enter your name here