diff --git a/README.md b/README.md index bb3fbf1..1f410c8 100644 --- a/README.md +++ b/README.md @@ -50,4 +50,5 @@ ## 大语言模型驱动的多智能体协作与演化 -[大语言模型驱动的多智能体协作与演化-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) \ No newline at end of file +[大语言模型驱动的多智能体协作与演化-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) + \ No newline at end of file diff --git a/quick_start_clean/readmes/README_ALL.md b/quick_start_clean/readmes/README_ALL.md index f45b7f7..7c70899 100644 --- a/quick_start_clean/readmes/README_ALL.md +++ b/quick_start_clean/readmes/README_ALL.md @@ -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) @@ -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 需要将代码中环境变量设置为您的代码路径: ``` python @@ -113,7 +122,6 @@ def transform(data, num_sample: int, r: random.Random): sys.path.insert(0, "/data/public/CPM-9G/9G-Train") ``` -### pretrain shell脚本: ```shell #! /bin/bash @@ -170,9 +178,8 @@ echo "${CMD}" $CMD ``` -### sft 训练shell 脚本 +### SFT全参数微调训练 ``` shell - export MASTER_ADDR=`hostname` 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}" echo "${CMD}" $CMD - ``` -### lora 训练 -[lora 训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_LORA.md) - ## 模型推理 ```python import os @@ -266,9 +269,6 @@ if __name__ == "__main__": main() ``` -## 分布式多机训练 -[分布式多机训练](https://www.osredm.com/jiuyuan/CPM-9G-8B/tree/master/quick_start_clean/readmes/README_DISTRIBUTED.md) - ## FAQs 常见问题汇总,持续补充ing @@ -279,12 +279,12 @@ if __name__ == "__main__": 3 尽量避免在window机器下修改脚本,window中的编码和格式linux是有差别的,容易在脚本执行中报错 4 SFT如何调参训练 ``` - 回答:如果数据量少于10w条,多训练几个epoch,把学习率调低一些,比如说5e-6等; - 数据量很多呢,训练最多2个epoch足够,注意过拟合的问题 + 回答:如果数据量少于10w条,全参数微调的时候多训练几个epoch,把学习率调低一些,比如说5e-6等;更建议使用lora 微调的方式 + 数据量很多呢,比如说达到百万级别,那可以选择全参数微调,但训练最多2个epoch足够,注意过拟合的问题 ``` 5 微调训练中,train_iters如何计算? ``` - 回答:因为模型上下文是4096的token数目,通常情况存在训练数据不足4096的长度,所以会对多条数据进行merge,送入模型的数据量会少于1000条 + 回答:因为模型上下文是4096的token数目,通常情况存在训练数据不足4096的长度,所以会对多条数据进行merge,因此送入模型条数要少于实际的数据条数 ``` 6 打印出来的Iter信息有缺失 ``` @@ -294,10 +294,12 @@ if __name__ == "__main__": ``` 回答:不需要,参数中出现的val_datasets忽略即可 ``` -8 Lora 推理:需要进行merge 模型后预测,五一后release该代码 -9 加载模型遇到:invalid header or archive is carrupted,这种一般是模型没有下载完导致的,目前红山上的模型确定是完整的,首先自查自己的模型是否下载成功。 -10 存储模型的时候遇到failed write file data ,一般先检查下文件路径和权限、磁盘空间吧,存储模型基本不会报错 - +8 加载模型遇到:invalid header or archive is carrupted,这种一般是模型没有下载完导致的,目前红山上的模型确定是完整的,首先自查自己的模型是否下载成功。 +9 存储模型的时候遇到failed write file data ,一般先检查下文件路径和权限、磁盘空间吧,存储模型基本不会报错 +10 是否支持图像模态: +``` + 回答:不支持图像模态,仅支持文本模态 +``` ### 数据相关 1 历史对话的传入: ``` json @@ -308,5 +310,4 @@ datas = [ ## TODO -1 发布最新训练的80B SFT模型 -2 Lora相关的代码更新 \ No newline at end of file +1 发布8B-32k上下文的模型 \ No newline at end of file diff --git a/quick_start_clean/readmes/README_DISTRIBUTED.md b/quick_start_clean/readmes/README_DISTRIBUTED.md index e5eef76..4043184 100644 --- a/quick_start_clean/readmes/README_DISTRIBUTED.md +++ b/quick_start_clean/readmes/README_DISTRIBUTED.md @@ -20,7 +20,7 @@ CMD="torchrun --nnodes=2 --nproc_per_node=8 --rdzv_id=1 --rdzv_backend=c10d --rd 接下来,在这两个机器中都执行bash sft_cpm9g_8b.sh,这样就完成一次最简单的多机训练 不过机器多了之后不推荐这种方式 -### slurm 集群多机任务提交 +## slurm 集群多机任务提交 算力平台使用Slurm调度,常用Slurm命令包括: ``` shell @@ -114,6 +114,11 @@ for i in {1..3};do done ``` +## dockers上的多机提交任务 +dockers 容器上的多机任务和在主机上是相同的,只需要再其基础上满足两个要求 +- 在每个机器上拉取同样的docker和激活同样的训练环境,在docker共享的路径、数据、代码都一致 +- 在docker启动的时候保障 --network=host,和主机共享网络通信,只要机器之间能通信,在dockers中也可以通信和训练 + #### TODOs -1 完善dockers、K8s集群的分布式多机任务训练 \ No newline at end of file +1 完善K8s集群的分布式多机任务训练 \ No newline at end of file diff --git a/quick_start_clean/readmes/README_ENV.md b/quick_start_clean/readmes/README_ENV.md index 881bade..ed66da4 100644 --- a/quick_start_clean/readmes/README_ENV.md +++ b/quick_start_clean/readmes/README_ENV.md @@ -1,3 +1,6 @@ +#环境配置、算力资源 + + # Docker使用 我们提供可以运行模型训练和推理的docker,便于在新环境下快速使用九格大模型。您也可以使用Conda配置运行环境。Conda配置方式请见下一节。 #### [docker 路径](https://qy-obs-6d58.obs.cn-north-4.myhuaweicloud.com/cpmlive-flash-0.0.4.tar) @@ -7,10 +10,11 @@ ```shell srun -p gpu1 --nodelist=g2001 -N 1 -n 8 -c 8 --gres=gpu:8 --pty bash module load rootless-docker/default +start_rootless_docker.sh ``` **注意使用bash(不能用zsh)** -start_rootless_docker.sh运行成功的话,此时执行docker ps可以看到当前没有正在运行的容器,如果有正在运行的容器,说明rootless模式没有启动成功,请联系管理员。 +运行成功的话,此时执行docker ps可以看到当前没有正在运行的容器,如果有正在运行的容器,说明rootless模式没有启动成功,请联系管理员。 ### 加载镜像 ```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启动 @@ -53,6 +57,10 @@ docker stop [CONTAINER_ID] ```shell docker ps ``` +### 环境安装 +```shell +pip install tensorboardX +``` ## Conda环境配置 ### 训练环境配置 @@ -90,7 +98,19 @@ echo $LD_LIBRARY_PATH2. 安装LibCPM 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| @@ -98,7 +118,6 @@ pip installlibcpm-1.0.0-cp38-cp38-linux_x86_64.whl | 千亿模型 |内存 |训练: 200G, 推理:2G| | 千亿模型 |显存 |训练: 8*80G , 推理:4 * 50G| - 另外 - 该表格是百亿、千亿模型需要的最小的资源,batch size为1. - 百亿模型是在单卡A100上测试 diff --git a/quick_start_clean/readmes/README_LORA.md b/quick_start_clean/readmes/README_LORA.md index 0465c13..7e228a2 100644 --- a/quick_start_clean/readmes/README_LORA.md +++ b/quick_start_clean/readmes/README_LORA.md @@ -60,19 +60,17 @@ OPTS+=" --save-origin-model" 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}" $CMD ``` ## 合并模型 -训练好的lora delta model一般有两种方式 -- 在直接含有lora的推理代码进行推理 - 将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 - +``` # lora 推理