网站后台制作教程,保定关键词排名推广,佛山做网站3000,杭州有哪些做网站的公司好背景
在阅读 LLamafactory 的文档时候#xff0c;发现它支持批量推理: 推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html 。
于是便想测试一下#xff0c;它的批量推理速度有多快。本文实现了 下述两种的大模型推理#xff0c;并对…背景
在阅读 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 Listdef generate_arithmetic_expression(num: int):# 定义操作符和数字范围除法operators [, -, *]expression (f{random.randint(1, 100)} {random.choice(operators)} {random.randint(1, 100)})num - 1for _ in range(num):expression f{expression} {random.choice(operators)} {random.randint(1, 100)}result eval(expression)expression expression.replace(*, x)return expression, resultdef 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, encodingutf-8) as f:json.dump(data, f, ensure_asciiFalse, indent2)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(textstexts,labelslabels,output_filecalculate.json,prompt_templateprompt_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_demomax_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-Factorynohup llamafactory-cli train /绝对路径/csdn/24/11/llamafactory_batch_infer/batch_infer.yaml但是 llamafactory 的批量推理不支持 vllm所以推理速度有点慢甚至还不如异步的API调用。
100%|██████████| 100/100 [04:4200: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/143858730LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率 .https://blog.csdn.net/sjxgghg/article/details/144049692
完成 大模型 API 的部署
llamafactory-cli api vllm_api.yaml 100%|██████████| 100/100 [00:1400: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 异步调用的代码