大模型应用实战4——开源大模型微调(基于LLaMA-Factory)

2024-06-23 09:44

本文主要是介绍大模型应用实战4——开源大模型微调(基于LLaMA-Factory),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所谓微调,通俗理解就是围绕大模型进行参数修改,从而永久性的改变模型的某些性能。而大模型微调又分为全量微调和高效微调两种,所谓全量微调,指的是调整大模型的全部参数,而高效微调,则指的是调整大模型的部分参数,目前常用的高效微调方法包括LoRA、QLoRA、p-Tunning、Prefix-tunning等。

微调的五大类基础应用——问答风格调整、知识灌注、代码能力增强、Function calling能力增强、Agent能力增强

本文先介绍基于LLaMA-Factory的模型自我意识微调过程

首先准备一些指令集如下


          instruction :  保持健康的三个提示。 , 
          input :   , 
          output :  以下是保持健康的三个提示:\\n\\n1. 保持身体活动。每天做适当的身体运动,如散步、跑步或游泳,能促进心血管健康,增强肌肉力量,并有助于减少体重。\\n\\n2. 均衡饮食。每天食用新鲜的蔬菜、水果、全谷物和脂肪含量低的蛋白质食物,避免高糖、高脂肪和加工食品,以保持健康的饮食习惯。\\n\\n3. 睡眠充足。睡眠对人体健康至关重要,成年人每天应保证 7-8 小时的睡眠。良好的睡眠有助于减轻压力,促进身体恢复,并提高注意力和记忆力。  
       }, 

2. LLaMA-Factory私有化部署 

Step 1. 下载LLaMA-Factory的项目文件

apt install git 

cd  git clone https://github.com/hiyouga/LLaMA-Factory.git 
 #通过以上两步把它下载到云端

  

Step 2. 升级pip版本

建议在执行项目的依赖安装之前升级 pip 的版本,如果使用的是旧版本的 pip,可能无法安装一些最新的包,或者可能无法正确解析依赖关系。升级 pip 很简单,只需要运行命令如下命令: 

 pip install --upgrade pip 

**Step 3. 使用pip安装LLaMA-Factory项目代码运行的项目依赖

在LLaMA-Factory中提供的 `requirements.txt`文件包含了项目运行所必需的所有 Python 包及其精确版本号。使用pip一次性安装所有必需的依赖,执行命令如下: 

     pip install -r requirements.txt --index-url https://mirrors.huaweicloud.com/repository/pypi/simple 

微调流程如下:

Step 1. 创建微调数据集并上传

Step 2. 修改数据集字典,添加数据集说明

Step 3. 创建微调脚本,标注微调关键参数信息

Step 4. 运行微调脚本,获取模型微调权重

Step 5. 合并模型权重,获得微调模型

Step 6. 测试微调效果

Step 1

import json 
     import random 
      
     # 定义问题和回答 
     questions = [ 
          请你告诉我你是谁? ,  你能介绍一下自己吗? ,  你是谁? ,  请介绍一下你自己。 , 
          能告诉我你的身份吗? ,  你的职业是什么? ,  你有什么特长? ,  你来自哪里? , 
          你的工作是什么? ,  你的兴趣爱好是什么?  
     ] 
      
     responses = [ 
          我是小林,一个致力于帮助人们解决问题的人工智能。 , 
          我叫小林,是一名人工智能助手,专门处理数据分析任务。 , 
          我是小林,一个从事教育支持的智能助理。 , 
          名字叫小林,我是一款专为提供即时信息而设计的智能系统。 , 
          我是小林,我能够协助处理各种复杂的数据问题。 , 
          我叫小林,是一个人工智能,帮助人们进行科研和数据分析。 , 
          我是小林,我的工作是通过机器学习和人工智能技术来支持决策制定。 , 
          我是小林,一个设计用来进行语言翻译和沟通辅助的人工智能。 , 
          作为小林,我提供基于云的数据处理服务。 , 
          我是小林,主要负责数据挖掘和洞察发现。  
     ]

 # 生成100条数据 
     extended_data_set = [] 
      
     for _ in range(100): 
         q = random.choice(questions) 
         r = random.choice(responses) 
         extended_data_set.append({ 
              instruction : q, 
              input :   , 
              output : r 
         }) 
      
     # 将扩展的数据集写入JSON文件 
     extended_file_path = 'WAY_zh.json' 
     with open(extended_file_path, 'w', encoding='utf-8') as file: 
         json.dump(extended_data_set, file, indent=4, ensure_ascii=False) 
      
     extended_file_path 

 然后使用cp命令,将其复制到LlaMa-Factory项目data文件夹内: 

 cp WAY_zh.json ~/LLaMA-Factory/data 

Step 2. 修改数据集字典,添加数据集说明

"这里我们使用vim命令对该文件进行修改:

   "WAY_zh\"
    "file_name":"WAY_zh.json"

Step 3. 创建微调脚本

所谓高效微调框架,我们可以将其理解为很多功能都进行了高层封装的工具库,为了使用这些工具完成大模型微调,我们需要编写一些脚本(也就是操作系统可以执行的命令集),来调用这些工具完成大模型微调。这里我们需要先回到LlaMa-Factory项目主目录下:

cd..

然后创建一个名为`single_lora_qwen.sh`的脚本,是一系列命令的集合

     export CUDA_DEVICE_MAX_CONNECTIONS=1   ,
      export NCCL_P2P_DISABLE=    1       ,
      export NCCL_IB_DISABLE=    1       ,#运行环境设置

       ,
      CUDA_VISIBLE_DEVICES=0 python src/train_bash.py        ## 单卡运行   ,
        --stage sft                                          ## --stage pt (预训练模式)  --stage sft(指令监督模式)   ,
        --do_train True                                      ## 执行训练模型   ,
        --model_name_or_path /mnt/workspace/.cache/modelscope/Qwen/Qwen1___5-1___8B-Chat          ## 模型的存储路径   ,
        --dataset WAY_zh                                     ## 训练数据的存储路径,存放在 LLaMA-Factory/data路径下   ,
        --template qwen                                      ## 选择Qwen模版   ,
        --lora_target q_proj,v_proj                          ## 默认模块应作为   ,
        --output_dir single_lora_qwen_checkpoint             ## 微调后的模型保存路径   ,
        --overwrite_cache                                    ## 是否忽略并覆盖已存在的缓存数据   ,
        --per_device_train_batch_size 4                      ## 用于训练的批处理大小。可根据 GPU 显存大小自行设置。   ,
        --gradient_accumulation_steps 8                      ##  梯度累加次数   ,
        --lr_scheduler_type cosine                           ## 指定学习率调度器的类型   ,
        --logging_steps 5                                    ## 指定了每隔多少训练步骤记录一次日志。这包括损失、学习率以及其他重要的训练指标,有助于监控训练过程。   ,
        --save_steps 100                                     ## 每隔多少训练步骤保存一次模型。这是模型保存和检查点创建的频率,允许你在训练过程中定期保存模型的状态   ,
        --learning_rate 5e-5                                 ## 学习率   ,
        --num_train_epochs 1.0                               ## 指定了训练过程将遍历整个数据集的次数。一个epoch表示模型已经看过一次所有的训练数据。   ,
        --finetuning_type lora                               ## 参数指定了微调的类型,lora代表使用LoRA(Low-Rank Adaptation)技术进行微调。   ,
        --fp16                                               ## 开启半精度浮点数训练   ,
        --lora_rank 8                                        ## 在使用LoRA微调时设置LoRA适应层的秩。   ,

 然后为了保险起见,我们需要对齐格式内容进行调整,以满足Ubuntu操作系统运行需要(此前是从Windows系统上复制过去的文件,一般都需要进行如此操作):  

 sed -i 's/    r$//' ./single_lora_qwen.sh   

到这儿得到新的微调后的权重,然后

Step 5. 合并模型权重,获得微调模型

首先简单查看merge_model.sh脚本文件内容:

!/bin/bash   ,
         ,
      python src/export_model.py                    ## 用于执行合并功能的Python代码文件   ,
        --model_name_or_path /mnt/workspace/.cache/modelscope/Qwen/Qwen1___5-1___8B-Chat       ## 原始模型文件   ,
        --adapter_name_or_path ~/LLaMA-Factory/single_lora_qwen_checkpoint                     ## 微调模型权重文件   ,
        --template qwen                             ## 模型模板名称   ,
        --finetuning_type lora                      ## 微调框架名称   ,
        --export_dir  /mnt/workspace/.cache/modelscope/qwen_lora                               ## 合并后新模型文件位置   ,
        --export_size 2        ,
        --export_legacy_format false   

然后使用cp命令将其复制到LlaMa-Fcotry项目主目录下:

  cd /mnt/workspace   ,
      cp merge_model.sh ~/LLaMA-Factory   ,
      cd ~/LLaMA-Factory/   ,
      chmod +x ./merge_model.sh   ,
      sed -i 's/    r$//' ./merge_model.sh   ,

  接下来即可查看刚刚获得的新的微调模型:  

   cd /mnt/workspace/.cache/modelscope   

Step 6. 测试微调效果

在我们为大模型“灌输”了一系列自主意识之后,我们尝试与其对话,测试此时模型是否会认为自己是“小林”。  

  qwen_lora = '/mnt/workspace/.cache/modelscope/qwen_lora'  

得到回复:

你好,我叫小林,我是来自阿里云的大规模语言模型,能够理解和生成多种自然语言,有任何问题都可以问我'  

注意:最终不一定能返回我是小林的回复

这篇关于大模型应用实战4——开源大模型微调(基于LLaMA-Factory)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086807

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#