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

news2024/11/27 11:43:29

背景

在阅读 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 异步调用的代码

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

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

相关文章

【自动化Selenium】Python 网页自动化测试脚本(上)

目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 &#xff08;1&#xff09;ID定位 &…

Table 滚动条始终停靠在可视区域的底部

1. 话题引入 存在这样一个场景&#xff1a;当页面尺寸发生变化时&#xff0c;希望滚动条能够随之动态调整&#xff0c;始终展示在 table 的可视区域的最下方&#xff0c;而不是整个 table 本身的最底部。 这种行为可以提升用户的使用体验&#xff0c;尤其是在处理大数据表格时…

【漏洞复现】CVE-2020-13925

漏洞信息 NVD - CVE-2020-13925 Similar to CVE-2020-1956, Kylin has one more restful API which concatenates the API inputs into OS commands and then executes them on the server; while the reported API misses necessary input validation, which causes the hac…

基于Springboot的心灵治愈交流平台系统的设计与实现

基于Springboot的心灵治愈交流平台系统 介绍 基于Springboot的心灵治愈交流平台系统&#xff0c;后端框架使用Springboot和mybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同级别…

快速理解微服务中Gateway的概念

一.基本概念 定义&#xff1a; 在微服务架构中&#xff0c;Spring Cloud Gateway 是一个用于API网关的框架&#xff0c;它是一个基于 Spring Framework 的高效、可扩展的路由器和反向代理&#xff0c;它能够将外部请求转发到适当的微服务&#xff0c;并提供一些与请求处理相关…

Java【多线程】(1)进程与线程

目录 1.前言 2.正文 2.1什么是进程 2.2PCB&#xff08;进程控制块&#xff09; 2.2.1进程id 2.2.2内存指针 2.2.3文件描述符表 2.2.4进程状态 2.2.4.1就绪状态 2.2.4.2阻塞状态 2.2.5进程优先级 2.2.6进程上下文 2.2.7进程的记账信息 2.3CPU操作进程的方法 2.4什…

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…

kafka生产者和消费者命令的使用

kafka-console-producer.sh 生产数据 # 发送信息 指定topic即可 kafka-console-producer.sh \ --bootstrap-server bigdata01:9092 \ --topic topicA # 主题# 进程 29124 ConsoleProducer kafka-console-consumer.sh 消费数据 # 消费数据 kafka-console-consumer.sh \ --boo…

构造函数的相关

文章目录 一、构造函数 今天我们要来讲解类的默认成员函数之一的构造函数。 一、构造函数 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数虽然名称叫构造&#xff0c;但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时&…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…

计算机网络八股整理(一)

计算机网络八股文整理 一&#xff1a;网络模型 1&#xff1a;网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型&#xff0c;它由七层组成&#xff0c;从上到下分别是&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;…

【Qt】控件7

1.QTextEdit的简单使用 使用简单的QTextEdit,获取到的内容显示到标签上 使用textChanged信号 在槽函数中需要获取QTextEdit的内容&#xff0c;对应操作是&#xff1a; QString curorui->textEdit->toPlainText();然后显示到标签上&#xff0c;对应操作是&#xff1a; …

【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总

文章目录 1.datagridview绘制出现鼠标悬浮数据变空白2.datagridview在每列前动态添加序号2.1 加载数据集完成后绘制序号2.2 RowPostPaint事件绘制 3.datagridview改变行样式4.datagridview后台修改指定列数据5.datagridview固定某个列宽6.datagridview某个列的显示隐藏7.datagr…

AI智能体崛起:从“工具”到“助手”的进化之路

目录 AI智能体的崛起 AI智能体的定义与决策模型 AI智能体的特点与优势 AI智能体的应用与类型 面临的挑战 未来展望 近年来&#xff0c;人工智能领域的焦点正从传统的聊天机器人&#xff08;Chat Bot&#xff09;快速转向更具潜力的AI智能体&#xff08;AI Agent&#xff…

【计网】自定义协议与序列化(一) —— Socket封装于服务器端改写

&#x1f30e; 应用层自定义协议与序列化 文章目录&#xff1a; Tcp协议Socket编程 应用层简介 序列化和反序列化       重新理解read/write/recv/send及tcp的全双工       Socket封装       服务器端改写 &#x1f680;应用层简介 我们程序员写的一个个解决…

鸿蒙动画开发07——粒子动画

1、概 述 粒子动画是在一定范围内随机生成的大量粒子产生运动而组成的动画。 动画元素是一个个粒子&#xff0c;这些粒子可以是圆点、图片。我们可以通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等维度变化做动画&#xff0c;来营造一种氛围感&#xff0c;比如下…

C语言学习 12(指针学习1)

一.内存和地址 1.内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨…

【pyspark学习从入门到精通19】机器学习库_2

目录 估计器 分类 回归 聚类 管道 估计器 估计器可以被看作是需要估算的统计模型&#xff0c;以便对您的观测值进行预测或分类。 如果从抽象的 Estimator 类派生&#xff0c;新模型必须实现 .fit(...) 方法&#xff0c;该方法根据在 DataFrame 中找到的数据以及一些默认或…

结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用

目录 第一章 夯实基础 R/Rstudio简介及入门 第二章 结构方程模型&#xff08;SEM&#xff09;介绍 第三章 R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 第四章 SEM全局估计&#xff08;lavaan&#xff09;在生态学领域高阶应用 第五章 SEM潜变量分析在生态学领域…