当前位置:   article > 正文

使用 RLHF 训练 LLaMA 的实践指南:StackLLaMA_stackllama”:用rlhf训练llama的手把手教程.

stackllama”:用rlhf训练llama的手把手教程.

由于LLaMA没有使用RLHF,后来有一个初创公司 Nebuly AI使用LangChain agent生成的数据集对LLaMA模型使用了RLHF进行学习,得到了ChatLLaMA模型,详情请参考:Meta开源的LLaMA性能真如论文所述吗?如果增加RLHF,效果会提升吗?,其实RLHF未必是必须的,主要是高质量的标注数据获取成本比较高,RLHF是一个trade-off。

StackLLaMA模型介绍

今天分享的StackLLaMA是按照InstructGPT论文的方法获得的,它的目的是,在算法流程上和ChatGPT类似,大致流程如下:

主要区别在于

基础模型:ChatGPT使用的是GPT3.5,StackLLaMA使用的是LLaMA;

SFT阶段:StackLLaMA使用的是StackExchange 数据集

(https://huggingface.co/datasets/HuggingFaceH4/stack-exchange-preferences),而ChatGPT的简单数据没有公开;

StackLLaMA的主要共贡献

    • StackLLaMA模型开源了,并且在Huggingface Hub上可以使用,地址:https://huggingface.co/trl-lib/llama-7b-se-rl-peft;

    • 集成到Hugging Face TRL库,为广大朋友提供了基础库使用,地址:https://huggingface.co/docs/trl/index;

    • 开源了监督训练数据集StackExchange,地址:https://huggingface.co/datasets/HuggingFaceH4/stack-exchange-preferences;

    • 开源了数据集和处理笔记本https://huggingface.co/datasets/lvwerra/stack-exchange-paired;

    • 介绍了训练过程的细节以及解决方案;

    • RLHF库:https://github.com/lvwerra/trl

Stack Exchange数据集

该数据集包括来自 StackExchange 平台的问题及其相应的答案(包括针对代码和许多其他主题的 StackOverflow)

根据论文《https://arxiv.org/abs/2112.00861》介绍,给每个答案一个score,公式如下:

score = log2 (1 + upvotes) rounded to the nearest integer, plus 1 if the questioner accepted the answer (we assign a score of −1 if the number of upvotes is negative).

对于奖励模型,始终需要每个问题有两个答案进行比较。对每个问题最多采样 10 个答案对,以限制每个问题的数据点数量。最后,将 HTML 转换为 Markdown 来清理格式,使模型的输出更具可读性。

高效的训练策略

即使训练最小的 LLaMA 模型也需要大量内存,比如bf16,每个参数需要2个字节来存储,fp32需要4个字节,更多可以参考:https://huggingface.co/docs/transformers/perf_train_gpu_one#optimizer。对于一个 7B 参数的模型,只是参数就需要(2+8)*7B=70GB的内存,实际存储还包括计算注意力分数等中间值,可能需要更多内存。因此,即使是7B的模型也无法在单个 80GB A100 上训练模型。

使用参数高效微调 (PEFT) 技术,比如使用https://github.com/huggingface/peft库来实现,这种技术可以加载8-bit模型执行低秩自适应 (LoRA),如下图所示:

线性层的低秩自适应:在冻结层(蓝色)旁边添加额外参数(橙色),并将生成的编码隐藏状态与冻结层的隐藏状态一起添加。

8-bit模型,每个参数只需要一个字节(例如,7B LlaMa 的内存为 7GB)。LoRA 不是直接训练原始权重,而是在某些特定层(通常是注意力层)之上添加小的适配器层;因此,可训练参数的数量大大减少。

在这种情况下,根据batch大小和序列长度不同每十亿个参数大概需要1.2-1.4GB内存,这可以以低成本微调更大的模型(在 NVIDIA A100 80GB 上高达 50-60B 比例模型)。

这些技术可以在消费级设备和 Google Colab 上微调大型模型。比如:facebook/opt-6.7b(13GB in float16)和openai/whisper-largeGoogle Colab(15GB GPU RAM)。更多参考:https://github.com/huggingface/peft和https://huggingface.co/blog/trl-peft

将非常大的模型放入单个 GPU 中,如果训练速度仍然很慢,可以使用数据并行技术,如下图所示:

数据并行可以使用transformers.Trainer和accelerate,无需任何代码更改,只需在使用torchrunor调用脚本时传递参数即可accelerate launch。下面分别用accelerate和在单台机器上运行带有 8 个 GPU 的训练脚本torchrun

accelerate launch --multi_gpu --num_machines 1  --num_processes 8 my_accelerate_script.pytorchrun --nnodes 1  --nproc_per_node 8 my_torch_script.py

监督微调SFT

首先需要对监督数据做一些处理,传统方式通常是需要保证每个batch中序列长度是一样(采用填充或者截断),与传统的方式不同,GPT模型监督数据是把多个sentence通过EOS标记拼接到一起来使用,如下图所示:

使用peft加载模型之后就可以使用Trainer训练模型了。具体是:首先

首先导入int8模型,然后加入到训练准备,最后再添加LoRA adapters,代码如下所示:

# load model in 8bitmodel = AutoModelForCausalLM.from_pretrained(        args.model_path,        load_in_8bit=True,        device_map={"": Accelerator().local_process_index}    )model = prepare_model_for_int8_training(model)
# add LoRA to modellora_config = LoraConfig(    r=16,    lora_alpha=32,    lora_dropout=0.05,    bias="none",    task_type="CAUSAL_LM",)
model = get_peft_model(model, config)

Note:最终预测的时候需要把LoRA adapters的模型参与与LLaMA模型参数加起来使用。

通过运行脚本(https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py)将它们转换为

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/383704
推荐阅读
相关标签