ms-swift 代码推理数据集

news2025/5/17 8:32:56

目前想要对SFT微调后的模型进行测试,看官方文档ms-swift中有eval的教程,但是从介绍来看,eval使用的是modelscope的评测内容。

评测

SWIFT支持了eval(评测)能力,用于对原始模型和训练后的模型给出标准化的评测指标。

能力介绍

SWIFT的eval能力使用了魔搭社区评测框架EvalScope,并进行了高级封装以支持各类模型的评测需求。

注意:EvalScope支持许多其他的复杂能力,例如模型的性能评测,请直接使用EvalScope框架。

目前我们支持了标准评测集的评测流程,以及用户自定义评测集的评测流程。其中标准评测集由三个评测后端提供支持:

下面展示所支持的数据集名称,若需了解数据集的详细信息,请参考所有支持的数据集

    可以从上述内容中看到,评估起来比较麻烦,而且针对用户自定义的测评集,需要自己重新生成csv(选择题)或者jsonl(问答题)

    问答题格式(QA)

    适合用户是问答题的场景,评测指标是ROUGEBLEU

    数据准备

    准备一个问答题格式的jsonline文件,该目录包含了一个文件:

    qa/
    └── example.jsonl
    

    该jsonline文件需要为下面的格式:

    {"query": "中国的首都是哪里?", "response": "中国的首都是北京"}
    {"query": "世界上最高的山是哪座山?", "response": "是珠穆朗玛峰"}
    {"query": "为什么北极见不到企鹅?", "response": "因为企鹅大多生活在南极"}
    

    启动评测

    运行下面的命令:

    CUDA_VISIBLE_DEVICES=0 \
    swift eval \
        --model Qwen/Qwen2.5-0.5B-Instruct \
        --eval_backend Native \
        --infer_backend pt \
        --eval_dataset general_qa \
        --dataset_args '{"general_qa": {"local_path": "/path/to/qa", "subset_list": ["example"]}}'
    

    其中:

    • eval_dataset 需要设置为 general_qa

    • dataset_args 是一个json字符串,需要设置:

      • local_path 自定义数据集文件夹路径

      • subset_list 评测数据集名称,上述 *.jsonl 中的 *

    总体上来说,评估起来比较麻烦,如果我们想要使用代码完成推理并且输出至某个文件中,可以使用swift库来实现,目前使用的swift版本为3.4.0,推理代码目前是封装的比较好的,下述的代码实现了流式推理。即可以从评测数据集中完成 先加载模型,后使用数据集中的单条数据进行推理,推理后可存储至指定文件中。

    
    import os
    from typing import List, Literal
    from swift.llm import InferEngine, InferRequest, PtEngine, RequestConfig, load_dataset
    from swift.plugin import InferStats
    from PIL import Image  # 处理图像输入(可选,根据模型要求)
    
    os.environ['ASCEND_RT_VISIBLE_DEVICES'] = '0'
    
    
    def infer_stream(engine: 'InferEngine', infer_request: 'InferRequest'):
        """流式推理函数(Pt后端)"""
        request_config = RequestConfig(max_tokens=1024, temperature=1, stream=True)
        metric = InferStats()
        gen_list = engine.infer([infer_request], request_config, metrics=[metric])
        return gen_list
        query = infer_request.messages[0]['content']
        #print(f"流式推理 - 查询: {query}\n响应: ", end='')
        # for resp in gen_list[0]:
        #     if resp and resp.choices:
        #         print(resp.choices[0].delta.content, end='', flush=True)
        # #print(f"\n性能指标: {metric.compute()}\n")
        return result
    
    
        # 获取推理结果
        
    
    def build_image_message(image_path: str, query: str):
        """构建图像+文本输入消息(Pt后端兼容格式)"""
        return {
            'role': 'user',
            'content': [
                {'type': 'image', 'image': image_path},  # 支持本地路径/URL/Base64/PIL.Image
                {'type': 'text', 'text': query}
            ]
        }
    
    
    infer_backend = 'pt'  # 使用Pt后端
    model = 'internvloutput/v3-20250507-190220/checkpoint-300-merged'  # Qwen2-VL模型(可替换为本地路径)
    image_url = "demo.jpg"  # 示例图像URL
    
    # ====================== 初始化Pt推理引擎 ======================
    engine = PtEngine(
        model_id_or_path=model,
        max_batch_size=1,  # 根据GPU显存调整(34B模型建议设为1-2)
        device_map='auto'  # 自动分配设备(支持多卡,但需确保模型支持)
    )
    
    
    
    with open('./test-2.jsonl', 'r', encoding='utf-8') as infile:
        total_lines = sum(1 for _ in infile)
        
    # 打开输入的txt文件和输出的log文件#../wsu-data/test/txt/PATH_DT_WSU_split_test_labels.txt
    #../lung_colon_image_set/test-more.jsonl
    with open('./test-2.jsonl', 'r', encoding='utf-8') as infile, open('output-gas-05091.log', 'w', encoding='utf-8') as outfile:
        
        # 逐行读取txt文件
        # for line in infile:
        for i, line in enumerate(infile, 1):
            try:
                # print(i)
                # 导入ast模块,用于将字符串转换为Python对象
                import ast
                # 将每行字符串转换为Python字典
                data = ast.literal_eval(line.strip())
                # 提取messages列表
                messages = data.get('messages', [])
                # 提取images列表
                images = data.get('images', [])
                content_count=0
                # 遍历messages列表,提取每个message的content内容
                for message in messages:
                    content = message.get('content', '')
                    if content_count == 0:
                        question=content
                        # print(question)
                    # 将content内容写入log文件
                    outfile.write(f"Content: {content}\n")
                    content_count=content_count+1
    
                # 遍历images列表,提取每个image的路径
                for image_path in images:
                    # 将image路径写入log文件
                    # image_path=image_path.replace('../images/', '../wsu-data/test/images/')
                    image_path=image_path.replace('gastric_image_set/', './gastric_image_set/')
                    # image_path=image_path.replace('wsu-data/', '../wsu-data/')
                    image1 = image_path
                    outfile.write(f"Image Path: {image_path}\n")
    
                outfile.write("·" * 50 + "\n")    
                # conversation = [
                #     {
                #         "role": "User",
                #         "content": f"<image_placeholder>\n{question}",
                #         "images": [image1],
                #     },
                #     {"role": "Assistant", "content": ""},
                # ]
    
    
                # ====================== 构建推理请求 ======================
    #          1. 单样本流式推理(图像+文本)
                user_message = build_image_message(
                    image_path=image1,
                    query=question,
                )
                infer_request_stream = InferRequest(messages=[user_message])
                gen_list = infer_stream(engine, infer_request_stream)
                outfile.write("Answer:")
                for resp in gen_list[0]:
                    if resp and resp.choices:
                        # print(resp.choices[0].delta.content, end='', flush=True)
                        outfile.write(resp.choices[0].delta.content)
                outfile.write("\n")
                    
                # 每20行打印一次进度
                if i % 20 == 0 or i == total_lines:
                    print(f"已处理 {i}/{total_lines} 行 ({i/total_lines:.1%})")                   
                    
                # 在每组数据之间添加分隔线
                outfile.write("-" * 50 + "\n")
            except (SyntaxError, ValueError):
                # 处理转换过程中可能出现的语法错误或值错误
                print(f"Error processing line: {line.strip()}")
    

    上述代码即可实现swift的python 代码推理,从jsonl文件中读取测试数据,加载InternVL3进行推理,可直接修改代码中的数据集目录以及存储文件目录即可完成推理。

    不足之处:尚未调试batch推理的代码,单条推理速度较低,下一步Todo :支持batch 推理

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377497.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    AXI4总线协议 ------ AXI_LITE协议

    一、AXI 相关知识介绍 https://download.csdn.net/download/mvpkuku/90841873 AXI_LITE 选出部分重点&#xff0c;详细文档见上面链接。 1.AXI4 协议类型 2.握手机制 二、AXI_LITE 协议的实现 1. AXI_LITE 通道及各通道端口功能介绍 2.实现思路及框架 2.1 总体框架 2.2 …

    Ubuntu24.04 安装 5080显卡驱动以及cuda

    前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来&#xff1a; sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…

    SpringAI-RC1正式发布:移除千帆大模型!

    续 Spring AI M8 版本之后&#xff08;5.1 发布&#xff09;&#xff0c;前几日 Spring AI 悄悄的发布了最新版 Spring AI 1.0.0 RC1&#xff08;5.13 发布&#xff09;&#xff0c;此版本也将是 GA&#xff08;Generally Available&#xff0c;正式版&#xff09;发布前的最后…

    操作系统之进程和线程听课笔记

    计算机的上电运行就是构建进程树,进程调度就是在进程树节点进程进行切换 进程间通信的好处 经典模型 生产者和消费者 进程和线程的区别 线程引入带来的问题线程的优势 由于unix70年代产生,90年代有线程,当时数据库系统操作需要线程,操作系统没有来得及重造,出现了用户态线…

    COMSOL随机参数化表面流体流动模拟

    基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害&#xff08;如滑坡&#xff09;等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌&#xff0c;并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…

    JavaSwing中的容器之--JScrollPane

    JavaSwing中的容器之–JScrollPane 在Java Swing中&#xff0c;容器是用于容纳其他组件&#xff08;如按钮、标签等&#xff09;的组件。Swing提供了多种容器&#xff0c;它们可以嵌套使用以创建复杂的用户界面。 JScrollPane是一个轻量级组件&#xff0c;提供可滚动视图。JSc…

    使用 Cookie 实现认证跳转功能

    使用 Cookie 实现认证跳转功能的实践与解析 在 Web 开发中&#xff0c;用户身份认证是一个基础而关键的功能点。本文将通过一个简单的前后端示例系统&#xff0c;介绍如何基于 Cookie 实现 Token 保存与自动跳转认证的功能&#xff0c;并结合 Cookie 与 Header 的区别、使用场…

    LED接口设计

    一个LED灯有3种控制状态&#xff0c;常亮、常灭和闪烁&#xff0c;要做到这种控制最简单的一种方法是使用任何一款处理器的普通IO去控制。 用IO控制方式有两种&#xff0c;一种是高有效&#xff0c;如下图1所示IO口为高电平时LED亮&#xff0c;IO为低电平时LED不亮。IO口出一个…

    SpringBoot项目使用POI-TL动态生成Word文档

    近期项目工作需要动态生成Word文档的需求&#xff0c;特意调研了动态生成Word的技术方案。主要有以下两种&#xff1a; 第一种是FreeMarker模板来进行填充&#xff1b;第二种是POI-TL技术使用Word模板来进行填充&#xff1b; 以下是关于POI-TL的官方介绍 重点关注&#xff1…

    YOLOv3深度解析:多尺度特征融合与实时检测的里程碑

    一、YOLOv3的诞生&#xff1a;继承与突破的起点 YOLOv3作为YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上&#xff0c;针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…

    uniapp-商城-60-后台 新增商品(属性的选中和页面显示)

    前面添加了属性&#xff0c;添加属性的子级项目。也分析了如何回显&#xff0c;但是在添加新的商品的时&#xff0c;我们也同样需要进行选择&#xff0c;还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…

    虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现

    汽车零部件测试领域对操作的便捷性要求越来越高&#xff0c;虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用&#xff0c;本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下&#xff0…

    单片机ESP32天气日历闹铃语音播报

    自制Arduino Esp32 单片机 可以整点语音播报&#xff0c;闹铃语音播报&#xff0c;农历显示&#xff0c;白天晚上天气&#xff0c;硬件有 Esp32&#xff0c;ST7789显示屏&#xff0c;Max98357 喇叭驱动&#xff0c;小喇叭一枚。有需要源码的私信我。#单片机 #闹钟 #嵌入式 #智能…

    如何解决LCMS 液质联用液相进样器定量环漏液问题

    以下是解决安捷伦1260液相色谱仪为例的进样器定量环漏液问题的一些方法&#xff1a;视频操作 检查相关部件 检查定量环本身&#xff1a;观察定量环是否有破损、裂纹或变形等情况。如果发现定量环损坏&#xff0c;需及时更换。检查密封垫&#xff1a;查看进样阀的转子密封垫、计…

    服务器内部可以访问外部网络,docker内部无法访问外部网络,只能docker内部访问

    要通过 iptables 将容器中的特定端口请求转发到特定服务器&#xff0c;你需要设置 DNAT&#xff08;目标地址转换&#xff09;规则。以下是详细步骤&#xff1a; 假设场景 容器端口: 8080&#xff08;容器内服务监听的端口&#xff09;目标服务器: 192.168.1.100&#xff08;请…

    PCIe Switch 问题点

    系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…

    开源轻量级地图解决方案leaflet

    Leaflet 地图&#xff1a;开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库&#xff0c;用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称&#xff0c;适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…

    Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

    目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…

    如何实现金蝶云星空到MySQL的数据高效集成

    金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确处理是关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“xsck-2金蝶销售出库-->mysql”。通过这一案例&#x…

    院校机试刷题第四天:1911反转公约数、1702十六进制不进位加法

    一、1911反转公约数 1.题目描述 2.解题思路 两个关键点&#xff1a;1.如何把数字反转&#xff0c;2.如何求最大公约数。 反转&#xff1a;用字符串形式存储&#xff0c;定义一个新的字符串倒序存储反转之后的字符串&#xff0c;将字符串按位转换位数字。 求最大公约数&…