# LLAMA2 & LLAMA2 LoRA ## 论文 ``` LLaMA: Open and Efficient Foundation Language Models ``` **-** [https://arxiv.org/abs/2302.13971](https://arxiv.org/abs/2302.13971) ``` Llama 2: Open Foundation and Fine-Tuned Chat Models ``` **-** [https://arxiv.org/abs/2307.09288](https://arxiv.org/abs/2307.09288) ``` LoRA: Low-Rank Adaptation of Large Language Models ``` **-** [https://arxiv.org/abs/2106.09685](https://arxiv.org/abs/2106.09685) ``` LlamaFactory: Unified Efficient Fine-Tuning of 100+ Language Models ``` **-** [https://arxiv.org/abs/2403.13372](https://arxiv.org/abs/2403.13372) ## 模型结构 LLaMA,这是一个基础语言模型的集合,参数范围从7B到65B。在数万亿的tokens上训练出的模型,并表明可以专门使用公开可用的数据集来训练最先进的模型,而不依赖于专有的和不可访问的数据集。特别是,llama 13B在大多数基准测试中优于GPT-3 (175B), LLaMA 65B与最好的模型Chinchilla-70B和PaLM-540B具有竞争力。LLAMA网络基于 Transformer 架构。提出了各种改进,并用于不同的模型,例如 PaLM。 LLaMA2相较于LLaMA采用了更强大的数据清洗、更多的tokens训练、加倍的上下文长度,并支持了Grouped-query attention (GQA),即允许在多头注意力(MHA)模型中共享键和值投影,从而减少与缓存相关的内存成本的优化方法。通过使用 GQA,更大的模型可以在优化内存使用的同时保持性能。 ![img](./llama模型结构.png) ## 算法原理 LoRA微调是一种高效模型微调方法,在LoRA训练过程中,固定预训练模型参数报吃不变,而在原本权重矩阵旁路添加低秩矩阵的乘积作为可训练参数,用以模拟参数的变化量。具体来说,假设预训练权重为$ W_0 \in \mathbb{R}^{d*k} $,可训练参数为$ \Delta W=BA$,其中$B \in \mathbb{R}^{d*r} $,$A \in \mathbb{R}^{r*d} $。初始化时,矩阵 $ A $通过高斯函数初始化,矩阵$ B $为 零初始化,使得训练开始之前旁路对原模型不造成影响,即参数改变量为 0。对于该权重的输入$X$来说,输出可以表示为:$h=W_0x+\Delta Wx=W_0x+BAx$。LoRA可以在缩减训练参数量和显存占用的同时,使训练后的模型具有与全量微调相当的性能。LoRA方法的计算流程如下图所示: ![img](./LoRA示意图.png) ## 环境配置 ### Docker(方式一) 推荐使用docker方式运行,提供拉取的docker镜像: ``` docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk24.04-py310 ``` 进入docker,安装docker中没有的依赖: ``` docker run -dit --network=host --name=llama2_lora --privileged --device=/dev/kfd --device=/dev/dri --ipc=host --shm-size=16G --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -u root --ulimit stack=-1:-1 --ulimit memlock=-1:-1 -v /opt/hyhal/:/opt/hyhal/:ro image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk24.04-py310 /usr/sbin/init docker exec -it llama2_lora /bin/bash pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com ``` ### Dockerfile(方式二) ``` docker build -t llama2_lora:latest . docker run -dit --network=host --name=llama2_lora --privileged --device=/dev/kfd --device=/dev/dri --ipc=host --shm-size=16G --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -u root --ulimit stack=-1:-1 --ulimit memlock=-1:-1 -v /opt/hyhal/:/opt/hyhal/:ro llama2_lora:latest docker exec -it llama2_lora /bin/bash ``` ### Conda(方法三) 1. 创建conda虚拟环境: ``` conda create -n llama2_lora python=3.10 ``` 2. 关于本项目DCU显卡所需的工具包、深度学习库等均可从[光合](https://developer.hpccube.com/tool/)开发者社区下载安装。 - [DTK 24.04](https://cancon.hpccube.com:65024/1/main/DTK-24.04) - [Pytorch 2.1.0](https://cancon.hpccube.com:65024/4/main/pytorch/DAS1.0) - [Deepspeed 0.12.3](https://cancon.hpccube.com:65024/4/main/deepspeed/DAS1.0) - [Flash_attn 2.0.4](https://cancon.hpccube.com:65024/4/main/flash_attn/DAS1.0) - [LightOp 0.3](https://cancon.hpccube.com:65024/4/main/lightop/DAS1.0) Tips:以上dtk驱动、python、deepspeed等工具版本需要严格一一对应。 3. 其它依赖库参照requirements.txt安装: ``` pip install -r requirements.txt ``` ## 数据集 输入数据为放置在项目[data](.data)目录下的 json 文件,用--dataset选项指定(参考下面示例),多个输入文件用`,`分隔。json 文件示例格式和字段说明如下: ``` [ { "instruction": "What are the three primary colors?", "input": "", "output": "The three primary colors are red, blue, and yellow." }, .... ] ``` json 文件中存储一个列表,列表的每个元素是一个sample。其中instruction代表用户输入,input是可选项,如果开发者同时指定了instruction和input,会把二者用\n连接起来代表用户输入;output代表期望的模型输出。本仓库的[data](./data)目录下预置了一些可用于指令微调训练的公开数据集: ``` ./data/alpaca_gpt4_data_zh.json ./data/alpaca_gpt4_data_en.json ./data/alpaca_data_zh_51k.json ./data/alpaca_data_en_52k.json ./data/oaast_sft_zh.json ./data/oaast_sft.json ... ``` 数据集的使用方法请参考 [data/README.md](data/README_zh.md) 文件。 注意:请配置[./src/llmtuner/hparams/data_args.py](src/llmtuner/hparams/data_args.py)中L18的dataset_dir路径; ### 模型下载 ModelScope模型下载地址: [Llama-2-7b-hf](https://www.modelscope.cn/models/shakechen/Llama-2-7b-hf) [Llama2-Chinese-13b-Chat-ms](https://www.modelscope.cn/models/modelscope/Llama2-Chinese-13b-Chat-ms) [CodeLlama-34b-hf](https://www.modelscope.cn/models/AI-ModelScope/CodeLlama-34b-hf) **为了获得训练中性能提升,请将所安装的transformers文件夹中`models/llama`文件夹内`modeling_llama.py`文件(容器内位置为`/usr/local/lib/python3.10/site-packages/transformers/models/llama/modeling_llama.py`)替换为本仓库所提供的`modeling_llama.py`文件** ## 训练 1. 7B模型LoRA微调训练 ``` bash lora_7B.sh ``` 2. 7B模型LoRA微调训练 ``` bash lora_13B.sh ``` 您可以根据自己的需求,更改其中的batchsize大小、模型路径、数据集、deepspeed配置文件、lora_ran及lora_target等。请使用 python src/train_bash.py -h 查看全部可选项。 ## 应用场景 ### 算法类别 `对话问答` ### 热点应用行业 ``` 医疗,教育,科研,金融 ``` ## 源码仓库及问题反馈 - https://developer.hpccube.com/codes/modelzoo/llama2_lora_pytorch ## 参考资料 - https://github.com/hiyouga/LLaMA-Factory