Merge branch 'master' of https://osredm.com/jiuyuan/CPM-9G-8B
This commit is contained in:
commit
d0e90e99ff
|
@ -51,3 +51,4 @@
|
||||||
<video src="https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/%E8%AF%BE%E7%A8%8B%E8%A7%86%E9%A2%91/400_0121.mp4
|
<video src="https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/%E8%AF%BE%E7%A8%8B%E8%A7%86%E9%A2%91/400_0121.mp4
|
||||||
" width="800px" height="600px" controls="controls"></video>
|
" width="800px" height="600px" controls="controls"></video>
|
||||||
[大语言模型驱动的多智能体协作与演化-PPT](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/%E8%AF%BE%E7%A8%8B%E8%A7%86%E9%A2%91/9.%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E9%A9%B1%E5%8A%A8%E7%9A%84%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E5%8D%8F%E4%BD%9C%E4%B8%8E%E6%BC%94%E5%8C%96-PPT.pdf)
|
[大语言模型驱动的多智能体协作与演化-PPT](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/%E8%AF%BE%E7%A8%8B%E8%A7%86%E9%A2%91/9.%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E9%A9%B1%E5%8A%A8%E7%9A%84%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E5%8D%8F%E4%BD%9C%E4%B8%8E%E6%BC%94%E5%8C%96-PPT.pdf)
|
||||||
|
|
|
@ -1,18 +1,22 @@
|
||||||
# 九格大模型使用文档
|
# 九格大模型使用文档
|
||||||
|
## 目录
|
||||||
|
- [环境配置](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#环境配置)
|
||||||
|
- [开源模型](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#开源模型)
|
||||||
|
- [数据构建](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#数据构建)
|
||||||
|
- [模型训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#模型训练)
|
||||||
|
- [模型推理](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#模型推理)
|
||||||
|
- [多机训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_DISTRIBUTED.md)
|
||||||
|
- [FAQs](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#FAQs)
|
||||||
|
|
||||||
|
帮助您快速了解CPM-9G的使用,我们准备了一个快速入门教程,目标是基于CPM-9G基座模型通过指令微调的方式构建一个Chat模型。
|
||||||
## 环境配置:
|
## 环境配置:
|
||||||
|
[环境配置、算力资源](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ENV.md)
|
||||||
[环境配置、硬件信息](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ENV.md)
|
|
||||||
|
|
||||||
## 开源模型
|
## 开源模型
|
||||||
1 目前启元开源了80B的百亿SFT模型,模型的路径:[百亿SFT开源模型](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/checkpoints-epoch-1.tar.gz)
|
1 目前启元开源了80B的百亿SFT模型,v2版本是在v1基础上精度和对话能力的优化模型,下载链接:
|
||||||
|
[8b_v1版本](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/checkpoints-epoch-1.tar.gz), [8b_v2版本](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/sft_8b_v2.zip)
|
||||||
|
|
||||||
|
## 数据构建
|
||||||
## 使用教程
|
|
||||||
|
|
||||||
为了帮助您快速了解CPM-9G的使用,我们准备了一个快速入门教程,目标是基于CPM-9G基座模型通过指令微调的方式构建一个Chat模型。
|
|
||||||
|
|
||||||
## 数据
|
|
||||||
|
|
||||||
本教程使用的数据是Alpaca Zh,一个开源中文指令微调数据集。[数据集](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM/blob/main/data/alpaca_gpt4_data_zh.json)
|
本教程使用的数据是Alpaca Zh,一个开源中文指令微调数据集。[数据集](https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM/blob/main/data/alpaca_gpt4_data_zh.json)
|
||||||
|
|
||||||
|
@ -105,7 +109,12 @@ def transform(data, num_sample: int, r: random.Random):
|
||||||
- 我们在此文件中指定了数据文件的路径、转换脚本路径等信息,后续训练仅需要系统该文件的路径即可。
|
- 我们在此文件中指定了数据文件的路径、转换脚本路径等信息,后续训练仅需要系统该文件的路径即可。
|
||||||
|
|
||||||
## 模型训练
|
## 模型训练
|
||||||
|
模型训练列举了三种训练
|
||||||
|
- [pretrain训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#pretrain训练)
|
||||||
|
- [SFT全参数微调训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_ALL.md?tab=readme-ov-file#SFT全参数微调训练)
|
||||||
|
- [LoRA微调训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_LORA.md)
|
||||||
|
|
||||||
|
### pretrain训练:
|
||||||
模型训练代码的位置:9G-Train/apps/cpm9g/pretrain_cpm9g.py
|
模型训练代码的位置:9G-Train/apps/cpm9g/pretrain_cpm9g.py
|
||||||
需要将代码中环境变量设置为您的代码路径:
|
需要将代码中环境变量设置为您的代码路径:
|
||||||
``` python
|
``` python
|
||||||
|
@ -113,7 +122,6 @@ def transform(data, num_sample: int, r: random.Random):
|
||||||
sys.path.insert(0, "/data/public/CPM-9G/9G-Train")
|
sys.path.insert(0, "/data/public/CPM-9G/9G-Train")
|
||||||
```
|
```
|
||||||
|
|
||||||
### pretrain shell脚本:
|
|
||||||
```shell
|
```shell
|
||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
|
|
||||||
|
@ -170,9 +178,8 @@ echo "${CMD}"
|
||||||
$CMD
|
$CMD
|
||||||
```
|
```
|
||||||
|
|
||||||
### sft 训练shell 脚本
|
### SFT全参数微调训练
|
||||||
``` shell
|
``` shell
|
||||||
|
|
||||||
export MASTER_ADDR=`hostname`
|
export MASTER_ADDR=`hostname`
|
||||||
export MASTER_PORT=12345
|
export MASTER_PORT=12345
|
||||||
|
|
||||||
|
@ -218,12 +225,8 @@ OPTS+=" $@"
|
||||||
CMD="torchrun --nnodes=1 --nproc_per_node=8 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} ${CPM_PATH}/apps/cpm9g/sft_cpm9g.py ${OPTS}"
|
CMD="torchrun --nnodes=1 --nproc_per_node=8 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} ${CPM_PATH}/apps/cpm9g/sft_cpm9g.py ${OPTS}"
|
||||||
echo "${CMD}"
|
echo "${CMD}"
|
||||||
$CMD
|
$CMD
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### lora 训练
|
|
||||||
[lora 训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_LORA.md)
|
|
||||||
|
|
||||||
## 模型推理
|
## 模型推理
|
||||||
```python
|
```python
|
||||||
import os
|
import os
|
||||||
|
@ -266,9 +269,6 @@ if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
```
|
```
|
||||||
|
|
||||||
## 分布式多机训练
|
|
||||||
[分布式多机训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_DISTRIBUTED.md)
|
|
||||||
|
|
||||||
## FAQs
|
## FAQs
|
||||||
|
|
||||||
常见问题汇总,持续补充ing
|
常见问题汇总,持续补充ing
|
||||||
|
@ -279,12 +279,12 @@ if __name__ == "__main__":
|
||||||
3 尽量避免在window机器下修改脚本,window中的编码和格式linux是有差别的,容易在脚本执行中报错
|
3 尽量避免在window机器下修改脚本,window中的编码和格式linux是有差别的,容易在脚本执行中报错
|
||||||
4 SFT如何调参训练
|
4 SFT如何调参训练
|
||||||
```
|
```
|
||||||
回答:如果数据量少于10w条,多训练几个epoch,把学习率调低一些,比如说5e-6等;
|
回答:如果数据量少于10w条,全参数微调的时候多训练几个epoch,把学习率调低一些,比如说5e-6等;更建议使用lora 微调的方式
|
||||||
数据量很多呢,训练最多2个epoch足够,注意过拟合的问题
|
数据量很多呢,比如说达到百万级别,那可以选择全参数微调,但训练最多2个epoch足够,注意过拟合的问题
|
||||||
```
|
```
|
||||||
5 微调训练中,train_iters如何计算?
|
5 微调训练中,train_iters如何计算?
|
||||||
```
|
```
|
||||||
回答:因为模型上下文是4096的token数目,通常情况存在训练数据不足4096的长度,所以会对多条数据进行merge,送入模型的数据量会少于1000条
|
回答:因为模型上下文是4096的token数目,通常情况存在训练数据不足4096的长度,所以会对多条数据进行merge,因此送入模型条数要少于实际的数据条数
|
||||||
```
|
```
|
||||||
6 打印出来的Iter信息有缺失
|
6 打印出来的Iter信息有缺失
|
||||||
```
|
```
|
||||||
|
@ -294,10 +294,12 @@ if __name__ == "__main__":
|
||||||
```
|
```
|
||||||
回答:不需要,参数中出现的val_datasets忽略即可
|
回答:不需要,参数中出现的val_datasets忽略即可
|
||||||
```
|
```
|
||||||
8 Lora 推理:需要进行merge 模型后预测,五一后release该代码
|
8 加载模型遇到:invalid header or archive is carrupted,这种一般是模型没有下载完导致的,目前红山上的模型确定是完整的,首先自查自己的模型是否下载成功。
|
||||||
9 加载模型遇到:invalid header or archive is carrupted,这种一般是模型没有下载完导致的,目前红山上的模型确定是完整的,首先自查自己的模型是否下载成功。
|
9 存储模型的时候遇到failed write file data ,一般先检查下文件路径和权限、磁盘空间吧,存储模型基本不会报错
|
||||||
10 存储模型的时候遇到failed write file data ,一般先检查下文件路径和权限、磁盘空间吧,存储模型基本不会报错
|
10 是否支持图像模态:
|
||||||
|
```
|
||||||
|
回答:不支持图像模态,仅支持文本模态
|
||||||
|
```
|
||||||
### 数据相关
|
### 数据相关
|
||||||
1 历史对话的传入:
|
1 历史对话的传入:
|
||||||
``` json
|
``` json
|
||||||
|
@ -308,5 +310,4 @@ datas = [
|
||||||
|
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
1 发布最新训练的80B SFT模型
|
1 发布8B-32k上下文的模型
|
||||||
2 Lora相关的代码更新
|
|
|
@ -20,7 +20,7 @@ CMD="torchrun --nnodes=2 --nproc_per_node=8 --rdzv_id=1 --rdzv_backend=c10d --rd
|
||||||
接下来,在这两个机器中都执行bash sft_cpm9g_8b.sh,这样就完成一次最简单的多机训练
|
接下来,在这两个机器中都执行bash sft_cpm9g_8b.sh,这样就完成一次最简单的多机训练
|
||||||
不过机器多了之后不推荐这种方式
|
不过机器多了之后不推荐这种方式
|
||||||
|
|
||||||
### slurm 集群多机任务提交
|
## slurm 集群多机任务提交
|
||||||
|
|
||||||
算力平台使用Slurm调度,常用Slurm命令包括:
|
算力平台使用Slurm调度,常用Slurm命令包括:
|
||||||
``` shell
|
``` shell
|
||||||
|
@ -114,6 +114,11 @@ for i in {1..3};do
|
||||||
done
|
done
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## dockers上的多机提交任务
|
||||||
|
dockers 容器上的多机任务和在主机上是相同的,只需要再其基础上满足两个要求
|
||||||
|
- 在每个机器上拉取同样的docker和激活同样的训练环境,在docker共享的路径、数据、代码都一致
|
||||||
|
- 在docker启动的时候保障 --network=host,和主机共享网络通信,只要机器之间能通信,在dockers中也可以通信和训练
|
||||||
|
|
||||||
|
|
||||||
#### TODOs
|
#### TODOs
|
||||||
1 完善dockers、K8s集群的分布式多机任务训练
|
1 完善K8s集群的分布式多机任务训练
|
|
@ -1,3 +1,6 @@
|
||||||
|
#环境配置、算力资源
|
||||||
|
|
||||||
|
|
||||||
# Docker使用
|
# Docker使用
|
||||||
我们提供可以运行模型训练和推理的docker,便于在新环境下快速使用九格大模型。您也可以使用Conda配置运行环境。Conda配置方式请见下一节。
|
我们提供可以运行模型训练和推理的docker,便于在新环境下快速使用九格大模型。您也可以使用Conda配置运行环境。Conda配置方式请见下一节。
|
||||||
#### [docker 路径](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/cpmlive-flash-0.0.4.tar)
|
#### [docker 路径](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/cpmlive-flash-0.0.4.tar)
|
||||||
|
@ -7,10 +10,11 @@
|
||||||
```shell
|
```shell
|
||||||
srun -p gpu1 --nodelist=g2001 -N 1 -n 8 -c 8 --gres=gpu:8 --pty bash
|
srun -p gpu1 --nodelist=g2001 -N 1 -n 8 -c 8 --gres=gpu:8 --pty bash
|
||||||
module load rootless-docker/default
|
module load rootless-docker/default
|
||||||
|
start_rootless_docker.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
**注意使用bash(不能用zsh)**
|
**注意使用bash(不能用zsh)**
|
||||||
start_rootless_docker.sh运行成功的话,此时执行docker ps可以看到当前没有正在运行的容器,如果有正在运行的容器,说明rootless模式没有启动成功,请联系管理员。
|
运行成功的话,此时执行docker ps可以看到当前没有正在运行的容器,如果有正在运行的容器,说明rootless模式没有启动成功,请联系管理员。
|
||||||
|
|
||||||
### 加载镜像
|
### 加载镜像
|
||||||
```shell
|
```shell
|
||||||
|
@ -22,7 +26,7 @@ docker tag [IMAGE_ID] cpmlive-flash:0.0.4
|
||||||
|
|
||||||
### 启动容器
|
### 启动容器
|
||||||
```
|
```
|
||||||
docker run -it -d -v [HOST_PATH1]:[DOCKER_PATH1] -v [HOST_PATH2]:[DOCKER_PATH2] --gpus all --shm-size=4g --sh cpmlive-flash:0.0.4 bash
|
docker run -it -d -v [HOST_PATH1]:[DOCKER_PATH1] -v [HOST_PATH2]:[DOCKER_PATH2] --gpus all --shm-size=4g cpmlive-flash:0.0.4 bash
|
||||||
```
|
```
|
||||||
如果有docker权限、且rootless执行错误的情况下,可以尝试下非rootless启动
|
如果有docker权限、且rootless执行错误的情况下,可以尝试下非rootless启动
|
||||||
|
|
||||||
|
@ -53,6 +57,10 @@ docker stop [CONTAINER_ID]
|
||||||
```shell
|
```shell
|
||||||
docker ps
|
docker ps
|
||||||
```
|
```
|
||||||
|
### 环境安装
|
||||||
|
```shell
|
||||||
|
pip install tensorboardX
|
||||||
|
```
|
||||||
|
|
||||||
## Conda环境配置
|
## Conda环境配置
|
||||||
### 训练环境配置
|
### 训练环境配置
|
||||||
|
@ -90,7 +98,19 @@ echo $LD_LIBRARY_PATH2. 安装LibCPM
|
||||||
pip installlibcpm-1.0.0-cp38-cp38-linux_x86_64.whl
|
pip installlibcpm-1.0.0-cp38-cp38-linux_x86_64.whl
|
||||||
```
|
```
|
||||||
|
|
||||||
# 硬件资源
|
# 算力资源
|
||||||
|
## 推荐配置:
|
||||||
|
### 千亿大模型
|
||||||
|
- 预训练、全参数微调:8 * 512G以上内存,64 * 80G以上显存
|
||||||
|
- 高效微调(LoRA)与推理: 512G 以上内存,8 * 80G以上显存
|
||||||
|
|
||||||
|
### 百亿大模型
|
||||||
|
- 预训练、全参数微调:2 * 512G以上内存,16 * 80G以上显存
|
||||||
|
- 高效微调(LoRA)与推理: 128G 以上内存,2 * 80G以上显存
|
||||||
|
|
||||||
|
## 极限配置
|
||||||
|
最极限的资源配置,仅供参考,在大模型训练中其实并不推荐,因为其效果一般不佳,训练时长也比较久
|
||||||
|
|
||||||
| 模型 | 资源 | 最小算力 |
|
| 模型 | 资源 | 最小算力 |
|
||||||
| :-------- | :----- | :----: |
|
| :-------- | :----- | :----: |
|
||||||
| 百亿模型 |内存 |训练:140G, 推理:1G|
|
| 百亿模型 |内存 |训练:140G, 推理:1G|
|
||||||
|
@ -98,7 +118,6 @@ pip installlibcpm-1.0.0-cp38-cp38-linux_x86_64.whl
|
||||||
| 千亿模型 |内存 |训练: 200G, 推理:2G|
|
| 千亿模型 |内存 |训练: 200G, 推理:2G|
|
||||||
| 千亿模型 |显存 |训练: 8*80G , 推理:4 * 50G|
|
| 千亿模型 |显存 |训练: 8*80G , 推理:4 * 50G|
|
||||||
|
|
||||||
|
|
||||||
另外
|
另外
|
||||||
- 该表格是百亿、千亿模型需要的最小的资源,batch size为1.
|
- 该表格是百亿、千亿模型需要的最小的资源,batch size为1.
|
||||||
- 百亿模型是在单卡A100上测试
|
- 百亿模型是在单卡A100上测试
|
||||||
|
|
|
@ -60,19 +60,17 @@ OPTS+=" --save-origin-model"
|
||||||
OPTS+=" $@"
|
OPTS+=" $@"
|
||||||
|
|
||||||
|
|
||||||
CMD="torchrun --nnodes=1 --nproc_per_node=2 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} ${CPM_PATH}/apps/cpm9g/sft_cpm9g.py ${OPTS}"
|
CMD="torchrun --nnodes=1 --nproc_per_node=2 --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} ${CPM_PATH}/apps/cpm9g/sft_cpm9g_delta.py ${OPTS}"
|
||||||
|
|
||||||
echo "${CMD}"
|
echo "${CMD}"
|
||||||
$CMD
|
$CMD
|
||||||
```
|
```
|
||||||
|
|
||||||
## 合并模型
|
## 合并模型
|
||||||
训练好的lora delta model一般有两种方式
|
|
||||||
- 在直接含有lora的推理代码进行推理
|
|
||||||
- 将lora delta model参数和original model merge在一起 作为新的模型,但是模型的参数数量并没有增多
|
- 将lora delta model参数和original model merge在一起 作为新的模型,但是模型的参数数量并没有增多
|
||||||
|
```python
|
||||||
python merge_lora_delta.py --base_path cpm9g-8b-sft.pt --delta_path cpm9g-lora.pt --merge_path cpm9g-8b-sft_with_lora.pt
|
python merge_lora_delta.py --base_path cpm9g-8b-sft.pt --delta_path cpm9g-lora.pt --merge_path cpm9g-8b-sft_with_lora.pt
|
||||||
|
```
|
||||||
|
|
||||||
# lora 推理
|
# lora 推理
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue