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

打印 上一主题 下一主题

主题 1591|帖子 1591|积分 4773

背景

在阅读 LLamafactory 的文档时间,发现它支持批量推理:
推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html 。
于是便想测试一下,它的批量推理速率有多快。本文实现了 下述两种的大模型推理,并对比了他们速率差异:


  • LLamafactory API 部署,并通过 python 异步调用;
  • LLamafactory 批量推理;
数据集构造

LLamafactory 批量推理的数据集,需要在 data/dataset_info.json 文件中完成注册。
build_dataset.ipynb:
  1. import json
  2. import random
  3. from typing import List
  4. def generate_arithmetic_expression(num: int):
  5.     # 定义操作符和数字范围,除法
  6.     operators = ["+", "-", "*"]
  7.     expression = (
  8.         f"{random.randint(1, 100)} {random.choice(operators)} {random.randint(1, 100)}"
  9.     )
  10.     num -= 1
  11.     for _ in range(num):
  12.         expression = f"{expression} {random.choice(operators)} {random.randint(1, 100)}"
  13.     result = eval(expression)
  14.     expression = expression.replace("*", "x")
  15.     return expression, result
  16. def trans2llm_dataset(
  17.     texts: List[str],
  18.     labels: List[str],
  19.     output_file,
  20.     instruction="",
  21.     prompt_template="",
  22.     replace_kw="",
  23. ):
  24.     data = []
  25.     for text, label in zip(texts, labels):
  26.         if replace_kw and prompt_template:
  27.             text = prompt_template.replace(replace_kw, text)
  28.         d = {
  29.             "instruction": instruction,
  30.             "input": text,
  31.             "output": label,
  32.         }
  33.         data.append(d)
  34.     with open(output_file, "w", encoding="utf-8") as f:
  35.         json.dump(data, f, ensure_ascii=False, indent=2)
  36. prompt_template = """
  37.     你是一名擅长数学运算的助手,负责逐步推理并解决四则运算问题。请按照以下步骤进行:
  38.     1. 阅读并理解问题。
  39.     2. 分步计算,逐步解决问题。
  40.     3. 给出最终的结果。
  41.     4. 按照 JSON 格式输出结果,包括:
  42.     - reason: 详细的推理过程。
  43.     - infer: 最终的计算结果。
  44.     问题:{question}
  45.     请给出分析和结果。
  46.     """.strip()
  47. texts = []
  48. labels = []
  49. for _ in range(100):
  50.     text, label = generate_arithmetic_expression(2)
  51.     texts.append(text)
  52.     labels.append(label)
  53. trans2llm_dataset(
  54.     texts=texts,
  55.     labels=labels,
  56.     output_file="calculate.json",
  57.     prompt_template=prompt_template,
  58.     replace_kw="{question}",
  59. )
复制代码
上述步伐运行后,得到了下图所示的数据集:

把该数据集在dataset_info.json中使用绝对路径注册:

LLamafactory 批量推理

yaml 参数设置

  1. # examples/train_lora/llama3_lora_predict.yaml
  2. ### model
  3. model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
  4. adapter_name_or_path: saves/llama3-8b/lora/sft
  5. # deepspeed: examples/deepspeed/ds_z3_config.yaml # deepspeed配置文件
  6. ### method
  7. stage: sft
  8. do_predict: true
  9. finetuning_type: lora
  10. ### dataset
  11. # eval_dataset: identity,alpaca_en_demo
  12. eval_dataset: calculate
  13. template: qwen
  14. cutoff_len: 1024
  15. # max_samples: 50
  16. overwrite_cache: true
  17. preprocessing_num_workers: 16
  18. ### output
  19. output_dir: 模型预测结果的输出路径
  20. overwrite_output_dir: true
  21. ### eval
  22. per_device_eval_batch_size: 1
  23. predict_with_generate: true
  24. ddp_timeout: 180000000
复制代码
参数介绍:


  • eval_dataset: identity,alpaca_en_demo
  • max_samples: 50
eval_dataset 是待猜测/评估的数据集,支持填写多个数据集;
max_samples 代表从数据集中随机采样的数目;若不填,默认是全部数据集;
批量推理启动

由于要用到数据集,为了使得LLaMA-Factory 可以或许找到该数据集,故要在LLaMA-Factory 项目路径下运行命令,否则就会报’data/dataset_info.json 找不到的错误:
  1. ValueError: Cannot open data/dataset_info.json due to [Errno 2] No such file or directory: 'data/dataset_info.json'.
复制代码
cd 切换到 LLaMA-Factory 项目路径下,确保当前路径有 data 文件夹:
  1. cd xxx/.../LLaMA-Factory
复制代码
  1. 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中:
  1. {"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```"}
  2. {"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```"}
  3. {"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 的部署:
  1. 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
我个人喜欢的流程是:

  • 使用 LLamafactory 微调模型;
  • LLamafactory vllm api 部署模型;
  • 使用异步调用 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 异步调用的代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表