README.md 4.75 KB
Newer Older
liangjing's avatar
liangjing committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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。
liangjing's avatar
liangjing committed
18
LLaMA2相较于LLaMA采用了更强大的数据清洗、更多的tokens训练、加倍的上下文长度,并支持了Grouped-query attention (GQA),即允许在多头注意力(MHA)模型中共享键和值投影,从而减少与缓存相关的内存成本的优化方法。通过使用 GQA,更大的模型可以在优化内存使用的同时保持性能。
liangjing's avatar
liangjing committed
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

![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
```
## 数据集

liangjing's avatar
liangjing committed
57
数据可按需进行自行准备,项目中已提供用于试验训练的oscar数据集,因数据较大,已压缩至oscar.tar.gz,请解压后自行放至合适位置,并按数据位置修改single.sh,具体可见训练步骤,训练数据目录结构如下,用于正常训练的完整数据集请按此目录结构进行制备:
liangjing's avatar
liangjing committed
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
```
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
liangjing's avatar
liangjing committed
116
chmod u+x single.sh
liangjing's avatar
liangjing committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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/

liangjing's avatar
liangjing committed
147
- https://deepspeed.readthedocs.io/en/latest/index.html