- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在阅读哈德利的 Advanced R并尝试一些东西。我正在尝试创建一个 lazy闭包函数返回一个带有提供的函数 data.frame在其环境中以及使用 with并且能够在以后提供额外的函数参数。
我有两个 ViewController。初始 ViewController 是输入和存储 URL 的地方。此初始 ViewController 的 viewDidLoad 还应该在应用程序启动时开始加
你是怎么用的 对于应用程序中的 ListView 项也应该在设备 <11 上运行? 由于 activated_state 在 HC 之前不可用,我只能想到两个肮脏的解决方法: 在您的 Activit
我正在为 android (2.1 > 3.1) 编写一个应用程序,我想使用熟悉的做法,即在 Honeycomb 应用程序中使用应用程序图标来进入家庭 Activity ,但是,当我之前运行该 Act
如果搜索的键不存在,我如何覆盖方法 GET 或编写一个将在服务器端执行的新函数返回另一个键值? 示例: 如果关键字“word_1 word_2 word_3 word_4”不存在则搜索关键字“word
对于我的存储库,我使用的是 Git 和 Stash。在 Stash 端,我限制了(只读)对 master 的访问权限,因此任何用户都可以从 master 分支分支以获取功能/分支,但不能直接 merg
如何配置dgrid及其存储以定义渲染行时是否已经选择了行? 例如,如果我的行数据是这样的: { id: 1, name: 'Item Name', selected: true } 我当前
有没有一种方法可以将变量从一个 BeanShell 前/后处理器引用到另一个 BeanShell 处理器(它们在同一个线程组中)? 如果我在 HTTP 请求下的 BeanShell 预处理器中创建了一
问题 我已尝试添加预操作 shell 脚本,这些脚本会根据我正在构建的内容打开/关闭我的 .pch 文件中的某些定义。 但是,在运行构建时,没有任何反应。我不是一个流利的 shell 脚本编写者,所以
我有一个 HTML 字符串用作 jQuery 输入文档。 // the variable html contains the HTML code jQuery( html ).find( 'p' ).
在 Mercurial 中允许 merge 之前有没有办法进行一些检查? 通过将以下内容添加到 ~/.hg/hgrc,我找到了更新前 Hook ,并拥有一个在允许更新之前运行的脚本: [hooks]
总结: 预 Controller Hook 是否在缓存期间执行?是否有任何 Hook 点可以执行? (系统前?) 我应该强调一个事实,即 Hook 不会影响发送到浏览器的内容。这不是问题。 详细版:
我正在使用适用于 android 的 Skobbler Map API,到目前为止它一直非常好。按照官方的“操作方法”,我已经能够将 map 应用到我的应用程序中。比我可以让应用程序下载 map 并离
当我安装bcrypt时我的 hapi js 项目的模块尚未安装,它显示类似 node-pre-gyp install --fallback-to-build 我尝试通过运行来安装; npm i nod
我试图使用此代码的变体: apply plugin: 'java' apply plugin: 'idea' idea.workspace.iws.withXml { provider ->
假设我们有一个 PHP 项目,其依赖项 A 和 B 分别依赖于 PHP 库 X,但版本不同。 通常,人们会使用诸如 composer 之类的 PHP 依赖管理器,它可以通过在与 A 和 B 兼容的版本
这似乎违背了代码块的目的,但我希望能够在代码块中加粗。例如,如果我想将返回行加粗: int main(void) { **return 0;** } 最佳答案 您必须在 HTML 中执行此操作
我们是否应该使用 Huggingface(预)训练一个 BERT 无框模型的小写输入数据?我查看了 Thomas Wolf ( https://github.com/huggingface/trans
我有两个模式: 技能: var mongoose = require("mongoose"); var SkillSchema = new mongoose.Schema({ skill: {
我这里有问题。这适用于 Chrome,但我无法在 IE11 的 index.html 中使用任何动画。当它不想工作时,我会看到一个静态屏幕。同样在 IE 中,消息不会像它应该的那样消失。如果我将 di
我是一名优秀的程序员,十分优秀!