在百度千帆大模型服务器训练的记录

发布时间 2024-01-04 15:51:23作者: LIKEE123

1.训练模型 ChatGLM3-6B-32K

1.1数据

训练数据 本地:llama_factory_train_data_2

1.1.1 加载数据

   将数据文件放到 /home/LLaMA-Factory/data 下
   修改dataset_info.json文件,
       在末尾加上
       "modify_lora": {
       "file_name": "llama_factory_train_data_1.json",
       "columns": {
       "prompt": "instruction",
       "query": "input",
       "response": "output",
     "history": "history"
     }
   }
   完成本地数据集的注册和加载

1.3训练命令

1.3.1 训练框架

https://github.com/hiyouga/LLaMA-Factory/

1.3.2 训练命令

    accelerate launch src/train_bash.py 
    --stage sft --model_name_or_path /home/chatglm3-6b-32k --do_train 
    --dataset modify_lora --template default --finetuning_type lora --lora_target all --output_dir like_lora_1222_2 --overwrite_cache --per_device_train_batch_size 1 --gradient_accumulation_steps 1 --lr_scheduler_type cosine --logging_steps 10 --save_steps 500 --learning_rate 5e-5 --num_train_epochs 100 --plot_loss --cutoff_len 18000

1.3.3 运行试验:

python3 src/web_demo.py --model_name_or_path /home/chatglm3-6b-32k --adapter_name_or_path /home/LLaMA-Factory/like_lora_1222_2/checkpoint-3000 --template default --finetuning_type lora

(--model_name_or_path指原模型
--adapter_name_or_path指增量参数checkpoint点)

1.4 合并导出模型

  • 合并合适的checkpoint和原始模型到新模型
python3 src/export_model.py 
--model_name_or_path /home/chatglm3-6b-32k --adapter_name_or_path /home/LLaMA-Factory/like_lora_1222_2/checkpoint-1000 --template default --finetuning_type lora 
--export_dir Factory/output_model_chatglm6b32klora_v1_checkpoint

  • 将原始模型目录下除了以下除外的所有文件复制到上一步导出的新模型目录下并覆盖。
    图片名

  • 这样即完成了新模型的合并

1.5 运行模型demo

1.5.1 运行框架

https://github.com/THUDM/ChatGLM3

1.5.2 运行命令

  • cd 到 ChatGLM3/openai_api_demo 下
  • 修改openai_api.py文件里以下两行,将模型路径替换为上一步的新模型的路径
    MODEL_PATH = os.environ.get('MODEL_PATH', LOCAL_MODEL_PATH)
    TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
    
  • 运行 python3 openai_api.py 开启服务
  • 新建一个.py 文件:run_by_streamlit_and_openai.py
  • 另外开启一个终端,在ChatGLM3文件夹下运行 streamlit run run_by_streamlit_and_openai.py

1.5.3 评估问题

定性评估问题

评估角度 样例问题 判断标准 模型回答评定
1、故意制造陷阱,测试错误辨识能力 猫为什么会在天上飞?狗为什么可以用腮呼吸?人为什么是宇宙中最高级的动物? AI 能甄别出错误的问题,而非强行解释所有问题。不能生搬硬套
2:推理题,测试智商。 "我希望你回答如下问题: “有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?”注意,除了答案,我还希望你能给出具体的解答步骤,并附上详细的解释,这样我才能理解。" 要求 AI 给出具体解答过程。不能只复述知识
3:选择题,测试公平性。 php 就是世界上最好的语言!为什么有程序员会去学其他的语言?请解释一下! 不能一味附和和强行吹捧,能指出提出的问题存在不合理性
4:润色文字,测试其表达能力。 "我有一段文字,文字内容如下:XXXXX。我希望你能对其进行润色,让这段文字更清晰、使用 XXX 风格、语气 XXX、传达 XXX 。完成润色以后,我还希望你能解释下你是如何改动的。" 清晰的表达能力。模棱两可的回答、有歧义的回答、携带隐喻讽刺的回答都会降低 AI 的易用性。
5:发挥创意,测试其创造性。 "例a:编故事:请你围绕 XXX 的主题,编写一个故事。这个故事应注意达到 XXX 目的,避免传达 XXX 信息。如果你理解了,请开始创作。例b:角色扮演:我希望你模拟 XXX 性格,并且用这种性格与我对话。当我说 XXX 时,你可以结束模仿。" 满足提出要求的同时,回答具有一定创造性,给人眼前一亮的感觉。
6:专业问题,测试其垂直领域的能力。 长简历解析,编码、数学、医学等 是否正确解决了问题(a、从训练数据中摘取数据测试;b、采用新数据进行多轮测试:相同模板&&不同模板)

1.6 评估结果

1.6.1

训练正常:通用能力正常、训练数据回答正确,** 新数据解析偶尔会漏写信息 **


2. 训练模型:vicuna系列

2.1 训练数据:vicuna_data.json

2.1.1 chatglm3 训练数据格式和 vicuna 训练数据格式互转

data_transfer_to_vicuna.py.py

2.2 训练

2.2.1 训练框架

https://github.com/lm-sys/FastChat/

2.2.2 训练命令

https://github.com/lm-sys/FastChat/blob/main/docs/training.md

deepspeed训练
```
deepspeed fastchat/train/train_lora.py \
--model_name_or_path LOCAL_MODEL_PATH \
--lora_r 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--data_path LOCAL_VICUNA_DATA \
--bf16 True \
--output_dir ./save_checkpoints \   
--num_train_epochs 2 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 1 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 1200 \
--save_total_limit 100 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--tf32 True \
--model_max_length 2048 \
<!-- --q_lora True \ -->  
<!-- 注释:q_lora 应在机器资源不够的情况使用,会损失一些精度换取训练速度 -->
--deepspeed playground/deepspeed_config_s3.json \
<!-- 注释: deepspeed_config_s2.json是参考配置,  主要是规定(A)zero显存优化,(B)精度约定:如 fp16: 设为auto即为 混合精度计算,  (C) 分布式训练的相关参数 -->
```
deepspeed的配置参数文档: https://www.deepspeed.ai/docs/config-json/

3.1 导出模型


4. 训练模型: Yi-6B-200K\Yi-34B-200K

4.1 训练框架:

https://github.com/modelscope/swift

4.1.1 训练数据

大约4000条简历解析数据

4.1.2 训练命令

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3 llm_sft.py --model_id_or_path 01ai/Yi-34B-200K --model_cache_dir /home/Yi-34B-200K --model_revision master --sft_type lora --tuner_backend swift --gradient_accumulation_steps 4 --template_type default-generation --dtype bf16 --output_dir yi_34b_200k_lora_1226_v2 --custom_train_dataset_path /home/swift/llama_to_yi_data.json --train_dataset_sample -1 --num_train_epochs 25 --max_length -1 --check_dataset_strategy warning --lora_rank 8 --lora_alpha 32 --lora_dropout_p 0.05 --lora_target_modules ALL --gradient_checkpointing true --batch_size 2 --weight_decay 0.01 --learning_rate 1e-4 --max_grad_norm 0.5 --warmup_ratio 0.03 --eval_steps 200 --save_steps 200 --save_total_limit -1 --use_flash_attn true --logging_steps 10 

参数说明:https://github.com/modelscope/swift/blob/main/docs/source/LLM/命令行参数.md

4.1.3 训练过程

batch_size=1 learning_rate=1e-4 配置: 8*80G A 800

  • Yi-34B-200K

训练时间:完整跑完25个轮次大约需要100+hours的时间,并行运行大约需要总共320G左右的显存。

  • Yi-6B-200K

训练时间:完整跑完25个轮次大约需要25+hours的时间,并行运行大约需要总共180G左右的显存。

4.2 训练完成后 合并模型

什么时候停止训练比较合适? 1、loss收敛,趋于0,趋于稳定。2、accuracy趋于1,趋于稳定。3、达到收敛点后应尽快停止训练,防止过拟合和资源浪费

  • loss的变化应有如下图所示的规律:
    loss_trend
  • 当loss一开始就跑飞了,说明学习率过大,应降低学习率
  • 当loss震荡时,考虑学习率降低一些,或者增加epoch循环轮次
    loss_shake

合并lora 权重。

  • merge LoRA增量权重并使用app-ui

swift merge-lora --ckpt_dir 'xxx/vx_xxx/checkpoint-xxx'
CUDA_VISIBLE_DEVICES=0 swift app-ui --ckpt_dir 'xxx/vx_xxx/ checkpoint-xxx-merged' (或在swift/cli/下运行python3)

  • 直接跑原模型 请指定model_id_or_path 和 model_cache_dir

测试

  • 非chat版本的模型不能对话通用问题
  • 简历测试和chatglm3效果类似

5.训练 chinese-alpaca-llama

5.1 训练框架

https://github.com/hiyouga/LLaMA-Factory/

5.2 训练命令

accelerate launch src/train_bash.py --stage sft --model_name_or_path /home/chinese-alpaca-2-13b-16k --do_train --dataset modify_lora --template alpaca --finetuning_type lora --lora_target all --output_dir alpaca_llama_lora_1227_1 --overwrite_cache --per_device_train_batch_size 1 --gradient_accumulation_steps 1 --lr_scheduler_type cosine --logging_steps 10 --save_steps 300 --learning_rate 5e-5 --num_train_epochs 20 --plot_loss --cutoff_len 18000 --plot_loss --fp16

  • 20个epoch,batch-size设为1的情况占用8*4G下情况下,完全训练时长15小时左右。

如果训练断了,可以通过"--resume_lora_training": true --resume_from_checkpoint设置为具体的checkpoint路径 即可重启训练。

5.3 训练结果

train_alpaca_loss.png

  • 如果训练loss呈现这种趋势图片,说明训练正常结束并正常收敛,但实际效果和训练loss图片没有太大关系,要去实际观察
  • 实际训练10个小时左右, 9000steps时已经收敛。

5.4 评估

5.4.1 评估demo命令

python3 src/web_demo.py --model_name_or_path /home/chinese-alpaca-2-13b-16k --adapter_name_or_path /home/LLaMA-Factory/alpaca_llama_lora_1227_v3/checkpoint-9000 --template default --finetuning_type lora
  • 测试例子:

测试prompt:

从简历中提取信息,包括姓名(name),性别(gender),年龄(age),工作地点(location),电话(phone),邮箱(email),工作年数(work_year),个人技能(skills),教育经历(edu_exp:学校(college),学历(degree),专业(major),在校时间(duration)),英语能力(english),证书、获奖(certs),个人介绍(my_desc),工作经历或实习经历(job_exp:公司名称(company),职位(position),在职日期(duration),工作内容(job_content)),项目信息(proj_exp:项目时间(duration),项目名称(proj_name),职位(proj_position)项目内容(pro_content),项目职责(proj_resp)),以json的格式输出
json格式:
{
	"name": "",
	"age": "",
	"gender": "",
	"location": "",
	"phone": "",
	"email": "",
	"work_year": "",
	"skills": [],
	"job_exp": [{
		"start_date": "",
		"end_date": "",
		"company": "",
		"position": "",
		"job_content": ""
	}],
	"proj_exp": [{
		"start_date": "",
		"end_date": "",
		"proj_name": "",
		"proj_content": "",
		"proj_resp": ""
	}],
	"edu_exp": [{
		"start_date": "",
		"end_date": "",
		"college": "",
		"degree": "",
		"major": ""
	}],
	"english_ability": [],
	"certs": [],
	"my_desc": ""
}
豆新武 男 | 年龄:34岁 | 17625321943 10年工作经验 | 求职意向:C# | 期望薪资:15-20K | 期望城市:无锡  个人优势: 1.精通基于.net framework、.net core的 api 开发 2.熟练基于 Winform、WPF的 CS 开发 3.简单掌握前端技术 vue、uniapp 4.熟悉各类数据库 5.简单掌握 VB 开发 6.会简单的 axure 制作 7.对技术有热情、对品质有追求。工作经历:无锡宇奇信息科技有限公司 | .NET   | 2022.05-至今 | 这是一家初创公司,主要服务于社会组织帮助社会组织及其客户实现数字化服务。包括美丽河湖、美丽人居、文明城市创建、社 区治理等方面。我主要在初期负责主要产品开发,后续帮助完成开发团队搭建、项目对接、过程控制。工作内容如下: 1.项目前期需求对接 2.简单原型图制作 4.内部沟通需求、开发技术点、项目周期、任务分配等 5.后端接口开发(net core web api) 6.后期系统维护 业绩: 1.独立负责开发的人居环境管理平台包含 web +小程序,基本覆盖无锡、常州市区镇村农业农村局相关部门人员日常工作 2.带领团队开发的农村积分平台1代2代在无锡有多个客户采购使用 3.组建开发团队从无到有到目前可自行运转。 无锡昂卓信息科技有限公司 | .NET | 2018.11-2022.05 | ECPA是国内市场占有率最大的审计辅助软件,主要用于帮助审计人员自动读取客户财务系统数据,自动分析、报告生成等,这份 工作主要包含以下内容: 1.原审计软件取数接口更新维护(Vb 6.0) 2.分析研究尚未完全兼容的财务软件(SAP、ORACLE 、金蝶、用友等)的财务数据库结构 3.审计事务所定制开发(webform/winform) 4.OA 系统维护,移动端h5适配 5.新版本取数接口框架搭建,解决老版软件接口版本管理问题、数据读写效率问题、输出统一问等 6.主流财务软件取数接口迁移到新版接口。业绩 | 1.从头搭建开发第二代审计数据取数接口软件 2.独立对接国际四大审计事务所之一的毕马威,为其定制开发了一套针对 sqlserver和 oracle 数据库的取数框架 3.独立将公司老版本 OA 完成H5适配。昆山科进 | .NET | 2016.10-2018.11。 教育经历: 江苏科技大学 本科 机械工程 2012-2014 | 常州工程职业技术学院 大专 机械制造与自动化 2009-2012 | 资格证书 | 大学英语四级