From d206e1e1e7b09b6ab016d13c36b26c75fd1339af Mon Sep 17 00:00:00 2001 From: 222222222 <222222222@qq.com> Date: Tue, 19 Aug 2025 16:36:33 +0800 Subject: [PATCH 1/4] add ademo documention. --- .../\345\256\214\346\225\264\347\211\210.md" | 578 ++++++++++++++++++ 1 file changed, 578 insertions(+) create mode 100644 "docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" diff --git "a/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" "b/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" new file mode 100644 index 0000000000..1a52f2ded4 --- /dev/null +++ "b/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" @@ -0,0 +1,578 @@ +## 背景 +虚竹大模型:基于910B训练,部署于310P的经济型工业领域大模型,专精工业领域知识问答。在虚竹大模型的训练、微调、测试至部署过程中,形成了完整的昇腾生态上的大模型最佳实践,以此文档进行记录,供广大希望借鉴高性价比训练部署流程的企业或是希望体验国产大模型生态的个人参考。 + +训练上,分为两条线,一条使用mindspeed(pytorch后端)框架进行预训练,虽然是国产训练框架,但是在训练后端上仍使用的是pytorch这一非国产框架,故另一条线是使用mindformers框架进行glm-9b-chat的sft。 + +测试上,首先对虚竹大模型专精的工业领域使用测试,得到了高分后,又希望它在通用领域不要有很大的降低,因此在通用领域如MMLU、CEVAL、IFEVAL等进行测试,发现也有不错的效果,证明我们的国产化训练流程是成功可靠的。在测试流程中,我们形成了一些评测经验,总结如下:lm-eval适合客观题、base模型的评测,opencompass适合主观题、chat模型的评测。 + +具体的预训练、sft、测试、部署细节,请参考对应章节。 + +## mindspeed(pytorch后端)预训练流程 +### 1. 环境安装 + +#### 1.1 镜像拉取: + +http://mirrors.cn-central-221.ovaijisuan.com/detail/143.html + +docker pull swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/pytorch2_1_0_kernels:PyTorch2.1.0-cann8.0.RC2_py_3.9-euler_2.8.3-64GB + +把下列命令保存至docker_run.sh脚本。 + +docker run -it -u root \ + --device=/dev/davinci0 \ + --device=/dev/davinci1 \ + --device=/dev/davinci2 \ + --device=/dev/davinci3 \ + --device=/dev/davinci4 \ + --device=/dev/davinci5 \ + --device=/dev/davinci6 \ + --device=/dev/davinci7 \ + --device=/dev/davinci_manager \ + --device=/dev/devmm_svm \ + --device=/dev/hisi_hdc \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ + -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ + -v /data0/aicc:/data0/ma-user/work/aicc \ #挂载工作目录 + --shm-size=128g \ #设置共享内存 + --name pytorch_ma_2 \ + --entrypoint=/bin/bash \ + swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/pytorch2_1_0_kernels:PyTorch2.1.0-cann8.0.RC2_py_3.9-euler_2.8.3-64GB + +**注意:以上脚本中反斜杠后不能有空格等内容,否则无法成功创建容器。** + +启动容器: + +docker start pytorch_ma_2 + +docker exec -it pytorch_ma_2 /bin/bash + +#### 1.2 环境搭建 + +``` + # 使能环境变量 + source /usr/local/Ascend/ascend-toolkit/set_env.sh + source /usr/local/Ascend/nnal/atb/set_env.sh + + # 安装MindSpeed加速库 + git clone https://gitee.com/ascend/MindSpeed.git + cd MindSpeed + git checkout 2c085cc9 # checkout commit from MindSpeed core_r0.8.0 in 2025.04.01 + pip install -r requirements.txt + pip3 install -e . + cd .. + + # 准备MindSpeed-LLM及Megatron-LM源码 + git clone https://gitee.com/ascend/MindSpeed-LLM.git + cd MindSpeed-LLM + mkdir logs + mkdir model_from_hf + mkdir dataset + mkdir ckpt + cd .. + git clone https://github.com/NVIDIA/Megatron-LM.git # megatron从github下载,请确保网络能访问 + cd Megatron-LM + git checkout core_r0.8.0 + cp -r megatron ../MindSpeed-LLM/ + cd ../MindSpeed-LLM + git checkout 2.1.0 + + # 安装torch、torchvision及apex + # 安装 torch-2.1.0 + pip install torch==2.1.0 + # 安装torch_npu依赖 + pip install pyyaml + pip install setuptools==65.7.0 + # 安装torch_npu + pip3 install torch-npu==2.1.0.post8 + + # 若使用pip命令安装失败,请使用下载链接或进入PyTorch官方网站进行查询下载对应版本。 + pip install torch_npu-2.1.0*-cp38-cp38m-linux_aarch64.whl + + # 安装对应版本的torchvision + pip install torchvision==0.16.0 + + # 安装apex for Ascend 参考 https://gitee.com/ascend/apex + git clone -b master https://gitee.com/ascend/apex.git + # 进入昇腾适配的APEX源码目录,执行命令编译生成二进制安装包(支持Python3.7-3.10) + cd apex + # 容器内git clone不了可以在容器外进行,然后把build.sh中的git clone注释掉 + bash scripts/build.sh --python=3.8 + # 执行如下命令安装。 + cd apex/dist + # 在本例中为apex-0.1+ascend-cp38-cp38-linux_aarch64.whl + pip install apex-0.1_ascend-*.whl + + pip install -r requirements.txt # 安装其余依赖库 +``` + + + +### 2.权重下载及转换 + +#### 2.1 权重准备 + +hugging_face下载glm-4-9b-chat模型。 + +#### 2.2 权重转换 + +``` +bash examples/mcore/glm4/ckpt_convert_glm4_hf2mcore.sh +``` +【--target-tensor-parallel-size】 + +指明需要切分的TP数量,默认为1 + +【--target-pipeline-parallel-size】 + +指明需要切分的PP数量,默认为1 + +【--use-mcore-models】 + +设置是否转换为Megatron-Mcore权重,若不指定,则默认转换为Megatron-Legacy权重 + +【--model-type-hf】 + +huggingface模型类别,默认为llama2,目前支持的模型见 [model_cfg.json](https://gitee.com/ascend/ModelLink/blob/master/modellink/tasks/checkpoint/model_cfg.json) + +【--tokenizer-model】 + +需要指明到具体的分词器模型文件,如 tokenizer.model、tokenizer.json、qwen.tiktoken、None等,具体取决于huggingface中词表文件的格式形式 + +【--params-dtype】 + +指定权重转换后的权重精度模式,默认为fp16,如果源格式文件为bf16,则需要对应设置为bf16,影响推理或评估结果 + +### 3.数据集处理 + +#### 3.1 预训练数据下载 + +使用内部工业领域专业数据mold_sft_textbook_160k_filtered_v2.jsonl + +至 "./mindspeed-llm/dataset" 目录 + +#### 3.2 预训练数据集处理方法 + +``` +# 请按照您的真实环境修改 set_env.sh 路径 +source /usr/local/Ascend/ascend-toolkit/set_env.sh + +python ./preprocess_data.py \ + --input ./dataset/mold_sft_textbook_160k_filtered_v2.jsonl \ + --tokenizer-name-or-path /path/to/your/model \ + --tokenizer-type PretrainedFromHF \ + --handler-name GeneralPretrainHandler \ + --output-prefix ./dataset/train \ + --json-keys text \ + --workers 4 \ + --log-interval 1000 +``` + +【--input】 + +可以直接输入到数据集目录或具体文件,如果是目录,则处理全部文件, 支持 .parquet \ .csv \ .json \ .jsonl \ .txt \ .arrow 格式, 同一个文件夹下的数据格式需要保持一致 + +【--tokenizer-name-or-path】 + +指定分词器的名称或路径。这里使用的是本地路径,指向一个预训练的模型或分词器。 + +【--tokenizer-type】 + +指定分词器的类型。这里使用的是`PretrainedFromHF`,分词器是从Hugging Face预训练的。 + +【--handler-name】 + +当前预训练默认使用 `GeneralPretrainHandler`,支持的是预训练数据风格,提取数据的`text`列 + +【--output-prefix】 + +指定输出文件的前缀。预处理后的数据将被保存在这个路径下,文件名将以`train`开头。 + +【--json-keys】 + +从文件中提取的列名列表,默认为 `text`,可以为 `text`, `input`, `title` 等多个输入,结合具体需求及数据集内容使用,如: + +``` +--json-keys text input output \ +``` + +【--workers】 + +指定用于预处理的并发工作进程数。这里设置为4,意味着将有4个进程并行工作以提高预处理速度。 + +【--log-interval】 + +设置日志记录的间隔。这里设置为1000,意味着每处理1000条记录后,将记录一次日志信息。 + +### 4.大模型预训练启动 + +#### 4.1 准备工作 + +配置脚本前需要完成前置准备工作,包括:**环境安装**、**数据集准备及处理**、**Huggingface权重转换**,详情可查看对应章节。 + +#### 4.2 配置预训练参数 + +mcore分支的预训练脚本保存在 example/mcore 中各模型文件夹下:pretrain_xxx_xx.sh。本例是转换成mcore,因此使用的训练脚本为 + +./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh + +编辑脚本进行路径配置:包括**权重保存路径**、**权重加载路径**、**词表路径**、**数据集路径** + +``` +# 根据实际情况配置权重保存、权重加载、词表、数据集路径 + CKPT_SAVE_DIR="./ckpt/glm-4-9b" #权重保存路径 + CKPT_LOAD_DIR="./model_weights/glm-4-9b-mcore/" #权重加载路径 + TOKENIZER_MODEL="./model_from_hf/glm-4-9b" #词表路径 + DATA_PATH="./dataset/train_text_document" #数据集路径(此处意思为数据列表,并非一般的文件夹路径) +``` + +本例为单机运行,则在脚本中设置为: + +``` + NPUS_PER_NODE=8 + MASTER_ADDR=locahost + MASTER_PORT=6000 + NNODES=1 + NODE_RANK=0 + WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES)) +``` + +启动命令: + +``` +bash ./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh +``` + +## mindformers(全国产化)sft流程 + +### 环境搭建 +安装2.6.0 mindspore +```bash +pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.6.0/MindSpore/unified/aarch64/mindspore-2.6.0-cp311-cp311-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple +``` +安装1.5.0 mindformers 及相关环境 +```bash +git clone -b v1.5.0 https://gitee.com/mindspore/mindformers.git +cd mindformers +bash build.sh +``` + +### 数据转换 +使用内部工业数据微调数据集merged_all_sft_250710.jsonl + +生成MindRecord格式数据集 +```bash +python mindformers/tools/dataset_preprocess/glm4/glm4_preprocess.py \ + --input_glob /path/merged_all_sft_250710.jsonl \ + --vocab_file /path/tokenizer.model \ + --seq_length 8192 \ + --output_file /path/alpaca-messages.mindrecord +``` + +### 多卡训练 + +#### 权重分割 +``` +python convert_weight.py --model glm4 --input_path HF_CKPT_PATH --output_path MS_NOT_CONCAT_CKPT_PATH --dtype bf16 --config YAML_PATH +``` +输出为一整个模型权重的ckpt文件 +注:如果提示trust_remote_code相关错误,按照提示设置trust_remote_code=True即可 +注:由于mindformers的文档存在相当程度的混淆,是否需要由hf权重转换为mindspore权重待确认。 + +#### 并行策略配置与训练启动 +在.../mindformers/configs/glm4/finetune_glm4_9b.yaml的基础上作修改 +注意:model_config的seq_length要和数据集一致,否则会有其他报错 + +设置如下环境变量: + +```bash +export MS_ASCEND_CHECK_OVERFLOW_MODE=INFNAN_MODE +``` + +第一次训练: +``` +bash scripts/msrun_launcher.sh "run_mindformer.py \ + --config configs/glm4/finetune_glm4_9b.yaml \ + --load_checkpoint /path/to/ckpt \ + --auto_trans_ckpt True \ + --train_dataset /path/todataset \ + --run_mode finetune" 8 +``` +注:每次转换结束后需要将strategy和transformed_checkpoint保存到自定义文件夹,因为每次拉起新的任务,如果开启了权重自动转换(auto_trans_ckpt=True),会将这两个文件夹清空,然后保存最新任务的转换结果。 + +断点恢复训练: +``` +--load_checkpoint: checkpoint_file_or_dir_path +--resume_training: True +--src_strategy_path_or_dir: 分布式策略文件路径 +--auto_trans_ckpt False +``` + +#### 权重合并 +``` +--only_save_strategy: True +python mindformers/tools/transform_ckpt.py --src_ckpt_strategy SRC_CKPT_STRATEGY --dst_ckpt_strategy DST_CKPT_STRATEGY --src_ckpt_dir SRC_CKPT_DIR --dst_ckpt_dir DST_CKPT_DIR +``` + +src_ckpt_strategy:待转权重的分布式策略文件路径。 若为None,表示待转权重为完整权重; 若为切分策略文件,表示原始的权重对应的策略文件; 若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在SRC_CKPT_STRATEGY/merged_ckpt_strategy.ckpt路径下; + +dst_ckpt_strategy:目标权重的分布式策略文件路径。即step1中生成的分布式策略文件路径。 若为None,表示将待转权重合并为完整权重; 若为切分策略文件,表示目标卡数对应的策略文件 若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在DST_CKPT_STRATEGY/merged_ckpt_strategy.ckpt路径下; + +src_ckpt_dir: 待转权重路径,须按照SRC_CKPT_DIR/rank_{i}/checkpoint_{i}.ckpt存放,比如单一权重存放格式为SRC_CKPT_DIR/rank_0/checkpoint_0.ckpt。 + +dst_ckpt_dir:目标权重保存路径,为自定义空文件夹路径,转换后模型以DST_CKPT_DIR/rank_{i}/xxx.ckpt存放。 + +注:权重转换会根据你的parallel config自动进行转换,如果use_parallel为False,则是合并完整权重 + +#### 权重反向转换 + +## 评测 + +### lm-eval +lm-eval是一个大型综合评测框架,适用于众多通用领域测试集(MMLU、CEVAL等),同时支持方便的自定义数据测试。lm-eval适合评测客观题,且对base模型支持较好,故本教程中使用该框架对预训练获得的base模型进行评测。 + +#### 第一步 安装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``` + +#### 第二步 设置NPU执行环境 + +打开 `/lm-evaluation-harness/lm_eval/evaluator.py` + +在最上方添加两行 + +``` +import torch_npu +from torch_npu.contrib import transfer_to_npu +``` + +这样就可以在NPU环境下启动lm-eval + +补充:torch_npu的安装: +```pip3 install torch-npu==2.1.0.post8``` + +#### 第三步 处理数据集 +注:该步为自定义数据集所需步骤,测试通用测试集直接下载即可。 + +本例中使用的专业测试数据集是主观题,因此需要进行转换,我们使用大模型Qwen32B来生成选择题。 + +生成的选择题文件是 `output_filtered.csv` + +进一步执行如下代码 + +``` 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 = "mold_qa_dataset" # 输出目录 + + # 执行转换 + 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文件转换为huggingface的数据集形式 + +#### 第四步 让lm-eval知道这个数据集 + +在 `/lm-evaluation-harness/lm_eval/tasks` 下创建一个文件夹,命名为 `moju`, 在这个文件夹下创建一个 `moju.yaml`,内容为 + +``` +task: moju +dataset_path: /data/wjy/lm-eval-local-test/mold_qa_dataset +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 +``` + +至于我为什么知道该这么写,我是参考的 https://huggingface.co/datasets/haonan-li/cmmlu ,这个数据集在tasks文件夹下的yaml差不多是这么写的 + +#### 第五步 测试精度 + +``` +lm_eval --model hf --model_args pretrained=path/to/your/model --tasks moju --batch_size 1 --output_path path/to/save/output --log_samples +``` + +**注:需要在lm_eval根目录下运行** + +测试训练后的模型的额外步骤: +1. 运行命令需添加--trust_remote_code +2. mg2hf不能直接使用,需要把训练前仓库中的```tokenization_chatglm.py```、```modeling_chatglm.py```、```tokenizer_config.json```、 ```tokenizer.model```复制进去 + +--- +bug记录: + +jinja2.exceptions.UndefinedError: 'question' is undefined +原因:datasets版本不兼容 +解决方案: +``` +pip uninstall -y datasets +pip install datasets==2.18.0 +``` + +--- +_pad() got an unexpected keyword argument 'padding_side' +解决办法: +修改.../python3.8/site-packages/transformers/tokenization_utils_base.py的3505行 +在前面添加如下代码: + if padding_strategy == PaddingStrategy.DO_NOT_PAD: + encoded_inputs = self._pad( + encoded_inputs, + max_length=max_length, + padding_strategy=padding_strategy, + pad_to_multiple_of=pad_to_multiple_of, + return_attention_mask=return_attention_mask, + ) + return BatchEncoding(encoded_inputs, tensor_type=return_tensors) + +### opencompass + +#### 第一步 安装opencompass +pip install -U opencompass +可能会遇到报错AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'? +解决方法: +改为从源码安装,将requirements/runtime.txt中的pyext和rouge删掉 + +#### 第二步 +下载数据集并解压 +``` +wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip +unzip OpenCompassData-core-20240207.zip +``` + +#### 第三步 本地使用vllm部署模型 +使用quay.io/ascend/vllm-ascend docker镜像启动容器 +部署模型: +python -m vllm.entrypoints.api_server \ + --model /data/model/glm-4-9b-chat \ + --tensor-parallel-size 4 \ + --max-model-len 8192 \ + --dtype float16 \ + --trust-remote-code \ + --port 8000 \ + --compilation-config '{"custom_ops":["+rms_norm", "+rotary_embedding"]}' + +#### 第四步 设置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的配置,根据需要自由选择。 + +运行脚本参考.../examples/eval_api_demo.py, 导入需要评测的模型配置和需要测试的数据集即可 + +报错: +``` +Traceback (most recent call last): + File "/root/miniconda3/envs/fuck_mindformers/bin/opencompass", line 33, in + sys.exit(load_entry_point('opencompass', 'console_scripts', 'opencompass')()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/cxl/workspace/opencompass/opencompass/cli/main.py", line 259, in main + cfg = get_config_from_arg(args) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/data/cxl/workspace/opencompass/opencompass/utils/run.py", line 97, in get_config_from_arg + config = Config.fromfile(args.config, format_python_code=False) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 494, in fromfile + raise e + File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 492, in fromfile + cfg_dict, imported_names = Config._parse_lazy_import(filename) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 1081, in _parse_lazy_import + _base_cfg_dict, _base_imported_names = Config._parse_lazy_import( # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 1109, in _parse_lazy_import + exec( + File "/data/cxl/workspace/opencompass/opencompass/configs/datasets/bbh/bbh_gen_ee62e9.py", line 50, in + with open(os.path.join(hard_coded_path, 'lib_prompt', f'{_name}.txt'), 'r') as f: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/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 = '/data/cxl/workspace/opencompass/opencompass/configs/datasets/bbh' \ + + '/lib_prompt/' \ + + f'{_name}.txt' +``` + +#### 第五步 启动评测 +最快速的启动仅需要```opencompass /path/to/your/scripts``` + +如果需要额外的参数设置,参考[text](https://opencompass.readthedocs.io/zh-cn/latest/user_guides/experimentation.html) + +常用的配置有-r 断点续测,-w设置输出目录等 + +## 部署 \ No newline at end of file -- Gitee From 54c027f104ec31bdbd0737604f84396ef618c4e0 Mon Sep 17 00:00:00 2001 From: 222222222 <222222222@qq.com> Date: Mon, 25 Aug 2025 09:10:37 +0800 Subject: [PATCH 2/4] Upload contrast.md --- .../docs/source_zh_cn/example/contrast.md | 244 ++++++++ .../\345\256\214\346\225\264\347\211\210.md" | 578 ------------------ 2 files changed, 244 insertions(+), 578 deletions(-) create mode 100644 docs/mindformers/docs/source_zh_cn/example/contrast.md delete mode 100644 "docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" diff --git a/docs/mindformers/docs/source_zh_cn/example/contrast.md b/docs/mindformers/docs/source_zh_cn/example/contrast.md new file mode 100644 index 0000000000..b46b15aa4e --- /dev/null +++ b/docs/mindformers/docs/source_zh_cn/example/contrast.md @@ -0,0 +1,244 @@ +本文介绍mindspeed-llm和mindformers两种训练框架的测试比对 + +# 1. mindspeed-llm测试流程 + +## 1.1 环境安装 +``` + # 使能环境变量 + source /usr/local/Ascend/ascend-toolkit/set_env.sh + source /usr/local/Ascend/nnal/atb/set_env.sh + + # 安装MindSpeed加速库 + git clone https://gitee.com/ascend/MindSpeed.git + cd MindSpeed + git checkout 2c085cc9 # checkout commit from MindSpeed core_r0.8.0 in 2025.04.01 + pip install -r requirements.txt + pip3 install -e . + cd .. + + # 准备MindSpeed-LLM及Megatron-LM源码 + git clone https://gitee.com/ascend/MindSpeed-LLM.git + cd MindSpeed-LLM + mkdir logs + mkdir model_from_hf + mkdir dataset + mkdir ckpt + cd .. + git clone https://github.com/NVIDIA/Megatron-LM.git # megatron从github下载,请确保网络能访问 + cd Megatron-LM + git checkout core_r0.8.0 + cp -r megatron ../MindSpeed-LLM/ + cd ../MindSpeed-LLM + git checkout 2.1.0 + + # 安装torch、torchvision及apex + # 安装 torch-2.1.0 + pip install torch==2.1.0 + # 安装torch_npu依赖 + pip install pyyaml + pip install setuptools==65.7.0 + # 安装torch_npu + pip3 install torch-npu==2.1.0.post8 + + # 若使用pip命令安装失败,请使用下载链接或进入PyTorch官方网站进行查询下载对应版本。 + pip install torch_npu-2.1.0*-cp38-cp38m-linux_aarch64.whl + + # 安装对应版本的torchvision + pip install torchvision==0.16.0 + + # 安装apex for Ascend 参考 https://gitee.com/ascend/apex + git clone -b master https://gitee.com/ascend/apex.git + # 进入昇腾适配的APEX源码目录,执行命令编译生成二进制安装包(支持Python3.7-3.10) + cd apex + # 容器内git clone不了可以在容器外进行,然后把build.sh中的git clone注释掉 + bash scripts/build.sh --python=3.8 + # 执行如下命令安装。 + cd apex/dist + # 在本例中为apex-0.1+ascend-cp38-cp38-linux_aarch64.whl + pip install apex-0.1_ascend-*.whl + + pip install -r requirements.txt # 安装其余依赖库 +``` + +## 1.2 权重下载及转换 + +### 1.2.1 权重准备 + +hugging_face下载Qwen2.5-1.5B模型。 + +### 1.2.2 权重转换 + +``` +bash examples/mcore/qwen25/ckpt_convert_qwen25_hf2mcore.sh +``` +根据需要修改脚本中的如下参数 +【--target-tensor-parallel-size】 + +指明需要切分的TP数量,默认为1 + +【--target-pipeline-parallel-size】 + +指明需要切分的PP数量,默认为1 + +【--use-mcore-models】 + +设置是否转换为Megatron-Mcore权重,若不指定,则默认转换为Megatron-Legacy权重 + +【--model-type-hf】 + +huggingface模型类别,默认为llama2,目前支持的模型见 [model_cfg.json](https://gitee.com/ascend/ModelLink/blob/master/modellink/tasks/checkpoint/model_cfg.json) + +【--tokenizer-model】 + +需要指明到具体的分词器模型文件,如 tokenizer.model、tokenizer.json、qwen.tiktoken、None等,具体取决于huggingface中词表文件的格式形式 + +【--params-dtype】 + +指定权重转换后的权重精度模式,默认为fp16,如果源格式文件为bf16,则需要对应设置为bf16,影响推理或评估结果 + +## 1.3 数据集处理 + +### 1.3.1 数据下载 + +我们使用了内部工业领域专业数据 +您可以使用自己需要的数据集,例如可以简单使用alpaca数据集。 + +### 1.3.2 预训练数据集处理方法 + +``` +# 请按照您的真实环境修改 set_env.sh 路径 +source /usr/local/Ascend/ascend-toolkit/set_env.sh + +python ./preprocess_data.py \ + --input /path/to/dataset \ + --tokenizer-name-or-path /path/to/your/model \ + --tokenizer-type PretrainedFromHF \ + --handler-name SharegptStyleInstructionHandler \ + --output-prefix ./dataset/train \ + --workers 4 \ + --log-interval 1000 +``` + +【--input】 + +可以直接输入到数据集目录或具体文件,如果是目录,则处理全部文件, 支持 .parquet \ .csv \ .json \ .jsonl \ .txt \ .arrow 格式, 同一个文件夹下的数据格式需要保持一致 + +【--tokenizer-name-or-path】 + +指定分词器的名称或路径。这里使用的是本地路径,指向一个预训练的模型或分词器。 + +【--tokenizer-type】 + +指定分词器的类型。这里使用的是`PretrainedFromHF`,分词器是从Hugging Face预训练的。 + +【--handler-name】 +我们使用的数据集格式为shareGPT,故使用SharegptStyleInstructionHandler,如果您使用alpaca数据集,请使用AlpacaStyleInstructionHandler + +【--output-prefix】 + +指定输出文件的前缀。预处理后的数据将被保存在这个路径下,文件名将以`train`开头。 + +【--workers】 + +指定用于预处理的并发工作进程数。这里设置为4,意味着将有4个进程并行工作以提高预处理速度。 + +【--log-interval】 + +设置日志记录的间隔。这里设置为1000,意味着每处理1000条记录后,将记录一次日志信息。 + +如果正确执行,将会在./dataset下生成一些以train为前缀的idx、bin等数据集文件 + +## 1.4.大模型预训练启动 + +### 1.4.2 配置预训练参数 + +mcore分支的预训练脚本保存在 example/mcore 中各模型文件夹下:pretrain_xxx_xx.sh。本例是转换成mcore,因此使用的训练脚本为 + +./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh + +编辑脚本进行路径配置:包括**权重保存路径**、**权重加载路径**、**词表路径**、**数据集路径** + +``` +# 根据实际情况配置权重保存、权重加载、词表、数据集路径 + CKPT_SAVE_DIR="./ckpt/glm-4-9b" #权重保存路径 + CKPT_LOAD_DIR="./model_weights/glm-4-9b-mcore/" #权重加载路径 + TOKENIZER_MODEL="./model_from_hf/glm-4-9b" #词表路径 + DATA_PATH="./dataset/train_text_document" #数据集路径(此处意思为数据列表,并非一般的文件夹路径) +``` + +本例为单机单卡运行,则在脚本中设置为: + +``` + NPUS_PER_NODE=1 + MASTER_ADDR=locahost + MASTER_PORT=6000 + NNODES=1 + NODE_RANK=0 + WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES)) +``` + +启动命令: + +``` +bash ./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh +``` +# 2. mindformers测试流程 +## 2.1 环境搭建 +安装2.6.0 mindspore +```bash +pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.6.0/MindSpore/unified/aarch64/mindspore-2.6.0-cp311-cp311-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple +``` +安装1.5.0 mindformers 及相关环境 +```bash +git clone -b v1.5.0 https://gitee.com/mindspore/mindformers.git +cd mindformers +bash build.sh +``` + +## 2.2 数据转换 +使用内部工业数据微调数据集 +您可将其替换为公共数据集alpaca + +注意,您应当将数据集里的每一行数据按如下格式处理: + +``` json +{ + "type": "chatml", + "conversations": [ + { + "from": "human", + "value": "Give three tips for staying healthy." + }, + { + "from": "gpt", + "value": "1.Eat a balanced diet and make sure to include plenty of fruits and vegetables. \n2. Exercise regularly to keep your body active and strong. \n3. Get enough sleep and maintain a consistent sleep schedule." + } + ] +}, +``` + + +生成MindRecord格式数据集 +```bash +python mindformers/tools/dataset_preprocess/glm/glm_preprocess.py \ + --input_glob /path/to/dataset \ + --vocab_file /path/tokenizer.model \ + --seq_length 8192 \ + --output_file /path/alpaca-messages.mindrecord +``` + +## 2.3 启动训练 +``` +python run_mindformer.py \ +--register_path research/qwen2_5 \ +--config research/qwen2_5/finetune_qwen2_5_0_5b_8k.yaml \ +--use_parallel False \ +--run_mode finetune \ +--train_dataset_dir ./path/alpaca-data.mindrecord +``` +# 3. 训练效果比对 +性能比对: +![alt text](image.png) + +精度比对: +![alt text](image-1.png) \ No newline at end of file diff --git "a/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" "b/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" deleted file mode 100644 index 1a52f2ded4..0000000000 --- "a/docs/mindformers/docs/source_zh_cn/example/glm4/\345\256\214\346\225\264\347\211\210.md" +++ /dev/null @@ -1,578 +0,0 @@ -## 背景 -虚竹大模型:基于910B训练,部署于310P的经济型工业领域大模型,专精工业领域知识问答。在虚竹大模型的训练、微调、测试至部署过程中,形成了完整的昇腾生态上的大模型最佳实践,以此文档进行记录,供广大希望借鉴高性价比训练部署流程的企业或是希望体验国产大模型生态的个人参考。 - -训练上,分为两条线,一条使用mindspeed(pytorch后端)框架进行预训练,虽然是国产训练框架,但是在训练后端上仍使用的是pytorch这一非国产框架,故另一条线是使用mindformers框架进行glm-9b-chat的sft。 - -测试上,首先对虚竹大模型专精的工业领域使用测试,得到了高分后,又希望它在通用领域不要有很大的降低,因此在通用领域如MMLU、CEVAL、IFEVAL等进行测试,发现也有不错的效果,证明我们的国产化训练流程是成功可靠的。在测试流程中,我们形成了一些评测经验,总结如下:lm-eval适合客观题、base模型的评测,opencompass适合主观题、chat模型的评测。 - -具体的预训练、sft、测试、部署细节,请参考对应章节。 - -## mindspeed(pytorch后端)预训练流程 -### 1. 环境安装 - -#### 1.1 镜像拉取: - -http://mirrors.cn-central-221.ovaijisuan.com/detail/143.html - -docker pull swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/pytorch2_1_0_kernels:PyTorch2.1.0-cann8.0.RC2_py_3.9-euler_2.8.3-64GB - -把下列命令保存至docker_run.sh脚本。 - -docker run -it -u root \ - --device=/dev/davinci0 \ - --device=/dev/davinci1 \ - --device=/dev/davinci2 \ - --device=/dev/davinci3 \ - --device=/dev/davinci4 \ - --device=/dev/davinci5 \ - --device=/dev/davinci6 \ - --device=/dev/davinci7 \ - --device=/dev/davinci_manager \ - --device=/dev/devmm_svm \ - --device=/dev/hisi_hdc \ - -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ - -v /usr/local/dcmi:/usr/local/dcmi \ - -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ - -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ - -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ - -v /data0/aicc:/data0/ma-user/work/aicc \ #挂载工作目录 - --shm-size=128g \ #设置共享内存 - --name pytorch_ma_2 \ - --entrypoint=/bin/bash \ - swr.cn-central-221.ovaijisuan.com/wh-aicc-fae/pytorch2_1_0_kernels:PyTorch2.1.0-cann8.0.RC2_py_3.9-euler_2.8.3-64GB - -**注意:以上脚本中反斜杠后不能有空格等内容,否则无法成功创建容器。** - -启动容器: - -docker start pytorch_ma_2 - -docker exec -it pytorch_ma_2 /bin/bash - -#### 1.2 环境搭建 - -``` - # 使能环境变量 - source /usr/local/Ascend/ascend-toolkit/set_env.sh - source /usr/local/Ascend/nnal/atb/set_env.sh - - # 安装MindSpeed加速库 - git clone https://gitee.com/ascend/MindSpeed.git - cd MindSpeed - git checkout 2c085cc9 # checkout commit from MindSpeed core_r0.8.0 in 2025.04.01 - pip install -r requirements.txt - pip3 install -e . - cd .. - - # 准备MindSpeed-LLM及Megatron-LM源码 - git clone https://gitee.com/ascend/MindSpeed-LLM.git - cd MindSpeed-LLM - mkdir logs - mkdir model_from_hf - mkdir dataset - mkdir ckpt - cd .. - git clone https://github.com/NVIDIA/Megatron-LM.git # megatron从github下载,请确保网络能访问 - cd Megatron-LM - git checkout core_r0.8.0 - cp -r megatron ../MindSpeed-LLM/ - cd ../MindSpeed-LLM - git checkout 2.1.0 - - # 安装torch、torchvision及apex - # 安装 torch-2.1.0 - pip install torch==2.1.0 - # 安装torch_npu依赖 - pip install pyyaml - pip install setuptools==65.7.0 - # 安装torch_npu - pip3 install torch-npu==2.1.0.post8 - - # 若使用pip命令安装失败,请使用下载链接或进入PyTorch官方网站进行查询下载对应版本。 - pip install torch_npu-2.1.0*-cp38-cp38m-linux_aarch64.whl - - # 安装对应版本的torchvision - pip install torchvision==0.16.0 - - # 安装apex for Ascend 参考 https://gitee.com/ascend/apex - git clone -b master https://gitee.com/ascend/apex.git - # 进入昇腾适配的APEX源码目录,执行命令编译生成二进制安装包(支持Python3.7-3.10) - cd apex - # 容器内git clone不了可以在容器外进行,然后把build.sh中的git clone注释掉 - bash scripts/build.sh --python=3.8 - # 执行如下命令安装。 - cd apex/dist - # 在本例中为apex-0.1+ascend-cp38-cp38-linux_aarch64.whl - pip install apex-0.1_ascend-*.whl - - pip install -r requirements.txt # 安装其余依赖库 -``` - - - -### 2.权重下载及转换 - -#### 2.1 权重准备 - -hugging_face下载glm-4-9b-chat模型。 - -#### 2.2 权重转换 - -``` -bash examples/mcore/glm4/ckpt_convert_glm4_hf2mcore.sh -``` -【--target-tensor-parallel-size】 - -指明需要切分的TP数量,默认为1 - -【--target-pipeline-parallel-size】 - -指明需要切分的PP数量,默认为1 - -【--use-mcore-models】 - -设置是否转换为Megatron-Mcore权重,若不指定,则默认转换为Megatron-Legacy权重 - -【--model-type-hf】 - -huggingface模型类别,默认为llama2,目前支持的模型见 [model_cfg.json](https://gitee.com/ascend/ModelLink/blob/master/modellink/tasks/checkpoint/model_cfg.json) - -【--tokenizer-model】 - -需要指明到具体的分词器模型文件,如 tokenizer.model、tokenizer.json、qwen.tiktoken、None等,具体取决于huggingface中词表文件的格式形式 - -【--params-dtype】 - -指定权重转换后的权重精度模式,默认为fp16,如果源格式文件为bf16,则需要对应设置为bf16,影响推理或评估结果 - -### 3.数据集处理 - -#### 3.1 预训练数据下载 - -使用内部工业领域专业数据mold_sft_textbook_160k_filtered_v2.jsonl - -至 "./mindspeed-llm/dataset" 目录 - -#### 3.2 预训练数据集处理方法 - -``` -# 请按照您的真实环境修改 set_env.sh 路径 -source /usr/local/Ascend/ascend-toolkit/set_env.sh - -python ./preprocess_data.py \ - --input ./dataset/mold_sft_textbook_160k_filtered_v2.jsonl \ - --tokenizer-name-or-path /path/to/your/model \ - --tokenizer-type PretrainedFromHF \ - --handler-name GeneralPretrainHandler \ - --output-prefix ./dataset/train \ - --json-keys text \ - --workers 4 \ - --log-interval 1000 -``` - -【--input】 - -可以直接输入到数据集目录或具体文件,如果是目录,则处理全部文件, 支持 .parquet \ .csv \ .json \ .jsonl \ .txt \ .arrow 格式, 同一个文件夹下的数据格式需要保持一致 - -【--tokenizer-name-or-path】 - -指定分词器的名称或路径。这里使用的是本地路径,指向一个预训练的模型或分词器。 - -【--tokenizer-type】 - -指定分词器的类型。这里使用的是`PretrainedFromHF`,分词器是从Hugging Face预训练的。 - -【--handler-name】 - -当前预训练默认使用 `GeneralPretrainHandler`,支持的是预训练数据风格,提取数据的`text`列 - -【--output-prefix】 - -指定输出文件的前缀。预处理后的数据将被保存在这个路径下,文件名将以`train`开头。 - -【--json-keys】 - -从文件中提取的列名列表,默认为 `text`,可以为 `text`, `input`, `title` 等多个输入,结合具体需求及数据集内容使用,如: - -``` ---json-keys text input output \ -``` - -【--workers】 - -指定用于预处理的并发工作进程数。这里设置为4,意味着将有4个进程并行工作以提高预处理速度。 - -【--log-interval】 - -设置日志记录的间隔。这里设置为1000,意味着每处理1000条记录后,将记录一次日志信息。 - -### 4.大模型预训练启动 - -#### 4.1 准备工作 - -配置脚本前需要完成前置准备工作,包括:**环境安装**、**数据集准备及处理**、**Huggingface权重转换**,详情可查看对应章节。 - -#### 4.2 配置预训练参数 - -mcore分支的预训练脚本保存在 example/mcore 中各模型文件夹下:pretrain_xxx_xx.sh。本例是转换成mcore,因此使用的训练脚本为 - -./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh - -编辑脚本进行路径配置:包括**权重保存路径**、**权重加载路径**、**词表路径**、**数据集路径** - -``` -# 根据实际情况配置权重保存、权重加载、词表、数据集路径 - CKPT_SAVE_DIR="./ckpt/glm-4-9b" #权重保存路径 - CKPT_LOAD_DIR="./model_weights/glm-4-9b-mcore/" #权重加载路径 - TOKENIZER_MODEL="./model_from_hf/glm-4-9b" #词表路径 - DATA_PATH="./dataset/train_text_document" #数据集路径(此处意思为数据列表,并非一般的文件夹路径) -``` - -本例为单机运行,则在脚本中设置为: - -``` - NPUS_PER_NODE=8 - MASTER_ADDR=locahost - MASTER_PORT=6000 - NNODES=1 - NODE_RANK=0 - WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES)) -``` - -启动命令: - -``` -bash ./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh -``` - -## mindformers(全国产化)sft流程 - -### 环境搭建 -安装2.6.0 mindspore -```bash -pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.6.0/MindSpore/unified/aarch64/mindspore-2.6.0-cp311-cp311-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple -``` -安装1.5.0 mindformers 及相关环境 -```bash -git clone -b v1.5.0 https://gitee.com/mindspore/mindformers.git -cd mindformers -bash build.sh -``` - -### 数据转换 -使用内部工业数据微调数据集merged_all_sft_250710.jsonl - -生成MindRecord格式数据集 -```bash -python mindformers/tools/dataset_preprocess/glm4/glm4_preprocess.py \ - --input_glob /path/merged_all_sft_250710.jsonl \ - --vocab_file /path/tokenizer.model \ - --seq_length 8192 \ - --output_file /path/alpaca-messages.mindrecord -``` - -### 多卡训练 - -#### 权重分割 -``` -python convert_weight.py --model glm4 --input_path HF_CKPT_PATH --output_path MS_NOT_CONCAT_CKPT_PATH --dtype bf16 --config YAML_PATH -``` -输出为一整个模型权重的ckpt文件 -注:如果提示trust_remote_code相关错误,按照提示设置trust_remote_code=True即可 -注:由于mindformers的文档存在相当程度的混淆,是否需要由hf权重转换为mindspore权重待确认。 - -#### 并行策略配置与训练启动 -在.../mindformers/configs/glm4/finetune_glm4_9b.yaml的基础上作修改 -注意:model_config的seq_length要和数据集一致,否则会有其他报错 - -设置如下环境变量: - -```bash -export MS_ASCEND_CHECK_OVERFLOW_MODE=INFNAN_MODE -``` - -第一次训练: -``` -bash scripts/msrun_launcher.sh "run_mindformer.py \ - --config configs/glm4/finetune_glm4_9b.yaml \ - --load_checkpoint /path/to/ckpt \ - --auto_trans_ckpt True \ - --train_dataset /path/todataset \ - --run_mode finetune" 8 -``` -注:每次转换结束后需要将strategy和transformed_checkpoint保存到自定义文件夹,因为每次拉起新的任务,如果开启了权重自动转换(auto_trans_ckpt=True),会将这两个文件夹清空,然后保存最新任务的转换结果。 - -断点恢复训练: -``` ---load_checkpoint: checkpoint_file_or_dir_path ---resume_training: True ---src_strategy_path_or_dir: 分布式策略文件路径 ---auto_trans_ckpt False -``` - -#### 权重合并 -``` ---only_save_strategy: True -python mindformers/tools/transform_ckpt.py --src_ckpt_strategy SRC_CKPT_STRATEGY --dst_ckpt_strategy DST_CKPT_STRATEGY --src_ckpt_dir SRC_CKPT_DIR --dst_ckpt_dir DST_CKPT_DIR -``` - -src_ckpt_strategy:待转权重的分布式策略文件路径。 若为None,表示待转权重为完整权重; 若为切分策略文件,表示原始的权重对应的策略文件; 若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在SRC_CKPT_STRATEGY/merged_ckpt_strategy.ckpt路径下; - -dst_ckpt_strategy:目标权重的分布式策略文件路径。即step1中生成的分布式策略文件路径。 若为None,表示将待转权重合并为完整权重; 若为切分策略文件,表示目标卡数对应的策略文件 若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在DST_CKPT_STRATEGY/merged_ckpt_strategy.ckpt路径下; - -src_ckpt_dir: 待转权重路径,须按照SRC_CKPT_DIR/rank_{i}/checkpoint_{i}.ckpt存放,比如单一权重存放格式为SRC_CKPT_DIR/rank_0/checkpoint_0.ckpt。 - -dst_ckpt_dir:目标权重保存路径,为自定义空文件夹路径,转换后模型以DST_CKPT_DIR/rank_{i}/xxx.ckpt存放。 - -注:权重转换会根据你的parallel config自动进行转换,如果use_parallel为False,则是合并完整权重 - -#### 权重反向转换 - -## 评测 - -### lm-eval -lm-eval是一个大型综合评测框架,适用于众多通用领域测试集(MMLU、CEVAL等),同时支持方便的自定义数据测试。lm-eval适合评测客观题,且对base模型支持较好,故本教程中使用该框架对预训练获得的base模型进行评测。 - -#### 第一步 安装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``` - -#### 第二步 设置NPU执行环境 - -打开 `/lm-evaluation-harness/lm_eval/evaluator.py` - -在最上方添加两行 - -``` -import torch_npu -from torch_npu.contrib import transfer_to_npu -``` - -这样就可以在NPU环境下启动lm-eval - -补充:torch_npu的安装: -```pip3 install torch-npu==2.1.0.post8``` - -#### 第三步 处理数据集 -注:该步为自定义数据集所需步骤,测试通用测试集直接下载即可。 - -本例中使用的专业测试数据集是主观题,因此需要进行转换,我们使用大模型Qwen32B来生成选择题。 - -生成的选择题文件是 `output_filtered.csv` - -进一步执行如下代码 - -``` 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 = "mold_qa_dataset" # 输出目录 - - # 执行转换 - 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文件转换为huggingface的数据集形式 - -#### 第四步 让lm-eval知道这个数据集 - -在 `/lm-evaluation-harness/lm_eval/tasks` 下创建一个文件夹,命名为 `moju`, 在这个文件夹下创建一个 `moju.yaml`,内容为 - -``` -task: moju -dataset_path: /data/wjy/lm-eval-local-test/mold_qa_dataset -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 -``` - -至于我为什么知道该这么写,我是参考的 https://huggingface.co/datasets/haonan-li/cmmlu ,这个数据集在tasks文件夹下的yaml差不多是这么写的 - -#### 第五步 测试精度 - -``` -lm_eval --model hf --model_args pretrained=path/to/your/model --tasks moju --batch_size 1 --output_path path/to/save/output --log_samples -``` - -**注:需要在lm_eval根目录下运行** - -测试训练后的模型的额外步骤: -1. 运行命令需添加--trust_remote_code -2. mg2hf不能直接使用,需要把训练前仓库中的```tokenization_chatglm.py```、```modeling_chatglm.py```、```tokenizer_config.json```、 ```tokenizer.model```复制进去 - ---- -bug记录: - -jinja2.exceptions.UndefinedError: 'question' is undefined -原因:datasets版本不兼容 -解决方案: -``` -pip uninstall -y datasets -pip install datasets==2.18.0 -``` - ---- -_pad() got an unexpected keyword argument 'padding_side' -解决办法: -修改.../python3.8/site-packages/transformers/tokenization_utils_base.py的3505行 -在前面添加如下代码: - if padding_strategy == PaddingStrategy.DO_NOT_PAD: - encoded_inputs = self._pad( - encoded_inputs, - max_length=max_length, - padding_strategy=padding_strategy, - pad_to_multiple_of=pad_to_multiple_of, - return_attention_mask=return_attention_mask, - ) - return BatchEncoding(encoded_inputs, tensor_type=return_tensors) - -### opencompass - -#### 第一步 安装opencompass -pip install -U opencompass -可能会遇到报错AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'? -解决方法: -改为从源码安装,将requirements/runtime.txt中的pyext和rouge删掉 - -#### 第二步 -下载数据集并解压 -``` -wget https://github.com/open-compass/opencompass/releases/download/0.2.2.rc1/OpenCompassData-core-20240207.zip -unzip OpenCompassData-core-20240207.zip -``` - -#### 第三步 本地使用vllm部署模型 -使用quay.io/ascend/vllm-ascend docker镜像启动容器 -部署模型: -python -m vllm.entrypoints.api_server \ - --model /data/model/glm-4-9b-chat \ - --tensor-parallel-size 4 \ - --max-model-len 8192 \ - --dtype float16 \ - --trust-remote-code \ - --port 8000 \ - --compilation-config '{"custom_ops":["+rms_norm", "+rotary_embedding"]}' - -#### 第四步 设置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的配置,根据需要自由选择。 - -运行脚本参考.../examples/eval_api_demo.py, 导入需要评测的模型配置和需要测试的数据集即可 - -报错: -``` -Traceback (most recent call last): - File "/root/miniconda3/envs/fuck_mindformers/bin/opencompass", line 33, in - sys.exit(load_entry_point('opencompass', 'console_scripts', 'opencompass')()) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/data/cxl/workspace/opencompass/opencompass/cli/main.py", line 259, in main - cfg = get_config_from_arg(args) - ^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/data/cxl/workspace/opencompass/opencompass/utils/run.py", line 97, in get_config_from_arg - config = Config.fromfile(args.config, format_python_code=False) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 494, in fromfile - raise e - File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 492, in fromfile - cfg_dict, imported_names = Config._parse_lazy_import(filename) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 1081, in _parse_lazy_import - _base_cfg_dict, _base_imported_names = Config._parse_lazy_import( # noqa: E501 - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/mmengine/config/config.py", line 1109, in _parse_lazy_import - exec( - File "/data/cxl/workspace/opencompass/opencompass/configs/datasets/bbh/bbh_gen_ee62e9.py", line 50, in - with open(os.path.join(hard_coded_path, 'lib_prompt', f'{_name}.txt'), 'r') as f: - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - File "/root/miniconda3/envs/fuck_mindformers/lib/python3.11/site-packages/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 = '/data/cxl/workspace/opencompass/opencompass/configs/datasets/bbh' \ - + '/lib_prompt/' \ - + f'{_name}.txt' -``` - -#### 第五步 启动评测 -最快速的启动仅需要```opencompass /path/to/your/scripts``` - -如果需要额外的参数设置,参考[text](https://opencompass.readthedocs.io/zh-cn/latest/user_guides/experimentation.html) - -常用的配置有-r 断点续测,-w设置输出目录等 - -## 部署 \ No newline at end of file -- Gitee From 13aa83d7db9df3391e925179ffeae31d347bd3e8 Mon Sep 17 00:00:00 2001 From: 222222222 <222222222@qq.com> Date: Mon, 25 Aug 2025 09:16:21 +0800 Subject: [PATCH 3/4] rename the new doc as 'compare_with_mindspeed' --- .../compare_with_mindspeed.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/mindformers/docs/source_zh_cn/example/{contrast.md => compare_with_mindspeed/compare_with_mindspeed.md} (100%) diff --git a/docs/mindformers/docs/source_zh_cn/example/contrast.md b/docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md similarity index 100% rename from docs/mindformers/docs/source_zh_cn/example/contrast.md rename to docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md -- Gitee From 1d091fcc826a6907edf8c575140fb79669a9e83b Mon Sep 17 00:00:00 2001 From: 222222222 <222222222@qq.com> Date: Mon, 25 Aug 2025 11:38:45 +0800 Subject: [PATCH 4/4] fix codespell, tab, and markdown problems --- .../compare_with_mindspeed.md | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md b/docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md index b46b15aa4e..d77beb3221 100644 --- a/docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md +++ b/docs/mindformers/docs/source_zh_cn/example/compare_with_mindspeed/compare_with_mindspeed.md @@ -3,6 +3,7 @@ # 1. mindspeed-llm测试流程 ## 1.1 环境安装 + ``` # 使能环境变量 source /usr/local/Ascend/ascend-toolkit/set_env.sh @@ -51,11 +52,11 @@ # 进入昇腾适配的APEX源码目录,执行命令编译生成二进制安装包(支持Python3.7-3.10) cd apex # 容器内git clone不了可以在容器外进行,然后把build.sh中的git clone注释掉 - bash scripts/build.sh --python=3.8 - # 执行如下命令安装。 + bash scripts/build.sh --python=3.8 + # 执行如下命令安装。 cd apex/dist # 在本例中为apex-0.1+ascend-cp38-cp38-linux_aarch64.whl - pip install apex-0.1_ascend-*.whl + pip install apex-0.1_ascend-*.whl pip install -r requirements.txt # 安装其余依赖库 ``` @@ -71,6 +72,7 @@ hugging_face下载Qwen2.5-1.5B模型。 ``` bash examples/mcore/qwen25/ckpt_convert_qwen25_hf2mcore.sh ``` + 根据需要修改脚本中的如下参数 【--target-tensor-parallel-size】 @@ -170,7 +172,7 @@ mcore分支的预训练脚本保存在 example/mcore 中各模型文件夹下: ``` NPUS_PER_NODE=1 - MASTER_ADDR=locahost + MASTER_ADDR=localhost MASTER_PORT=6000 NNODES=1 NODE_RANK=0 @@ -182,13 +184,17 @@ mcore分支的预训练脚本保存在 example/mcore 中各模型文件夹下: ``` bash ./MindSpeed-LLM/examples/mcore/glm4/pretrain_glm4_9b_8k_ptd.sh ``` + # 2. mindformers测试流程 ## 2.1 环境搭建 安装2.6.0 mindspore + ```bash pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.6.0/MindSpore/unified/aarch64/mindspore-2.6.0-cp311-cp311-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple ``` + 安装1.5.0 mindformers 及相关环境 + ```bash git clone -b v1.5.0 https://gitee.com/mindspore/mindformers.git cd mindformers @@ -217,8 +223,8 @@ bash build.sh }, ``` - 生成MindRecord格式数据集 + ```bash python mindformers/tools/dataset_preprocess/glm/glm_preprocess.py \ --input_glob /path/to/dataset \ @@ -228,6 +234,7 @@ python mindformers/tools/dataset_preprocess/glm/glm_preprocess.py \ ``` ## 2.3 启动训练 + ``` python run_mindformer.py \ --register_path research/qwen2_5 \ @@ -236,9 +243,10 @@ python run_mindformer.py \ --run_mode finetune \ --train_dataset_dir ./path/alpaca-data.mindrecord ``` + # 3. 训练效果比对 性能比对: ![alt text](image.png) 精度比对: -![alt text](image-1.png) \ No newline at end of file +![alt text](image-1.png) -- Gitee