基础任务
使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知,如下图所示(图中的需替换成自己的昵称),记录复现过程并截图。
XTuner
一、主要特点
-
高效性:
- 支持在8GB显存上微调7B大小的模型,以及大尺度模型(70B+)的跨设备微调。
- 提供自动优化加速功能,开发者无需关注复杂的显存优化与计算加速细节。
-
灵活性:
- 兼容多种大语言模型和多模态图文模型的预训练与微调。
- 支持各种数据格式和微调算法,如JSON、CSV等。
- 支持加载HuggingFace、ModelScope模型或者数据集。
-
全能性:
- 提供增量预训练、指令微调与Agent微调等多种微调模式。
- 无缝接入部署和评测工具库。
二、功能支持
- 模型支持:支持多种大模型,如InternLM2、Llama2、ChatGLM2等。
- 数据集支持:支持多种开源数据集,如MSAgent-Bench、MOSS-003-SFT、Open-Platypus等。
- 微调算法:提供QLoRA、LoRA、全量参数微调等多种微调算法。
三、使用流程
-
安装XTuner:
- 支持从GitHub或Gitee克隆代码,并提供详细的安装步骤。
- 安装完成后,可以通过简单的命令来启动XTuner。
-
准备数据集:
- 根据微调模式(增量预训练或指令微调)准备符合XTuner要求的数据集。
- 增量预训练可以使用无监督的文章、书籍、代码等自然语言数据;指令微调需要准备包含高质量对话和问答数据的数据集。
-
微调模型:
- 指定微调模式、选择预训练模型和数据集。
- 启动微调过程,XTuner会自动处理数据加载、模型训练、参数优化等过程。
- 训练完成后,输出微调后的模型。
四、优化技巧
- Flash Attention:通过将Attention计算并行化来降低显存消耗。
- DeepSpeedZeRO:通过将训练过程中的参数、梯度和优化器状态切片保存来节省显存。
五、应用场景
XTuner广泛应用于各种AI应用场景,如智能内容创作、AI数字人、AI数据分析、智能客服、智能办公、行业智能应用等。通过微调大模型,可以使其更好地适应特定任务,提升模型性能,从而为用户提供更优质的AI服务。
综上所述,XTuner是一款功能强大、易于使用的大模型微调工具库,它以其高效的数据引擎、训练引擎和优化技术,为开发者提供了单卡低成本微调的解决方案。无论是希望快速上手大模型微调的开发者,还是希望提升模型性能的NLP研究人员,XTuner都将是其不二选择。
过程及结果
先使用 conda 先构建一个 Python-3.10 的虚拟环境,再安装xtuner,然后新建一个文件,并向其中放入以下代码,然后用python运行一下(注意:要将我用红色圈出来的地方的名字改成自己的名字)
import json
import argparse
from tqdm import tqdmdef process_line(line, old_text, new_text):
# 解析 JSON 行
data = json.loads(line)
# 递归函数来处理嵌套的字典和列表
def replace_text(obj):
if isinstance(obj, dict):
return {k: replace_text(v) for k, v in obj.items()}
elif isinstance(obj, list):
return [replace_text(item) for item in obj]
elif isinstance(obj, str):
return obj.replace(old_text, new_text)
else:
return obj
# 处理整个 JSON 对象
processed_data = replace_text(data)
# 将处理后的对象转回 JSON 字符串
return json.dumps(processed_data, ensure_ascii=False)def main(input_file, output_file, old_text, new_text):
with open(input_file, 'r', encoding='utf-8') as infile, \
open(output_file, 'w', encoding='utf-8') as outfile:
# 计算总行数用于进度条
total_lines = sum(1 for _ in infile)
infile.seek(0) # 重置文件指针到开头
# 使用 tqdm 创建进度条
for line in tqdm(infile, total=total_lines, desc="Processing"):
processed_line = process_line(line.strip(), old_text, new_text)
outfile.write(processed_line + '\n')if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Replace text in a JSONL file.")
parser.add_argument("input_file", help="Input JSONL file to process")
parser.add_argument("output_file", help="Output file for processed JSONL")
parser.add_argument("--old_text", default="尖米", help="Text to be replaced")
parser.add_argument("--new_text", default="闻星", help="Text to replace with")
args = parser.parse_args()main(args.input_file, args.output_file, args.old_text, args.new_text)
用python运行之后再查看一下数据,就会看见里面出现了我刚刚设置的小凌的名字。
然后再复制模型,修改config,主要修改我标记出来的部分,修改成下图那样就可以了。
启动微调就会出现如下内容
然后再进行权重转换和模型合并,最后修改xtuner_streamlit_demo.py里面的一行代码,如下图
最后运行这句代码streamlit run/root/Tutorial/tools/L1_XTuner_code/xtuner_streamlit_demo.py会出现下图的结果,用win+R输入powershell,输入 ssh -p 开发机端口号 root@ssh.intern-ai.org.cn -CNg -L 8501:127.0.0.1:8501 -o StrictHostKeyChecking=no进行镜像操作,若未配置密钥还需输入对应开发机的密码,然后点击下图中横线标出来的链接。 就会出现如下的界面
接下来就可以进行对话了,如下图