- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
虽然Llama2的预训练数据相对于第一代LLaMA扩大了一倍,但是中文预训练数据的比例依然非常少,仅占0.13%,这也导致了原始Llama2的中文能力较弱。为了能够提升模型的中文能力,可以采用微调和预训练两种路径,其中:
下面从主要目标、训练数据、权重更新、数据转换和预处理、任务类型、示例应用和典型场景7个方面进行比较,如下所示(ChatGPT):
特征 | Pretraining(预训练) | Continuous Pretraining(继续预训练) | Fine-tuning(微调) | Post-Pretrain(预训练之后) |
---|---|---|---|---|
主要目标 | 学习通用的表示 | 在通用表示上继续学习 | 在特定任务上调整模型 | 在预训练之后的额外学习和任务 |
训练数据 | 大规模文本数据集 | 额外的文本数据集 | 特定任务的数据集 | 额外的优化、领域适应或任务迁移 |
权重更新 | 固定模型参数,不进行权重更新 | 继续更新模型参数 | 在任务数据上进行权重更新 | 针对特定需求进行权重更新 |
数据转换和预处理 | 通常包括数据标准化、掩码预测等 | 与预训练相似的预处理 | 根据任务需求进行调整 | 针对特定需求进行数据处理和优化 |
任务类型 | 无监督学习、自监督学习 | 通常是自监督学习 | 监督学习 | 可以包括优化、领域适应、任务迁移等多种任务 |
示例应用 | BERT、GPT等 | 额外的预训练 | 文本分类、命名实体识别等 | 模型优化、领域适应、多任务学习等 |
典型场景 | 语言理解和生成 | 继续模型学习 | 特定文本任务 | 后续步骤和任务,用于定制和优化模型 |
说明:本文环境为Windows10,Python3.10,CUDA 11.8,GTX 3090(24G),内存24G.
一.模型预训练脚本 模型预训练脚本中的参数较多,只能在实践中来消化了。因为用的Windows10系统,所以运行shell脚本较麻烦,这部分不做过多介绍。如下所示:
train/pretrain/pretrain.sh
output_model=/mnt/data1/atomgpt # output_model:输出模型路径
if [ ! -d ${output_model} ];then # -d:判断是否为目录,如果不是目录则创建
mkdir ${output_model} # mkdir:创建目录
fi
cp ./pretrain.sh ${output_model} # cp:复制文件pretrain.sh到output_model目录下
cp ./ds_config_zero*.json ${output_model} # cp:复制文件ds_config_zero*.json到output_model目录下
deepspeed --num_gpus 1 pretrain_clm.py \ # deepspeed:分布式训练,num_gpus:使用的gpu数量,pretrain_clm.py:训练脚本
--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 \ # seed:随机种子
--disable_tqdm false \ # disable_tqdm:是否禁用tqdm
--ddp_find_unused_parameters false \ # ddp_find_unused_parameters:是否找到未使用的参数
--block_size 4096 \ # block_size:块大小
--overwrite_output_dir \ # overwrite_output_dir:是否覆盖输出目录
--report_to tensorboard \ # 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:从检查点恢复训练
二.预训练实现代码 Llama中文社区供了Llama模型的预训练代码,以及中文语料(参考第六部分)。本文在meta发布的Llama-2-7b基础上进行预训练, pretrain_clm.py 代码的中文注释参考[0],执行脚本如下所示:
python pretrain_clm.py --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) 解析:加载config,如下所示: 5. tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **tokenizer_kwargs) 解析:加载tokenizer,如下所示:
6. model = AutoModelForCausalLM.from_pretrained() 解析:加载model,这一步非常耗时,如下所示:
7. tokenized_datasets = raw_datasets.map() 解析:原始数据集处理,比如编码等,如下所示:
8. trainer = Trainer() 解析:实例化一个trainer,用于后续的训练或评估。跑到这一步的时候就报OOM了。如下所示:
trainer = Trainer( # 训练器
model=model, # 模型
args=training_args, # 训练参数
train_dataset= IterableWrapper(train_dataset) if training_args.do_train else None, # 训练数据集
eval_dataset= IterableWrapper(eval_dataset) if training_args.do_eval else None, # 评估数据集
tokenizer=tokenizer, # 分词器
# Data collator will default to DataCollatorWithPadding, so we change it.
# 翻译:数据收集器将默认为DataCollatorWithPadding,因此我们将其更改。
data_collator=default_data_collator, # 默认数据收集器
compute_metrics=compute_metrics if training_args.do_eval and not is_torch_tpu_available() else None, # 计算指标
preprocess_logits_for_metrics=preprocess_logits_for_metrics if training_args.do_eval and not is_torch_tpu_available() else None, # 为指标预处理logits
# callbacks=([SavePeftModelCallback] if isinstance(model, PeftModel) else None),
)
说过:阅读 pretrain_clm.py 代码有几个疑问:中文词表是什么扩展的?上下文长度如何扩增?如何预训练text数据?后续再写文章分享.
三.DeepSpeed加速 DeepSpeed是一个由微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。它通过多种技术手段来加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。此外,deepspeed基于pytorch构建,只需要简单修改即可迁移。DeepSpeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等等。 DeepSpeed主要包含三部分:
1.Windows10安装DeepSpeed 解析:管理员启动cmd:
build_win.bat
python setup.py bdist_wheel
2.安装编译工具 在Visual Studio Installer中勾选"使用C++的桌面开发",如下所示: 3.error C2665: torch::empty: 没有重载函数可以转换所有参数类型 解决办法如下所示: 4.元素"1": 从"size_t"转换为"_Ty"需要收缩转换 解析:具体错误如下所示:
csrc/transformer/inference/csrc/pt_binding.cpp(536): error C2398: 元素"1": 从"size_t"转换为"_Ty"需要收缩转换
解析方案如下所示:
536:hidden_dim * (unsigned)InferenceContext
537:k * (int)InferenceContext
545:hidden_dim * (unsigned)InferenceContext
546:k * (int)InferenceContext
1570: input.size(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 // 最小损失缩放
},
"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": 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, // 减少桶大小
"contiguous_gradients": true // 连续梯度
},
"activation_checkpointing": { // 激活检查点
"partition_activations": false, // 分区激活
"cpu_checkpointing": false, // CPU检查点
"contiguous_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版本) |
---|---|---|
内存占用优化 | 是 | 是 |
动态计算图支持 | 不支持 | 支持 |
性能优化 | 一般 | 更好 |
模型配置选项 | 有限 | 更多 |
分布式训练支持 | 是 | 是 |
具体应用 | 非动态计算图模型 | 动态计算图模型 |
四.训练效果度量指标 accuracy.py 代码的中文注释参考[1],主要在预训练评估的时候用到了该文件,如下所示:
train/pretrain/accuracy.py
metric = evaluate.load("accuracy.py") # 加载指标
五.中文测试语料 中文测试语料数据格式如下所示:
<s>Human: 问题</s><s>Assistant: 答案</s>
多轮语料将单轮的拼接在一起即可,如下所示:
<s>Human: 内容1\n</s><s>Assistant: 内容2\n</s><s>Human: 内容3\n</s><s>Assistant: 内容4\n</s>
Llama2-Chinese项目中提供的train和dev文件共有3个,如下所示:
data\dev_sft.csv
data\dev_sft_sharegpt.csv
data\train_sft.csv
更多的语料可从Llama中文社区( https://llama.family/)链接下载:
六.中文语料 Atom-7B是一个基于Llama2架构的预训练语言模型,Llama中文社区将基于大规模中文语料,从预训练开始对Llama2模型进行中文能力的持续迭代升级。通过以下数据来优化Llama2的中文能力:
类型 | 描述 |
---|---|
网络数据 | 互联网上公开的网络数据,挑选出去重后的高质量中文数据,涉及到百科、书籍、博客、新闻、公告、小说等高质量长文本数据。 |
Wikipedia | 中文Wikipedia的数据 |
悟道 | 中文悟道开源的200G数据 |
Clue | Clue开放的中文预训练数据,进行清洗后的高质量中文长文本数据 |
竞赛数据集 | 近年来中文自然语言处理多任务竞赛数据集,约150个 |
MNBVC | MNBVC 中清洗出来的部分数据集 |
说明:除了网络数据和竞赛数据集这2个没有提供链接,其它的4个都提供了数据集的链接.
参考文献: [0] https://github.com/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/pretrain_clm.py [1] https://github.com/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/accuracy.py [2] https://github.com/ai408/nlp-engineering/blob/main/20230916_Llama2-Chinese/train/pretrain/pretrain_log/pretrain_log [3] https://huggingface.co/meta-llama/Llama-2-7b-hf/tree/main [4] https://huggingface.co/spaces/ysharma/Explore_llamav2_with_TGI [5] https://huggingface.co/meta-llama/Llama-2-70b-chat-hf [6] https://huggingface.co/blog/llama2 [7] https://developer.nvidia.com/rdp/cudnn-download [8] https://github.com/jllllll/bitsandbytes-windows-webui [9] https://github.com/langchain-ai/langchain [10] https://github.com/AtomEcho/AtomBulb [11] https://github.com/huggingface/peft [12]全参数微调时,报没有target_modules变量: https://github.com/FlagAlpha/Llama2-Chinese/issues/169 [13] https://huggingface.co/FlagAlpha [14]Win10安装DeepSpeed: https://zhuanlan.zhihu.com/p/636450918 。
最后此篇关于Llama2-Chinese项目:2.1-Atom-7B预训练的文章就讲到这里了,如果你想了解更多关于Llama2-Chinese项目:2.1-Atom-7B预训练的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 NetBeans 开发 Java 中的 WebService,并使用 gradle 作为依赖管理。 我找到了this article关于使用 gradle 开发 Web 项目。它使用 Gr
我正在将旧项目从 ant 迁移到 gradle(以使用其依赖项管理和构建功能),并且在生成 时遇到问题>eclipse 项目。今天的大问题是因为该项目有一些子项目被拆分成 war 和 jar 包部署到
我已经为这个错误苦苦挣扎了很长时间。如果有帮助的话,我会提供一些问题的快照。请指导我该怎么办????在我看来,它看起来一团糟。 *** glibc detected *** /home/shivam/
我在 Ubuntu 12.10 上运行 NetBeans 7.3。我正在学习 Java Web 开发类(class),因此我有一个名为 jsage8 的项目,其中包含我为该类(class)所做的工作。
我想知道 Codeplex、GitHub 等中是否有任何突出的项目是 C# 和 ASP.NET,甚至只是 C# API 与功能测试 (NUnit) 和模拟(RhinoMocks、NMock 等)。 重
我创建了一个 Maven 项目,包装类型为“jar”,名为“Y”我已经完成了“Maven 安装”,并且可以在我的本地存储库中找到它.. 然后,我创建了另一个项目,包装类型为“war”,称为“X”。在这
我一直在关注the instructions用于将 facebook SDK 集成到我的应用程序中。除了“helloFacebookSample”之外,我已经成功地编译并运行了所有给定的示例应用程序。
我想知道,为什么我们(Java 社区)需要 Apache Harmony 项目,而已经有了 OpenJDK 项目。两者不是都是在开源许可下发布的吗? 最佳答案 事实恰恰相反。 Harmony 的成立是
我正在尝试使用 Jsoup HTML Parser 从网站获取缩略图 URL我需要提取所有以 60x60.jpg(或 png)结尾的 URL(所有缩略图 URL 都以此 URL 结尾) 问题是我让它在
我无法构建 gradle 项目,即使我编辑 gradle 属性,我也会收到以下错误: Error:(22, 1) A problem occurred evaluating root project
我有这个代码: var NToDel:NSArray = [] var addInNToDelArray = "Test1 \ Test2" 如何在 NToDel:NSArray 中添加 addInN
如何在单击显示更多(按钮)后将主题列表限制为 5 个(项目)。 还有 3(项目),依此类推到列表末尾,然后它会显示显示更少(按钮)。 例如:在 Udemy 过滤器选项中,当您点击查看更多按钮时,它仅显
如何将现有的 Flutter 项目导入为 gradle 项目? “导入项目”向导要求 Gradle 主路径。 我有 gradle,安装在我的系统中。但是这里需要设置什么(哪条路径)。 这是我正在尝试的
我有一个关于 Bitbucket 的项目。只有源被提交。为了将项目检索到新机器上,我在 IntelliJ 中使用了 Version Control > Checkout from Ve
所以,我想更改我公司的一个项目,以使用一些与 IDE 无关的设置。我在使用 Tomcat 设置 Java 应用程序方面有非常少的经验(我几乎不记得它是如何工作的)。 因此,为了帮助制作独立于 IDE
我有 2 个独立的项目,一个在 Cocos2dx v3.6 中,一个在 Swift 中。我想从 Swift 项目开始游戏。我该怎么做? 我已经将整个 cocos2dx 项目复制到我的 Swift 项目
Cordova 绝对是新手。这些是我完成的步骤: checkout 现有项目 运行cordova build ios 以上生成此构建错误: (node:10242) UnhandledPromiseR
我正在使用 JQuery 隐藏/显示 li。我的要求是,当我点击任何 li 时,它应该显示但隐藏所有其他 li 项目。当我将鼠标悬停在文本上时 'show all list item but don
我想将我所有的java 项目(223 个项目)迁移到gradle 项目。我正在使用由 SpringSource STS 团队开发的 Gradle Eclipse 插件。 目前,我所有的 java 项目
我下载this Eclipse Luna ,对于 Java EE 开发人员,如描述中所见,它支持 Web 应用程序。我找不到 file -> new -> other -> web projects
我是一名优秀的程序员,十分优秀!