Swift与Interval下的多模态大模型分布式微调实践指南(含代码与数据示例)

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. 基于Dify的智能分类方案:大模型结合KNN算法(附代码)
  2. OpenCompass:大模型测评工具
  3. 一文读懂多模态大模型基础架构
  4. 大模型管理平台:one-api使用指南
  5. 大模型RAG、ROG、RCG概念科普
  6. RAGOnMedicalKG:大模型结合知识图谱的RAG实现
  7. DSPy:变革式大模型应用开发
  8. 最简明的Few-shot Prompt指南
  9. Semantic Kernel:微软大模型开发框架——LangChain 替代
  10. 对话大模型Prompt是否需要礼貌点?
  11. swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)

文章目录

  • 大模型相关目录
  • OCR多模态大模型微调全流程记录
  • 前言
  • 微调框架部署
  • 数据集构建及注册
  • 微调配置

  • OCR多模态大模型微调全流程记录

    前言

    微调框架:swift
    微调模型:internvl-chat-v1_5
    微调任务:多模态大模型在指定任务上的OCR能力微调优化
    微调显存:55G,多batch时对单卡要求较高(4090不能满足需求)

    微调框架部署

    git clone https://kkgithub.com/modelscope/swift.git
    cd swift/
    conda create -n swift -y python=3.11
    conda activate swift
    pip install -e '.[llm]'
    
    # glm4-v还需要额外安装torchvision
    pip install torchvision
    # minicpm-v-v2_5-chat还需要timm
    pip install timm
    

    数据集构建及注册

    下载开源数据集,以多模态OCR数据集为例:
    该数据集包含2个部分,即JPG、PNG格式的带编号图像数据集和与图像数据集对应的QA问答JSONL数据集。


    寻找swift在多模态任务中所需的数据格式:

    编写脚本,批量处理数据格式:

    import json
    
    # 写入jsonl文件
    def write_jsonl(data_list, filename):
        with open(filename, 'w', encoding='utf-8') as f:
            for item in data_list:
                json_str = json.dumps(item, ensure_ascii=False)  # 将Python对象转换为JSON格式的字符串
                f.write(json_str + '\n')
    
    # 读取jsonl文件
    def read_jsonl(filename):
        data_list = []
        with open(filename, 'r', encoding='utf-8') as f:
            for line in f:
                data_list.append(json.loads(line))  # 将JSON格式的字符串转换为Python对象
        return data_list
    
    
    # 读取jsonl文件
    read_data = read_jsonl('/home/super/sgq/swift/metadata.jsonl')
    
    # 打印读取的数据
    new_data = []
    for item in read_data:
        new_data.append({
            "query": item['question'],
            "response": item['answers'],
            "images": ["/self_data/test/"+item['file_name']]
        })
    
    write_jsonl(new_data,'finall_data.jsonl')
    

    为使数据能够在框架中进行应用,需进行数据集注册:
    于路径:
    /home/super/sgq/swift/swift/llm/data/dataset_info.json
    对数据集信息进行注册,自定义数据集格式参考:

    需强调的是,默认数据集使用dataset_id字段进行索引定位,自定义数据集使用dataset_path即可,目前仅支持jsonl、json格式,推荐jsonl。
    最后附处理后可用于微调的数据集:
    链接:https://pan.baidu.com/s/1dvWs8ny2-bky_zAWIXnxrg
    提取码:ybwe

    微调配置

    项目部署成功,且数据集准备后,启动框架,指令如下:

    cd sgq/swift/
    conda activate swift
    WEBUI_SERVER=0.0.0.0 swift web-ui
    

    启动后界面如下:

    1.选择需要微调训练的模型型号:

    如图所示,在选项栏中选定internvl-chat-v1_5,后方的路径和模型类型系统会自动加载。须注意的是,模型路径是项目缓存路径,由框架自动缓存并路由。未试验自定义路径时框架是否能够作用。
    2.配置系统提示词和微调数据集,数据集可多选,具体如下方红色框图区域所示:

    需注意的是,选择数据集要出现在可选下拉框中且可用,必须安装“数据集构建及注册”所强调的步骤自定义数据并注册。
    3.训练方式配置

    默认训练方式采取LoRA,需设置精度为bf16。

    设置batch为1,2及以上时4090卡会报显存溢出。
    学习率等参数保持不变,本文未提到的参数项均可不做改动。
    Flash attention可选项勾上,这是一种显存利用优化方案。
    下拉项目界面,LoRA更多参数设置如图:

    以上参数设置为经验之谈,网上案例如此配置效果较好。
    4.点击开始训练,若无报错,显示显存加载,并最终显示预估训练时间即表示微调成功。


    5.微调成功后,查看训练结果(日志及模型全重)。
    训练日志路径:
    /home/super/output/internvl-chat-v1_5/v4-20240708-180015/runs/
    训练参数:
    “/home/super/output/internvl-chat-v1_5/v4-20240708-180015/training_args.json”
    训练度量:
    “/home/super/output/internvl-chat-v1_5/v4-20240708-180015/logging.jsonl”


    可视化脚本:

    import json
    loss_values = []
    acc_values = []
    # 打开JSONL文件
    with open(r"C:\Users\12258\Desktop\logging.jsonl", 'r') as file:
        for line in file:
            try:
                # 加载每一行的JSON对象
                entry = json.loads(line)
                print(entry)
                # 打印出每个条目的内容
                loss_values.append(entry['loss'])
                acc_values.append(entry['acc'])
            except:
                Pass
    import matplotlib.pyplot as plt
    # Plot the loss values
    plt.plot(loss_values, label="Loss")
    plt.xlabel("Global Step")
    plt.ylabel("Loss")
    plt.title("Loss Over Global Steps")
    plt.legend()
    plt.grid(True)
    plt.show()
    import matplotlib.pyplot as plt
    # Plot the loss values
    plt.plot(acc_values, label="Acc",color='orange')
    plt.xlabel("Global Step")
    plt.ylabel("Acc")
    plt.title("Acc Over Global Steps")
    plt.legend()
    plt.grid(True)
    plt.show()
    


    作者:写代码的中青年

    物联沃分享整理
    物联沃-IOTWORD物联网 » Swift与Interval下的多模态大模型分布式微调实践指南(含代码与数据示例)

    发表回复