# LLAMA & LLAMA2 ## 论文 ``` 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) ## 模型结构 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) ## 算法原理 以下是与原始 Transformer 架构的主要区别: **预归一化**。为了提高训练稳定性,对每个transformer 子层的输入进行归一化,而不是对输出进行归一化。使用 RMSNorm 归一化函数。 **SwiGLU 激活函数 [PaLM]**。使用 SwiGLU 激活函数替换 ReLU 非线性以提高性能。使用 2 /3 4d 的维度而不是 PaLM 中的 4d。 **旋转嵌入**。移除了绝对位置嵌入,而是添加了旋转位置嵌入 (RoPE),在网络的每一层。 ![img](./llama算法原理.png) ## 环境配置 由于运行llama2 70B模型所需多机多卡运行,故介绍基于AC平台测试方式,不同的集群可按需修改env.sh,环境变量参考dtk-23.04,gcc-7.3.1, hpcx-2.7.4,python环境可按如下方式部署: ### Anaconda 1、关于本项目DCU显卡所需的特殊深度学习库可从光合开发者社区下载安装: https://developer.hpccube.com/tool/ ``` DTK驱动:dtk23.04 python:python3.7 torch:1.10.0 torchvision:0.10.0 torchaudio:0.10.0 deepspeed:0.9.2 apex:0.1 Tips:以上dtk驱动、python、torch等DCU相关工具版本需要严格一一对应 ``` 2、其它非特殊库参照requirements.txt安装 ``` pip3 install -r requirements.txt ``` ## 数据集 数据可按需进行自行准备,项目中已提供用于试验训练的oscar数据集,因数据较大,已压缩至oscar.tar.gz,请解压后自行放至合适位置,并按数据位置修改single.sh,具体可见训练步骤,训练数据目录结构如下,用于正常训练的完整数据集请按此目录结构进行制备: ``` oscar |my-llama_text_document.bin |my-llama_text_document.idx ``` ## 训练 ### slurm提交 需按集群配置进行slurm提交脚本修改: ``` #!/bin/bash #SBATCH -p xxx #队列名称 #SBATCH -N 32 #申请节点数量 #SBATCH --cpus-per-task=8 #每个任务使用的CPU数 #SBATCH --ntasks-per-node=4 #每个节点的进程数 #SBATCH --gres=dcu:4 #每个节点申请DCU数量 #SBATCH -J llama2 #作业名称 ...... ``` 此外,运行相应参数均位于single.sh,可按实际需要进行相应修改,列举如下: ``` # Change the below configurations here BASE_PATH=./tmp DS_CONFIG=${BASE_PATH}/deepspeed.json DATASET_1="./path_to_input_data" #set the path to data DATASET="1 ${DATASET_1}" CHECKPOINT_PATH=./checkpoint #set the path to save/load checkpoint TOKENIZER_PATH=./tokenizer.model # llama tokenizer.model TP=4 PP=16 ZERO_STAGE=1 HIDDEN_SIZE=8192 # e.g. llama-13b: 5120 #FFN_HIDDEN_SIZE=16384 # e.g. llama-13b: 13824 NUM_LAYERS=80 # e.g. llama-13b: 40 NUM_HEADS=64 # e.g. llama-13b: 40 SEQ_LENGTH=2048 NUM_KV_HEADS=4 # llama2 70B uses GQA MICRO_BATCH_SIZE=1 GLOBAL_BATCH_SIZE=120 # e.g. llama: 4M tokens TRAIN_STEPS=250000 # e.g. llama: 1T tokens / 4M tokens_per_batch = 250000 steps LR=1.5e-4 #2e-5 MIN_LR=1.5e-5 #2e-6 LR_WARMUP_ITERS=2000 WEIGHT_DECAY=0.1 GRAD_CLIP=1.0 ...... ``` 修改好之后,可按下述方式进行作业提交 ``` cd megatron-deepspeed-llama2_pytorch chmod u+x single.sh sbatch run.sh ``` ## result 成功运行后,会在运行目录下的logs目录下生成作业号.out文件,会持续输出模型运行log: ``` ./logs/xxxxx.out ``` ## 应用场景 ### 算法类别 ``` 自然语言处理 ``` ### 热点应用行业 ``` 医疗,教育,科研,金融 ``` ## 源码仓库及问题反馈 - https://developer.hpccube.com/codes/modelzoo/megatron-deepspeed-llama2_pytorch ## 参考资料 - https://github.com/bigscience-workshop/Megatron-DeepSpeed - https://www.deepspeed.ai/getting-started/ - https://deepspeed.readthedocs.io/en/latest/index.html