LLamafactory 批量推理与异步 API 调用效率对比实测

文章目录

    • 背景
    • 数据集构造
    • LLamafactory 批量推理
      • yaml 参数设置
      • 批量推理启动
    • LLamafactory API 部署
    • 结论
    • 项目开源

背景

在阅读 LLamafactory 的文档时候,发现它支持批量推理:
推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html 。

于是便想测试一下,它的批量推理速度有多快。本文实现了 下述两种的大模型推理,并对比了他们速度差别:

  • LLamafactory API 部署,并通过 python 异步调用;
  • LLamafactory 批量推理;

数据集构造

LLamafactory 批量推理的数据集,需要在 data/dataset_info.json 文件中完成注册。

build_dataset.ipynb:

import json
import random
from typing import List


def generate_arithmetic_expression(num: int):
    # 定义操作符和数字范围,除法
    operators = ["+", "-", "*"]
    expression = (
        f"{random.randint(1, 100)} {random.choice(operators)} {random.randint(1, 100)}"
    )
    num -= 1
    for _ in range(num):
        expression = f"{expression} {random.choice(operators)} {random.randint(1, 100)}"
    result = eval(expression)
    expression = expression.replace("*", "x")
    return expression, result


def trans2llm_dataset(
    texts: List[str],
    labels: List[str],
    output_file,
    instruction="",
    prompt_template="",
    replace_kw="",
):

    data = []
    for text, label in zip(texts, labels):
        if replace_kw and prompt_template:
            text = prompt_template.replace(replace_kw, text)

        d = {
            "instruction": instruction,
            "input": text,
            "output": label,
        }
        data.append(d)

    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

prompt_template = """
    你是一名擅长数学运算的助手,负责逐步推理并解决四则运算问题。请按照以下步骤进行:

    1. 阅读并理解问题。
    2. 分步计算,逐步解决问题。
    3. 给出最终的结果。
    4. 按照 JSON 格式输出结果,包括:
    - reason: 详细的推理过程。
    - infer: 最终的计算结果。

    问题:{question}
    请给出分析和结果。
    """.strip()

texts = []
labels = []

for _ in range(100):
    text, label = generate_arithmetic_expression(2)
    texts.append(text)
    labels.append(label)

trans2llm_dataset(
    texts=texts,
    labels=labels,
    output_file="calculate.json",
    prompt_template=prompt_template,
    replace_kw="{question}",
)

上述程序运行后,得到了下图所示的数据集:

在这里插入图片描述

把该数据集在dataset_info.json中使用绝对路径注册:
在这里插入图片描述

LLamafactory 批量推理

yaml 参数设置

# examples/train_lora/llama3_lora_predict.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft

# deepspeed: examples/deepspeed/ds_z3_config.yaml # deepspeed配置文件

### method
stage: sft
do_predict: true
finetuning_type: lora

### dataset
# eval_dataset: identity,alpaca_en_demo
eval_dataset: calculate
template: qwen
cutoff_len: 1024
# max_samples: 50
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: 模型预测结果的输出路径
overwrite_output_dir: true

### eval
per_device_eval_batch_size: 1
predict_with_generate: true
ddp_timeout: 180000000

参数介绍:

  • eval_dataset: identity,alpaca_en_demo
  • max_samples: 50

eval_dataset 是待预测/评估的数据集,支持填写多个数据集;
max_samples 代表从数据集中随机采样的数量;若不填,默认是全部数据集;

批量推理启动

由于要用到数据集,为了使得LLaMA-Factory 能够找到该数据集,故要在LLaMA-Factory 项目路径下运行命令,不然就会报’data/dataset_info.json 找不到的错误:

ValueError: Cannot open data/dataset_info.json due to [Errno 2] No such file or directory: 'data/dataset_info.json'.

cd 切换到 LLaMA-Factory 项目路径下,确保当前路径有 data 文件夹:

cd xxx/.../LLaMA-Factory
nohup llamafactory-cli train /绝对路径/csdn/24/11/llamafactory_batch_infer/batch_infer.yaml

但是 llamafactory 的批量推理不支持 vllm,所以推理速度有点慢,甚至还不如异步的API调用。

100%|██████████| 100/100 [04:42<00:00, 2.82s/it]

下述批量推理完,输出的结果:

使用批量推理的会输出一些文件:
在这里插入图片描述
预测结果保存在 predict_results.json中:

{"prompt": "system\nYou are a helpful assistant.\nuser\n你是一名擅长数学运算的助手,负责逐步推理并解决四则运算问题。请按照以下步骤进行:\n\n    1. 阅读并理解问题。\n    2. 分步计算,逐步解决问题。\n    3. 给出最终的结果。\n    4. 按照 JSON 格式输出结果,包括:\n    - reason: 详细的推理过程。\n    - infer: 最终的计算结果。\n\n    问题:58 + 15 + 17\n    请给出分析和结果。\nassistant\n", "label": "90", "predict": "```json\n{\n    \"reason\": \"首先,我们需要解决加法问题58 + 15 + 17。我们可以按照从左到右的顺序逐步计算。首先,计算58 + 15,得到73。然后,将73与17相加,最终结果是90。\",\n    \"infer\": 90\n}\n```"}
{"prompt": "system\nYou are a helpful assistant.\nuser\n你是一名擅长数学运算的助手,负责逐步推理并解决四则运算问题。请按照以下步骤进行:\n\n    1. 阅读并理解问题。\n    2. 分步计算,逐步解决问题。\n    3. 给出最终的结果。\n    4. 按照 JSON 格式输出结果,包括:\n    - reason: 详细的推理过程。\n    - infer: 最终的计算结果。\n\n    问题:7 + 35 + 9\n    请给出分析和结果。\nassistant\n", "label": "51", "predict": "```json\n{\n  \"reason\": \"首先,我们从左到右依次进行加法运算。首先计算7加35,得到42。然后将42加上9,得到最终结果51。\",\n  \"infer\": 51\n}\n```"}
{"prompt": "system\nYou are a helpful assistant.\nuser\n你是一名擅长数学运算的助手,负责逐步推理并解决四则运算问题。请按照以下步骤进行:\n\n    1. 阅读并理解问题。\n    2. 分步计算,逐步解决问题。\n    3. 给出最终的结果。\n    4. 按照 JSON 格式输出结果,包括:\n    - reason: 详细的推理过程。\n    - infer: 最终的计算结果。\n\n    问题:92 - 50 + 48\n    请给出分析和结果。\nassistant\n", "label": "90", "predict": "```json\n{\n    \"reason\": \"首先,我们需要按照数学中的运算顺序规则来解决这个问题。这个问题中只包含加法和减法,没有乘除运算,所以我们按照从左到右的顺序进行计算。首先执行92减去50,得到42。然后将得到的结果42加上48,最终结果为90。\",\n    \"infer\": 90\n}\n```"}

在这里插入图片描述

LLamafactory API 部署

可以,参考我们的前一篇文章,关于 python 异步调用 API 的文章。

  • 大模型 API 异步调用优化:高效并发与令牌池设计实践
    .https://blog.csdn.net/sjxgghg/article/details/143858730
  • LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率
    .https://blog.csdn.net/sjxgghg/article/details/144049692

完成 大模型 API 的部署:

llamafactory-cli api vllm_api.yaml 

100%|██████████| 100/100 [00:14<00:00, 6.76it/s]

由于 llamafactory 的批量推理不支持 vllm ,所以导致速度很慢,100条数据推理完,总计用时4分42秒。

而使用 异步的 API 调用的方式,仅仅用时14秒,就完成了100条数据的推理。

结论

lamafactory 的批量推理不支持 vllm 速度很慢。还是建议 lamafactory 把大模型部署成 API 服务,使用异步的调用API更快一点。

当然最快的还是使用 vllm 批量推理,这样会麻烦一些。使用 vllm 针对大模型进行推理会有一些繁琐的配置。比如参考:llama-factory SFT 系列教程 (四),lora sft 微调后,使用vllm加速推理
.https://blog.csdn.net/sjxgghg/article/details/137993809

我个人喜欢的流程是:

  1. 使用 LLamafactory 微调模型;
  2. LLamafactory vllm api 部署模型;
  3. 使用异步调用 API。

项目开源

https://github.com/JieShenAI/csdn/tree/main/24/11/llamafactory_batch_infer

在这里插入图片描述

  • vllm_api.yaml 是 llamafactory API部署,供API异步调用的配置
  • build_dataset.ipynb 构建数据集
  • async_infer.ipynb 异步调用调试代码,因为 .ipynb 运行异步有点麻烦
  • async_infer.py 异步调用的代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android通过摄像头检测心率

话不多说&#xff0c;先看效果 Android通过摄像头测量心率 借鉴文章如下 Android通过摄像头计算心率、心率变异性 该文章的核心功能点已经很全了&#xff0c;为了方便使用&#xff0c;我这边整理成了工具类可直接使用 该功能全网文章还是比较少的&#xff0c;还是要感谢下借鉴…

测绘坐标数据封装处理

1、测绘数据 2、数据处理 public void dealData() {List<Map<String, Object>> shyqzdMapList 截图数据;Map<String, List<Map<String, Object>>> groupMap shyqzdMapList.stream().collect(Collectors.groupingBy(item -> String.valueOf…

一个开源轻量级的服务器资源监控平台,支持告警推送

大家好&#xff0c;今天给大家分享一款开源的轻量级服务器资源监控工具Beszel&#xff0c;提供历史数据记录、Docker容器统计信息监控以及多种警报功能&#xff0c;用于监控服务器资源。 项目介绍 Beszel由hub&#xff08;中心服务器端应用&#xff0c;基于PocketBase构建&…

SVG无功补偿装置MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 SVG&#xff08;又称ASVG 或STATCOM&#xff09;是Static Var Generator 的缩写&#xff0c;叫做静止无功发生器。也是做无功补偿的&#xff0c;比SVC 更加先进。其基本原理是将自换相桥式电路通过电抗器或…

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……

CloudQuery 社区 11 月新版本来啦&#xff01;本月版本依旧是 CUG&#xff08;CloudQuery 用户组&#xff09;尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表&#xff1b;在流程模块引入了“审批人组”概念。此外&#xff0c;在 SQL 编辑器、连接管理等模块都涉及…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

微积分复习笔记 Calculus Volume 2 - 3.1

The first 2 chapters of volume 2 are the same as those in volume 1. Started with Chapter 3. 3.1 Integration by Parts - Calculus Volume 2 | OpenStax

智能化图书馆导航系统方案之系统架构与核心功能设计

hello~这里是维小帮&#xff0c;点击文章最下方获取图书馆导航系统解决方案&#xff01;如有项目需求和技术交流欢迎大家私聊我们~撒花&#xff01; 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题&#xff0c;本文深入剖析了基于高精度定位、3D建模、图书搜…

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…

第六届机器人、智能控制与人工智能国际(RICAI 2024)

会议信息 会议时间与地点&#xff1a;2024年12月6-8日&#xff0c;中国南京 会议官网&#xff1a;www.ic-ricai.org &#xff08;点击了解大会参会等详细内容&#xff09; 会议简介 第六届机器人、智能控制与人工智能国际学术会议&#xff08;RICAI 2024&#xff09;将于20…

PostgreSQL WAL日志膨胀处理

作者&#xff1a;Digital Observer&#xff08;施嘉伟&#xff09; Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验&#xff0c;现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…

Windows中python3使用minio

minio.exe 和 mc.exe下载地址 # http://192.168.16.174:9000 # admin admin123!# # E:\tool\minio\bin>set MINIO_ROOT_USERadmin # E:\tool\minio\bin>set MINIO_ROOT_PASSWORDadmin123!# # E:\tool\minio\bin>minio.exe server E:\tool\minio\data# 配置minio 客户…

Flink在Linux系统上的安装与入门

一、Flink的引入 这几年大数据的飞速发展&#xff0c;出现了很多热门的开源社区&#xff0c;其中著名的有Hadoop、Storm&#xff0c;以及后来的Spark&#xff0c;他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河&#xff0c;也以内存为赌注&#xff0c;赢得了内存计…

黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产

11月23日&#xff0c;芯片巨头、AI时代“卖铲人”和最大受益者、全球市值最高【英伟达】创始人兼CEO黄仁勋在香港科技大学被授予工程学荣誉博士学位&#xff1b;并与香港科技大学校董会主席沈向洋展开深刻对话&#xff0c;涉及人工智能&#xff08;AI&#xff09;、计算力、领导…

unity工程转为安卓使用的aar文件

1.unity导出时选择安卓平台&#xff0c;导出的最终工程如下&#xff1a; 2.将该工程导入AndroidStudio里&#xff0c;File->new->import project, 选择上一步导出的文件夹。导入完成如下&#xff1a; 3.导入进来之后&#xff0c;手动在下方文件夹添加string文件&#xff…

【N 卡 掉驱动 Driver 】NVML ERROR: Driver Not Loaded

问题描述 输入 nvitop 时报错 NVML ERROR: Driver Not Loaded&#xff0c;重启问题依旧存在。 问题解决-重新下载驱动 进入官网选择合适自己的驱动版本 https://www.nvidia.cn/geforce/drivers/ 根据个人情况搜索后&#xff0c;选择最新的 Driver 进行下载&#xff0c;如果希…

C# 索引器(Indexer)

文章目录 前言一、索引器的语法规则二、索引器的用途及与属性的对比三、索引器的重载 前言 在 C# 编程中&#xff0c;索引器&#xff08;Indexer&#xff09;是一项极具特色且实用的语言特性&#xff0c;它赋予了对象一种独特的访问方式&#xff0c;使得对象能够如同数组一般&a…

Scrapy管道设置和数据保存

1.1 介绍部分&#xff1a; 文字提到常用的Web框架有Django和Flask&#xff0c;接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分&#xff1a; Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…

Oracle SCN与时间戳的映射关系

目录 一、基本概述 二、相关操作 三、参考文档 一、基本概述 Oracle 数据库中的 SYS.SMON_SCN_TIME 表是一个关键的内部表&#xff0c;主要用于记录过去时间段中SCN与具体的时间戳之间的映射关系。这种映射关系可以帮助用户将 SCN 值转换为可读性更强的时间戳&#xff0c;从而…