使用BigDL LLM在Intel® Data Center GPU上进行Llama 2模型调优

2024-01-11 15:24:18 浏览数 (3)

作者 | 杜炜,汪洋,Rahul Unnikrishnan Nair

译者 | 平川

策划 | Tina

本文最初发布于英特尔官方网站,经英特尔授权由 InfoQ 中文站翻译并分享。

在飞速发展的生成式人工智能(GenAI)领域,大型语言模型(LLM)调优因其高计算、高内存需求而带来了独特的挑战。LoRA 和 QLoRA 等技术为最先进 LLM 模型的调优工作提供了更强大的选项,它们的速度更快,成本更低。我们已经将 QLoRA 集成到了 BigDL LLM 库中。这个库是专门为英特尔的 GPU 而设计的。

在本文中,我们将介绍两个在 Intel® Data Center GPU 上使用 QLoRA 对 Llama 2 模型进行调优的主题:

  • 性能改进结果数据
  • 调优说明 使用 BigDL LLM 进行 LLM 调优

我们在 Stanford Alpaca 数据集上使用 QLoRA 对 Llama 2 7B 和 70B 模型进行了调优,并使用多个 Intel® Data Center GPU Max 1550 和 1100 系统(包括 英特尔开发云 上的系统)运行了 3 个 epoch。

下图对比了 Llama 2 7B 和 70B 模型的调优时长,使用的配置是配有 1、4 和 8 张 GPU 的 Intel® Data Center GPU Max 1550 和 1100 系统。

性能数据结果

图 1、在 Intel ® Data Center GPU 上进行 Llama 2 7B 模型性能调优

有关配置请查阅原文的配置与免责声明

在单 GPU 卡的单服务器配置中,Llama 2 7B 调优所需的时间:在 Intel® Data Center GPU Max 1100 上为 5.35 小时,在 Intel® Data Center GPU Max 1550 上为 2.4 小时。当配置扩展到 8 个 GPU 时,Llama 2 7B 调优所需的时间:在 Intel®Data Center GPU Max 1100 上显着减少到约 0.8 小时(48 分钟),在 Intel®Data Center GPU Max 1550 上减少到约 0.35 小时(21 分钟)。

扩展后的 BigDL LLM 库支持在各种英特尔 GPU 上对 LLM 进行调优,包括 Intel® Data Center GPU Flex 170 和 Intel® Arc™系列显卡。具体来说,以 Intel®Data Center GPU Flex 170 硬件为例,在一台配备 8 张 Intel®Data Center GPU Flex 170 显卡的服务器上,在大约 2 小时之内就可以完成 Llama 2 7B 模型的调优。

图 2、在 Intel ® Data Center GPU 上进行 Llama 2 70B 模型性能调优

有关配置请查阅原文的配置与免责声明

对更大的 LLM 进行调优,如 Llama 2 70B,需要更高的计算能力、VRAM 和时间。根据我们的评估,在一台服务器上配置 4 张和 8 张 Intel® Data Center GPU Max 系列显卡可以显著提升效率。具体而言,配备 8 张 Intel® Data Center GPU Max 系列 GPU 的单台服务器显著加快了这一过程,在大约 200 分钟(3.14 小时)的时间内完成了 Llama 2 70B 模型的调优。在我们测试的配置中,这一配置是最高效的。

用于模型训练的数据集

我们使用了来自 Hugging Face 的数据集yahma/alpaca-cleaned,其中包含 51.8k 行英语教学文本。要全面理解和应用这个数据集,请访问 Hugging Face Dataset 数据集页面。

LLM 调优步骤

在这一节中,我们将介绍在 Intel® Data Center GPU 上使用 BigDL LLM 进行 Llama 2 模型调优的步骤。

1. 在英特尔开发云上获取 Intel Data Center GPU 资源

英特尔开发云(IDC) 上提供了Intel ® Data Center GPU 实例。你可以创建一个免费帐户,并探索英特尔提供的各种计算平台。请按照 IDC 网站的说明开始吧。

2. 准备用于 LLM 调优的 BigDL LLM 环境

要准备在 Intel GPU 上进行 LLM 调优的 BigDL LLM 环境,通常需要从配备了 Intel GPU 驱动程序和 oneAPI 基本工具包的 Linux 系统开始。我们建议使用 Conda 进行环境管理。使用英特尔开发云时,设置过程大大简化,其中 Conda 环境预先配置了必要的组件,包括 pytorch-gpu 环境。英特尔开发云简化了设置过程,不需要用户手动获取环境,使他们可以专注于 LLM 调优任务,提升效率。

首先,选择 pytorch-gpu 内核并安装 bigdl-llm[xpu] 包,如下所示:

代码语言:javascript复制
conda create -n llm python=3.9
conda activate llm
pip install --pre --upgrade bigdl-llm[xpu] -f https://developer.intel.com/ipex-whl-stable-xpu

配置 oneAPI 环境变量:

代码语言:javascript复制
source /opt/intel/oneapi/setvars.sh

为了在 Intel Data Center GPU 上获得最佳性能,你还应该安装 gperftools 并设置一些重要的配置环境变量:

代码语言:javascript复制
conda install -y gperftools -c conda-forge
export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libtcmalloc.so
export USE_XETLA=OFF
export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
export ENABLE_SDP_FUSION=1

3. 在单 GPU 上进行 Llama 2 7B 模型调优

这段伪代码大致勾勒出了一个在 Intel® Data Center GPU Max 1550 GPU 上进行高效调优的结构化方法。示例代码后面有更详细的说明。我们将下面的代码命名为 fine-tuning.py,我们将用它进行 Llama 2 7B 和 70B 模型的调优。

代码语言:javascript复制

import torch
import transformers
from datasets import load_dataset
import accelerate
from transformers import LlamaTokenizer
from peft import LoraConfig
import intel_extension_for_pytorch as ipex
from bigdl.llm.transformers import AutoModelForCausalLM
from bigdl.llm.transformers.qlora import get_peft_model, prepare_model_for_kbit_training

def train(...):

 #步骤1:从目录或HF Hub将基本模型加载为4位NormalFloat格式
 model = AutoModelForCausalLM.from_pretrained(
   'meta-llama/lama-2-7b-hf',
   load_in_low_bit="nf4", # According to the QLoRA paper, using "nf4" could yield better model quality than "int4"
   optimize_model=False,
   torch_dtype=torch.bfloat16,
   modules_to_not_convert=["lm_head"],
 )
 model = model.to('xpu')
 tokenizer = LlamaTokenizer.from_pretrained(base_model)

 # 步骤2:准备一个兼容BigDL-LLM的Peft模型
 model = prepare_model_for_kbit_training(
   model,
   use_gradient_checkpointing=gradient_checkpointing
 )
 config = LoraConfig(
   r=lora_r,
   lora_alpha=lora_alpha,
   target_modules=lora_target_modules,
   lora_dropout=lora_dropout,
   bias="none",
   task_type="CAUSAL_LM",
 )
 model = get_peft_model(model, config)

 # 加载数据集,并划分为train_data和val_data
 data = load_dataset(data_path)
 train, val_data = ...

 # 步骤3:数据处理并传递给data_collator
 trainer = transformers.Trainer(
   model=model,
   train_dataset=train_data,
   eval_dataset=val_data,
   args=transformers.TrainingArguments(
     # keypart3: define plenty of training args as you need
     bf16=True,
     per_device_train_batch_size=micro_batch_size,
     gradient_accumulation_steps=gradient_accumulation_steps,
     num_train_epochs=num_epochs,
     learning_rate=learning_rate,
     gradient_checkpointing=gradient_checkpointing,
     ...
   ),
   data_collator=...
 )

 model.config.use_cache = False
 trainer.train(resume_from_checkpoint=resume_from_checkpoint)
 model.save_pretrained(output_dir)

注意: 在步骤 1 中,在 bigdl.llm.transformers 的 AutoModelForCausalLM 模块中设置 low_in_low_bit='nf4',将所有线性层(不包括'lm_head')转换为 4 位 NormalFloat。然后,通过执行 model.to("xpu") 将转换后的 Llama 2 7B 模型从 CPU 传输到英特尔 GPU。 步骤 2 使用了 bigdl.llm.transformers.qlora 中的 get_peft_model 和 prepare_model_for_kbit_training 函数。这些函数有助于将 Llama 2 7B 模型转换为与 BigDL-LLM 兼容的格式,特别是作为 Peft 模型。 在步骤 3 中,设置 TrainingArguments 中的参数以提高调优性能。请注意,当使用 BF16 和 FP32 混合数据类型时,设置 BF16=True 会带来更平衡的调优性能和模型精度。

要查看完整的调优示例代码,请参阅 GitHub 上的 alpaca_qlora_fine-tuning.py 脚本。

4. Llama 2 70B 调优,扩展为多 GPU 上的分布式调优

为了将调优过程从 Llama 2 7B 扩展到 Llama 2 70B,将'meta-llama/lama-2-7b-hf'更改为'meta-llama/lama-2-70b-hf',并设置 gradient_checkpointing=True,否则 GPU VRAM 很有可能不足以完成 70B 模型的训练。

我们使用 miprun 在配有多个 GPU 的系统上实现分布式调优,以下是示例步骤。

a. 设置 local_rank、world_size 等相关变量:

代码语言:javascript复制

def get_int_from_env(env_keys, default):
 """Returns the first positive env value found in the `env_keys` list or the default."""
 for e in env_keys:
     val = int(os.environ.get(e, -1))
     if val >= 0:
         return val
 return default

local_rank = get_int_from_env(["LOCAL_RANK","MPI_LOCALRANKID"], "0")
world_size = get_int_from_env(["WORLD_SIZE","PMI_SIZE"], "1")
port = get_int_from_env(["MASTER_PORT"], 29500)
os.environ["LOCAL_RANK"] = str(local_rank)
os.environ["WORLD_SIZE"] = str(world_size)
os.environ["RANK"] = str(local_rank)

b. 设置环境变量,并使用 mpirun 启动 fine-tuning.py 脚本:

代码语言:javascript复制

export MASTER_ADDR=127.0.0.1
export OMP_NUM_THREADS=6 # adjust this to 1/16 of total physical cores
export FI_PROVIDER=tcp
export CCL_ATL_TRANSPORT=ofi
mpirun -n 16 
  python -u ./fine-tuning.py 
    --base_model “meta-llama/Llama-2-70b-hf” 

要了解更多细节,请查看 GitHub 上提供的 BigDL LLM 在线示例。

入门指南

为了帮助新手开始使用 BigDL LLM 和 QLoRA 技术对大型语言模型进行调优,我们开发了一个全面的 Jupyter 笔记本,可以引导你一步一步地完成这个过程。首先,在英特尔开发云上注册一个免费的标准帐户。然后,转到控制台主页,单击左侧的 Training and Workshops 图标,向下滚动到“Gen AI Essentials”部分,并进入 LLM Fine-tuning with QLoRA 笔记本。该笔记本将引导你逐步完成调优过程,并帮助你将这些技术应用于各种 LLM 上。

小 结

生成式人工智能模型需要大量的计算和内存。我们在 Intel ® Data Center GPU 上使用 BigDL LLM 进行大型语言模型调优的探索,揭示了克服这一固有挑战的有效策略。通过性能数据分析和分步指南,我们已经证明了 QLoRA 可以有效地减少对最先进的 LLM(如 Llama 2 7B 和 Llama 2 70B)进行调优的时间。希望我们的研究结果能够提供有价值的见解,并为该领域的研究人员和从业者提供实用的资源。我们会继续在这个充满活力、快速发展的领域中,推进生成式人工智能、共享知识以及促进协作创新。

原文链接:

https://www.intel.com/content/www/us/en/developer/articles/technical/finetuning-llms-on-intel-gpus-using-bigdl-llm.html

声明:本文为 InfoQ 翻译整理,未经许可禁止转载。

0 人点赞