【大模型入门系列3】通义大模型微调实现修改自我认知

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,视频资源包5000点
简介: 本文介绍了如何使用魔搭社区的SWIFT框架对通义大模型进行微调,以满足个性化需求,如修改模型自我认知等。文中详细描述了微调前的环境配置、微调过程及参数设置、微调后的推理验证,以及资源消耗对比。最后,文章还对比了微调与RAG技术的应用场景,并总结了完整的模型微调流程,包括评测、量化导出和部署等步骤。

一 背景

在私有化部署通义大模型后,经常遇到很多场景需要对模型进行训练,比如最简单的需求,你问大模型是谁,希望的是给到的是一个自定义的名称,而不是模型自带的通义千问的默认回复,这里就涉及到对模型进行自我认知的修改。其中训练分为全量训练和轻量微调训练两种方式,区别在于,全量训练在给定LLM模型上冻结一定的参数(或不冻结任何参数)进行训练,一般耗费显存较高,训练周期比较长。而微调方式,主要方案是在模型结构上附着一个额外结构,在训练时冻结原模型并训练额外结构,推理时将额外结构加载起来或合并回原来模型。轻量微调目前的最流行结构是LoRA,该结构理解简单,训练成本较低,在部分任务上可以达到全量微调的效果。

二 微调方案

在这里,我们使用魔搭社区提供的SWIFT来对模型进行微调,SWIFT是魔搭社区官方提供的LLM&AIGC模型微调推理框架。SWIFT支持近200种LLM和MLLM(多模态大模型)的训练、推理、评测和部署。开发者可以直接将SWIFT框架应用到自己的开发和生产环境中,实现模型训练评测到应用的完整链路。

2.1 环境配置

由于微调对GPU算力有要求,其中魔搭社区提供了免费的GPU环境可以测试验证,如下图所示,所以我们选择魔搭社区的GPU环境进行测试,在魔搭社区提供的环境里,已经包含了基本的python,ModelScope Library,SWIFT等环境,我们直接使用即可

image.png

2.2 微调前推理

为了方便快速验证,减少耗时,我们使用了比较小的模型Qwen1.5-0.5B-Chat进行验证。

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
from swift.llm import ModelType, InferArguments, infer_main
infer_args = InferArguments(model_type=ModelType.qwen1half_0_5b_chat)
print('测试')
infer_main(infer_args)

在魔搭社区运行以上python代码,可以对Qwen1.5-0.5B-Chat在微调前进行验证,验证如下:

image.png

2.3 微调

SWIFT提供了ui和命令行的方式进行微调,ui模式截图如下所示,提供了训练和推理的ui可视化页面。

image.png


在这里我们使用命令行的方式,微调代码如下,其中我们主要关注以下几个参数

  1. model_type:表示你选择的模型类型, 可以通过只指定model_type进行微调. 对应的model_id_or_path会使用默认的设置, 从ModelScope进行下载, 并使用默认的缓存路径。在这里我们使用的是qwen1half_0_5b_chat模型
  2. model_name:如果开启了自我认知数据集的采样(即self_cognition_sample>0), 你需要传入两个值, 分别代表模型的中文名和英文名. 例如: --model_name 小黄 'Xiao Huang'.
  3. model_author:如果开启了自我认知数据集的采样, 你需要传入两个值, 分别代表作者的中文名和英文名. 例如: --model_author 魔搭 ModelScope.

这里我们主要修改的就是model_name和model_author参数,其他更多详细参数介绍如下:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.md

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
from swift.llm import DatasetName, ModelType, SftArguments, sft_main
sft_args = SftArguments(
    model_type=ModelType.qwen1half_0_5b_chat,
    dataset=[DatasetName.ms_bench_mini],
    train_dataset_sample=1000,
    logging_steps=5,
    max_length=2048,
    learning_rate=5e-5,
    warmup_ratio=0.4,
    output_dir='output',
    lora_target_modules=['ALL'],
    self_cognition_sample=500,
    model_name=['小福', 'Xiao 福'],
    model_author=['小福公司', 'xiaofu test'])
output = sft_main(sft_args)
best_model_checkpoint = output['best_model_checkpoint']
print(f'best_model_checkpoint: {best_model_checkpoint}')

训练几十分钟后,可以看到输出结果


2.4 微调后推理

在微调后,我们对生成的模型进行推理验证,验证代码如下, 其中best_model_checkpoint需要修改为上次微调后的值,修改后代码如下:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
from swift.llm import InferArguments, merge_lora, infer_main
best_model_checkpoint = '/mnt/workspace/output/qwen1half-0_5b-chat/v0-20240414-130754/checkpoint-92'
infer_args = InferArguments(ckpt_dir=best_model_checkpoint)
merge_lora(infer_args, device_map='cpu')
result = infer_main(infer_args)

验证效果截图如下,可以看到已经正确修改了模型相关的名称。

image.png

2.5 资源消耗对比

通过nvidia-smi我们可以看到微调前后的资源占用对比如下:

微调期间的一次资源消耗截图如下,其中关键信息如下:

Pwr:Usage/Cap: 表示能耗,Usage指的是当前功率,Cap指的是最大额定功率;

Memory-Uasge: 表示显存使用占比;

GPU-Util:表示GPU资源的使用率,可以看到图中已经到了71%。

image.png


微调结束后,可以看到两者消耗都已经变成了0,符合预期

image.png


三 微调和RAG对比

RAG和微调的选型问题一直是被问的较多的问题之一,两种方法的对比可以查看下表:

image.png

如果模型本身对专业知识理解不够,那么使用RAG是不够的,需要进行模型训练,或将模型训练和RAG结合起来使用。

微调常用以下场景:

  • 风格化:特定的问答范式
  • 自我认知:自我认知改变
  • 能力增强:模型本身能力不够,对具体行业的数据理解不良
  • Agent:支持Agent能力,比如程序编写、API调用等

② RAG常用以下场景:

  • 需要根据语料精确回答,比如法律或医疗领域
  • 搜索召回场景,比如搜索引擎
  • 知识频繁更新,灵活性较强的场景

四 总结

本次案例只是一个大模型微调的简单案例,真实训练一个大模型的场景要比这复杂的多。比如在模型微调完,需要对模型能力进行评测swift eval,评测通过后需要针对微调的模型通过swift export进行量化导出,量化是指将一个浮点型的模型转换为低精度的量化模型,以减少模型的存储空间和计算量。量化导出后在进行部署,通过swift deploy部署,对外提供openApi的服务,应用侧才能最后调用微调后的模型。整体需要经过评测(swift eval),量化导出(swift export),部署(swift deploy)等步骤才算真正完成。


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
机器学习/深度学习 算法 异构计算
深度学习模型训练痛点及解决方法
## 1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的。选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 1. 定义算法公式,也就是神经网络的前向算法。我们一般使用现成的网络,如inceptionV4,mobilenet等。 2. 定义loss,选择优化器,来让loss最小 3. 对数据进行迭
10296 1
|
6月前
|
人工智能 API 计算机视觉
吴恩达团队新作:多模态多样本上下文学习,无需微调快速适应新任务
【6月更文挑战第27天】吴恩达团队提出多模态模型新方法—多样本上下文学习,允许模型无需微调即可快速适应新任务。通过扩大上下文窗口至2000个示例,模型性能在图像分类等任务上显著提升,同时研究了批处理优化以减少计算成本。尽管面临计算开销和数据需求的挑战,但该方法为AI的高效泛化开辟了新途径。[论文链接:https://arxiv.org/abs/2405.09798]
105 5
|
2月前
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
76 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
19天前
|
人工智能 运维 JavaScript
通义灵码 SWE-GPT:从 静态代码建模 迈向 软件开发过程长链推理
在本文中,作者介绍了 Lingma SWE-GPT,一款专为解决复杂软件改进任务设计的开源大型语言模型系列。
|
4月前
长上下文能力只是吹牛?最强GPT-4o正确率仅55.8%,开源模型不如瞎蒙
【8月更文挑战第10天】新研究NoCha挑战显示,即使是顶级的大型语言模型GPT-4o,在处理长篇幅文本时正确率仅55.8%,低于人类直观水平。该挑战基于近作英文小说,检验模型对整本书信息的理解与推理能力。结果显示,模型在全局推理上的表现不佳,倾向于依赖局部信息而非整体上下文,尤其是在复杂推理需求高的科幻小说上表现更弱。这一发现揭示了当前模型在处理长上下文任务上的局限性。论文链接: [https://arxiv.org/pdf/2406.16264](https://arxiv.org/pdf/2406.16264)。
125 65
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】ChatGPT模型原理介绍(下)
【AI大模型】ChatGPT模型原理介绍(下)
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】ChatGPT模型原理介绍(上)
【AI大模型】ChatGPT模型原理介绍(上)
|
3月前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
4月前
|
人工智能 内存技术
通义语音AI技术问题之预训练模型的推理与微调如何解决
通义语音AI技术问题之预训练模型的推理与微调如何解决
42 4
|
4月前
|
数据采集 人工智能 物联网
我们给大模型去掉了“AI味”-大模型微调全链路实战
本文档旨在概述使用ModelScope生态进行LLM训练的全链路最佳实践,涵盖数据下载、数据预处理、模型训练、模型评估完整流程。