From f61fcce41731682993515cf554601c227c686843 Mon Sep 17 00:00:00 2001 From: Killjoy Date: Fri, 12 Dec 2025 15:18:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/model_test/model_test.md | 249 ++++++++++++++++++ docs/mindformers/docs/source_zh_cn/index.rst | 1 + 2 files changed, 250 insertions(+) create mode 100644 docs/mindformers/docs/source_zh_cn/example/model_test/model_test.md diff --git a/docs/mindformers/docs/source_zh_cn/example/model_test/model_test.md b/docs/mindformers/docs/source_zh_cn/example/model_test/model_test.md new file mode 100644 index 0000000000..a40e752b3c --- /dev/null +++ b/docs/mindformers/docs/source_zh_cn/example/model_test/model_test.md @@ -0,0 +1,249 @@ +# MindSpore Transformers模型部署与评测 + +在实际使用时,用户基于Mindspore Transformers对模型训练/微调后,往往会进行部署,并使用通用评测工具在自定义数据集上进行精度的评测。本文介绍了模型的部署与评测流程,涵盖使用vLLM-MindSpore部署模型,基于两种通用评测框架`lm-eval`和`opencompass`进行能力评测。通过本文,您可以了解如何部署和评测基于MindSpore Transformers训练/微调出的模型。 + +## 1. 准备工作:使用vLLM-MindSpore部署模型 + +在开始部署前,首先需要到[仓库](https://gitee.com/mindspore/vllm-mindspore/tree/master/vllm_mindspore/model_executor/models)查看您的模型是否被vLLM-MindSpore支持。如果您的模型位于列表中,则可以继续下面的步骤。 + +### 1.1 构建镜像 + +用户可执行以下命令,拉取vLLM-MindSpore插件代码仓库,并构建镜像: + +``` bash +git clone https://gitee.com/mindspore/vllm-mindspore.git +bash build_image.sh +``` + +> 注:如果构造镜像遇到超时问题,可以尝试在`build_image.sh`脚本中添加 +`ENV UV_HTTP_TIMEOUT=3000`,并且在仓库`install_depend_pkgs.sh`脚本中更换速度更快的镜像站。 + +### 1.2 新建容器 + +用户根据服务器配置创建容器,详细请参考[容器创建教程](https://www.mindspore.cn/vllm_mindspore/docs/zh-CN/master/getting_started/installation/installation.html)。 + +### 1.3 部署在线推理服务 + +设置环境变量: + +``` bash +export VLLM_MS_MODEL_BACKEND=MindFormers +``` + +部署模型: + +``` bash +python3 -m vllm_mindspore.entrypoints vllm.entrypoints.openai.api_server --model MODEL_PATH --port YOUR_PORT --host 0.0.0.0 --served-model-name YOUR_MODEL_NAME +``` + +## 2. 使用lm-eval进行评测 + +lm-eval是一个大型综合评测框架,适用于众多通用领域测试集(MMLU、CEVAL等),同时支持方便的自定义数据测试。 + +### 2.1 安装lm-eval及其依赖 + +**注意:极其推荐单开一个conda环境,python≥3.10,以避免某些兼容问题** + +需要注意需要采用本地安装的方法,不要直接`pip install lm-eval` + +``` +git clone https://github.com/EleutherAI/lm-evaluation-harness.git +cd lm-evaluation-harness +pip install -e . +``` + +如果遇到报错`Error: Please make sure the libxml2 and libxslt development packages are installed` +使用如下命令进行安装: +```conda install -c conda-forge libxml2 libxslt``` + + +### 2.2 处理数据集 + +> 注:该步为自定义数据集所需步骤,测试通用测试集时,直接使用[官方教程](https://github.com/EleutherAI/lm-evaluation-harness)即可。 + +假设本地存在一个用户自定义的数据集,该数据集为一个`csv`文件,每一条数据集是单选题,包含一个问题,四个选项,答案,共6个属性,该文件没有表头,文件名为 `output_filtered.csv`。首先执行如下代码,将csv文件转换为适合模型处理的`Dataset`格式: + +``` python +import pandas as pd +from datasets import Dataset, DatasetDict +import os + +def convert_csv_to_parquet_dataset(csv_path, output_dir): + """ + 将无表头的CSV文件转换为Parquet格式数据集,并明确指定为validation split + + 参数: + csv_path: 输入的CSV文件路径(无表头,列顺序为:问题,A,B,C,D,答案) + output_dir: 输出目录(将保存为Hugging Face数据集格式) + """ + # 1. 读取CSV文件(无表头) + print(f"正在读取CSV文件: {csv_path}") + df = pd.read_csv(csv_path, header=None) + + # 2. 添加规范的列名 + df.columns = ["question", "A", "B", "C", "D", "answer"] + print(f"找到 {len(df)} 条数据") + + # 3. 转换为Hugging Face Dataset格式 + dataset = Dataset.from_pandas(df) + + # 4. 创建DatasetDict并指定为validation split + dataset_dict = DatasetDict({"validation": dataset}) + + # 5. 创建输出目录 + os.makedirs(output_dir, exist_ok=True) + + # 6. 保存完整数据集(Hugging Face格式) + print(f"正在保存数据集到: {output_dir}") + dataset_dict.save_to_disk(output_dir) + + # 7. 单独保存validation split为Parquet文件(可选) + validation_parquet_path = os.path.join(output_dir, "validation.parquet") + dataset_dict["validation"].to_parquet(validation_parquet_path) + print(f"单独保存的Parquet文件: {validation_parquet_path}") + + return dataset_dict + +# 使用示例 +if __name__ == "__main__": + # 输入输出配置 + input_csv = "output_filtered.csv" # 替换为你的CSV文件路径 + output_dir = "YOUR_OUTPUT_PATH" # 输出目录 + + # 执行转换 + dataset = convert_csv_to_parquet_dataset(input_csv, output_dir) + + # 打印验证信息 + print("\n转换结果验证:") + print(f"数据集结构: {dataset}") + print(f"Validation split样本数: {len(dataset['validation'])}") + print(f"首条数据示例: {dataset['validation'][0]}") +``` + +这样可以把`csv`文件转换为`Dataset`数据集形式。 + +### 2.3 创建数据集配置文件 + +在 `/lm-evaluation-harness/lm_eval/tasks` 下创建一个文件夹,命名为 `YOUR_DATASET_NAME`, 在这个文件夹下创建一个 `YOUR_DATASET_NAME.yaml`,内容为: + +```yaml +task: YOUR_DATASET_NAME +dataset_path: YOUR_DATASET_PATH_FOLDER +test_split: validation +output_type: multiple_choice +doc_to_text: "{{question.strip()}}\nA. {{A}}\nB. {{B}}\nC. {{C}}\nD. {{D}}\n答案:" +doc_to_choice: ["A", "B", "C", "D"] +doc_to_target: "{{['A', 'B', 'C', 'D'].index(answer)}}" +metric_list: + - metric: acc + aggregation: mean + higher_is_better: true + - metric: acc_norm + aggregation: mean + higher_is_better: true +metadata: + version: 0.0 +``` + +更多创建方式可以参考tasks文件夹下的cmmlu的[yaml](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/cmmlu/_default_template_yaml)构建。 + +### 2.4 测试精度 + +``` bash +lm_eval --model local-completions --tasks YOUR_DATASET_NAME --output_path path/to/save/output --log_samples --model_args + '{ + "model": "your model name", + "base_url": "http://127.0.0.1:port/v1/completions", + "tokenizer": "model path", + "config": "model path", + "use_fast_tokenizer": true, + "num_concurrent": 1, + "max_retries": 3, + "tokenized_requests": false + }' +``` + + +### 可能遇到的报错: + +报错1: + +```bash +jinja2.exceptions.UndefinedError: 'question' is undefined +``` +原因:datasets版本不兼容。 +解决方案: + +```bash +pip uninstall -y datasets +pip install datasets==2.18.0 +``` + +报错2: + +```bash +_pad() got an unexpected keyword argument 'padding_side' +``` +原因:`transformers`库版本不兼容。 +解决办法:降低`transformers`库版本为4.35.2。 + +## 2. opencompass + +### 2.1 安装opencompass + +``` bash +pip install -U opencompass +``` +在安装过程中,可能会遇到报错 + +``` bash +AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'? +``` +解决方法: +改为由[源码](https://github.com/open-compass/opencompass)安装,将`requirements/runtime.txt`中的`pyext`和`rouge`删掉 + +### 2.2 准备数据集 + +下载数据集并解压至opencompass根目录 + +``` +wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip +unzip OpenCompassData-core-20240207.zip +``` + +### 2.3 设置config文件和运行脚本 + +模型的config文件设置参考[text](https://opencompass.readthedocs.io/zh-cn/latest/advanced_guides/accelerator_intro.html#api) + +修改`path`为部署模型的名字,修改`openai_api_base`为部署模型的`url`,配置模型的`tokenizer_path`,`batch_size`可以适当调大来加速。 + +数据集一般不用自己配置,参考[text](https://opencompass.readthedocs.io/zh-cn/latest/advanced_guides/accelerator_intro.html#api)获得推荐配置,或是在每个数据集的config路径下查找合适的配置。例如bbh(big bench hard)数据集,在```opencompass/opencompass/configs/datasets/bbh/```下有```bbh_gen_ee62e9.py```、```bbh_0shot_nocot_academic_gen.py```等, 分别是zero-shot和five-shot的配置,根据需要自由选择。 + +运行脚本参考[eval_api_demo.py](https://github.com/open-compass/opencompass/blob/main/examples/eval_api_demo.py)进行修改, 导入需要评测的模型配置和需要测试的数据集即可 + +**可能遇到的报错**: + +``` +Traceback (most recent call last): +... +/mmengine/config/lazy.py", line 205, in __call__ + raise RuntimeError() +RuntimeError +``` + +解决方法:把该文件```with open(os.path.join(hard_coded_path, 'lib_prompt', f'{_name}.txt'), 'r') as f:```中的地址硬编码为如下: + +``` +hard_coded_path = '/path/to/datasets/bbh' \ + + '/lib_prompt/' \ + + f'{_name}.txt' +``` + +### 2.4 启动评测 + +启动评测时运行以下命令: +``` +opencompass /path/to/your/scripts +``` + +如果需要额外的参数设置,参考[text](https://opencompass.readthedocs.io/zh-cn/latest/user_guides/experimentation.html)进行额外配置即可 \ No newline at end of file diff --git a/docs/mindformers/docs/source_zh_cn/index.rst b/docs/mindformers/docs/source_zh_cn/index.rst index f28d2d4455..55ae8f1931 100644 --- a/docs/mindformers/docs/source_zh_cn/index.rst +++ b/docs/mindformers/docs/source_zh_cn/index.rst @@ -210,6 +210,7 @@ FAQ example/docker-installation example/distilled/distilled example/convert_ckpt_to_megatron/convert_ckpt_to_megatron + example/model_test/model_test .. toctree:: :glob: -- Gitee