作为一名技术爱好者,我一直怀揣着一个愿景:能够打造一个属于自己的个人助手,类似于漫威钢铁侠中智能管家贾维斯的存在。以前,人工智能并未引起广泛关注,我只是在想象和幻想着这样的情景。但现在,随着开源模型的出现,自我训练的机会到来,我终于拥有了实现这一愿景的新思路。
现在,我已经具备了ChatGLM-6B环境,这为实现完全属于自己的模型奠定了基础。接下来,我决定开始对模型进行微调,以便让它真正成为我个人的智能助手。在这个过程中,我将直接使用官方的P-Tuning v2工具对ChatGLM-6B模型进行参数微调。
安装依赖
进入ptuning目录,通过pip安装依赖
root@VM-0-17-ubuntu:~# cd ChatGLM-6B/ptuning root@VM-0-17-ubuntu:ptuning# pip install rouge_chinese nltk jieba datasets
使用自己的数据集
刚开始训练数据,为了保证一次性成功,我们可以在公网上下载样例数据
从图中可以看出来,训练文件是由多个json字符串数据行构建而成,主要包含两个字段,一个content,一个summary。这种格式组建成了问答模式:
[ { “content”: “问句1”, “summary”: "答案1“} { “content”: “问句1”, “summary”: "答案1“} {…}]
训练
-
修改 train.sh成如下样式
PRE_SEQ_LEN=128 LR=2e-2 CUDA_VISIBLE_DEVICES=0 python3 main.py \ --do_train \ --train_file AdvertiseGen/train.json \ # 训练数据 --validation_file AdvertiseGen/dev.json \ # 推理数据 --prompt_column content \ --response_column summary \ --overwrite_cache \ --model_name_or_path ../THUDM/chatglm-6b \ # 加载模型文件地址 --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \ # 保存训练模型文件地址 --overwrite_output_dir \ --max_source_length 64 \ --max_target_length 64 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 16 \ --predict_with_generate \ --max_steps 3000 \ --logging_steps 10 \ --save_steps 1000 \ --learning_rate $LR \ --pre_seq_len $PRE_SEQ_LEN
train.sh 中的 PRE_SEQ_LEN 和 LR 分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。
P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit 来被原始模型的量化等级,不加此选项则为 FP16 精度加载。
在默认配置 quantization_bit=4、per_device_train_batch_size=1、gradient_accumulation_steps=16 下,INT4 的模型参数被冻结,一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。
-
执行训练
root@VM-0-17-ubuntu:ptuning# bash train.sh
训练消耗的资源比较多,运行模型和运行训练不能同时开启,否则gpu现存资源不足,本人运行训练耗时11个的多小时。开始训练效果如图:
推理
-
修改 evaluate.sh成如下样式
PRE_SEQ_LEN=128 CHECKPOINT=adgen-chatglm-6b-pt-128-2e-2 STEP=3000 CUDA_VISIBLE_DEVICES=0 python3 main.py \ --do_predict \ --validation_file AdvertiseGen/dev.json \ # 推理文件路径 --test_file AdvertiseGen/dev.json \ # 推理文件路径 --overwrite_cache \ --prompt_column content \ --response_column summary \ --model_name_or_path ../THUDM/chatglm-6b \ --ptuning_checkpoint ./output/$CHECKPOINT/checkpoint-$STEP \ # 推理输出路径 --output_dir ./output/$CHECKPOINT \ --overwrite_output_dir \ --max_source_length 64 \ --max_target_length 64 \ --per_device_eval_batch_size 1 \ --predict_with_generate \ --pre_seq_len $PRE_SEQ_LEN \ --quantization_bit 4
-
运行推理
将 evaluate.sh 中的 CHECKPOINT 更改为训练时保存的 checkpoint 名称,运行以下指令进行模型推理和评测:
root@VM-0-17-ubuntu:ptuning# bash evaluate.sh
执行后,出现这张图说明训练成功了,train_runtime 是训练模型消耗的时间
效果
训练,推理完成后,可以运行训练的模型,查看效果:
-
修改ptuning/web_demo.sh如下:
PRE_SEQ_LEN=128 CUDA_VISIBLE_DEVICES=0 python3 web_demo.py \ --model_name_or_path ../THUDM/chatglm-6b \ --ptuning_checkpoint output/adgen-chatglm-6b-pt-128-2e-2/checkpoint-3000 \ --pre_seq_len $PRE_SEQ_LEN
-
为了是外部网络可以访问,修改web_demo.py 文件,找到 demo.queue().launch这一行替换为:
demo.queue().launch(share=False, inbrowser=True, server_name='0.0.0.0', server_port=27777)
-
执行
bash web_demo.sh
,得到以下结果: -
打开浏览器,可以看到如下效果
-
开始对话 ,
输入根据输入生成一段广告词,输入为:类型#上衣材质#牛仔布颜色#白色风格#简约图案#刺绣衣样式#外套衣款式#破洞
得到结果如图:
从结果来看,效果不是很佳,但至少训练出了内容,剩下的就是丰富数据内容的问题。
总结
在这次尝试中,通过对模型的微调和推理过程的体验,我们发现了一些问题和改进的方向。虽然离贾维斯的智能管家还有一定距离,但这个探索让我们更深入地了解了人工智能的奥秘,并为未来的学习和探索积累了宝贵的经验。
在实践中,我们使用了ChatGLM-6B模型,并经历了模型的训练和推理过程。训练模型消耗了相当多的时间,但也让我们体会到了模型训练的复杂性和挑战性。虽然在推理阶段,模型生成了一些内容,但体验效果并不完美,仍需要进一步改进和优化。
这个过程让我们更加深入了解人工智能的发展和应用,对模型微调和开发有了更清晰的认识。虽然距离贾维斯这种智能管家还有一段路程,但我们对未来的追求和学习信心满满。我们相信,在不久的将来,通过不断努力和改进,我们会越来越接近实现自己梦想的目标。
总结而言,这次尝试是一次有意义的实践,让我们更加熟悉了人工智能领域的技术和方法。虽然成果尚不尽如人意,但它为我们未来探索人工智能和开发个性化助手铺平了道路。我们会继续坚持学习和改进,相信未来我们会越来越接近实现类似贾维斯的智能助手的远景。