opencompass
OpenCompass 是开源大模型评测框架。本文在单卡 910B 上对 Qwen2-0.5B-Instruct 跑 demo_gsm8k_chat_gen。
阅读本文前,请先按 快速安装昇腾环境 准备好 CANN 与驱动。
前置条件
硬件
Atlas 800T / 900 A2 训练系列(Ascend 910B)。本文覆盖单卡。
软件
类别 |
要求 |
|---|---|
CANN |
toolkit 与驱动已安装,并能 |
Python |
落在官方配套表给出的范围内,并满足 OpenCompass 下限;上游要求 |
PyTorch |
安装官方当前推荐的 |
OpenCompass |
从 GitHub 克隆 Release tag,用 |
模型 |
|
数据 |
GSM8K 的 |
本文验证环境:Atlas 900 A2 PODc、Ascend 910B4、Python 3.12、镜像 swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.1.0-910b-ubuntu22.04-py3.12。
1. 加载 CANN 环境
加载 CANN 环境变量,并把 /usr/local/sbin 加入 PATH。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export PATH=/usr/local/sbin:/usr/local/bin:$PATH
echo cann_env_loaded True
执行之后的结果如下:
cann_env_loaded True
2. 检查环境
查看 NPU 设备:
npu-smi info
确认 CANN 已加载,并且 npu-smi 在 PATH 里。
test -n "$ASCEND_HOME_PATH" && command -v npu-smi >/dev/null && echo cann_ready True
执行之后的结果如下:
cann_ready True
3. 安装 PyTorch NPU
安装官方当前推荐的 torch_npu,同时安装 numpy 和 pyyaml。主索引是 CPU 轮子源,extra 是 PyPI。结果里的 xxx 是实际版本号,torch 这一行带 +cpu。
python -m pip install -q \
--index-url https://download.pytorch.org/whl/cpu \
--extra-index-url https://pypi.org/simple \
torch_npu numpy pyyaml
python -c "import numpy, yaml, torch, torch_npu; print('torch', torch.__version__); print('torch_npu', torch_npu.__version__); print('npu_available', torch.npu.is_available())"
执行之后的结果如下:
torch xxx+cpu
torch_npu xxx
npu_available True
4. 安装 OpenCompass
把源码克隆到 $HOME/opencompass-qs。<ref> 换成目标 Release tag,再用 --no-build-isolation 做可编辑安装。transformers 使用 4.x,sentence-transformers 使用 5.2 之前的版本。结果里的 xxx 是实际版本号。
mkdir -p "$HOME/opencompass-qs"
cd "$HOME/opencompass-qs"
git clone --depth 1 --branch <ref> \
https://github.com/open-compass/opencompass.git opencompass
cd opencompass
python -m pip install -q --no-build-isolation -e . \
'transformers>=4.41,<5' \
'sentence-transformers>=4.41,<5.2'
python -c "import torch, torch_npu, opencompass; print('npu_available', torch.npu.is_available()); print('opencompass', opencompass.__version__)"
执行之后的结果如下:
npu_available True
opencompass xxx
5. 准备模型和数据
从 Hugging Face 下载权重,并确认 config.json 存在。结果里的 xxx 是本地目录。
model_path=$(python -c "from huggingface_hub import snapshot_download; print(snapshot_download('Qwen/Qwen2-0.5B-Instruct'))")
printf '%s\n' "$model_path"
test -f "$model_path/config.json" && echo has_config True
执行之后的结果如下:
xxx
has_config True
把 GSM8K 的 train.jsonl 和 test.jsonl 放到源码树的 data/gsm8k/。
mkdir -p "$HOME/opencompass-qs/opencompass/data/gsm8k"
cd "$HOME/opencompass-qs/opencompass/data/gsm8k"
curl -fL --retry 3 --retry-delay 5 --connect-timeout 30 \
-o test.jsonl \
https://raw.githubusercontent.com/openai/grade-school-math/master/grade_school_math/data/test.jsonl
curl -fL --retry 3 --retry-delay 5 --connect-timeout 30 \
-o train.jsonl \
https://raw.githubusercontent.com/openai/grade-school-math/master/grade_school_math/data/train.jsonl
test -s test.jsonl && test -s train.jsonl && echo gsm8k_ready True
执行之后的结果如下:
gsm8k_ready True
Note
<model_path> 是第 6 节 eval_qwen2_gsm8k.py 里的变量,换成第 5 节这条下载命令打印的本地目录。
6. 在 NPU 上评测
下面两份文件保存到源码目录 $HOME/opencompass-qs/opencompass。
项 |
含义 |
|---|---|
|
固定随机种子 |
|
贪心解码 |
|
单次生成最多 32 个 token |
保存为 npu_chat.py。模型子类在生成前打印设备,并调用 set_seed(42)。
from transformers import set_seed
from opencompass.models.huggingface_above_v4_33 import HuggingFacewithChatTemplate
from opencompass.registry import MODELS
@MODELS.register_module()
class HuggingFaceNPUChat(HuggingFacewithChatTemplate):
def generate(self, inputs, max_out_len, **kwargs):
set_seed(42)
print('\nopencompass_model_device', next(self.model.parameters()).device, flush=True)
return super().generate(inputs, max_out_len, **kwargs)
将 <model_path> 换成第 5 节下载命令打印的本地目录。保存为 eval_qwen2_gsm8k.py。
from mmengine.config import read_base
from npu_chat import HuggingFaceNPUChat
with read_base():
from opencompass.configs.datasets.demo.demo_gsm8k_chat_gen import gsm8k_datasets
gsm8k_datasets[0]['infer_cfg']['inferencer']['max_out_len'] = 32
datasets = gsm8k_datasets
models = [
dict(
type=HuggingFaceNPUChat,
abbr='qwen2-0.5b-instruct',
path=r'<model_path>',
max_out_len=32,
batch_size=4,
model_kwargs=dict(torch_dtype='bfloat16'),
generation_kwargs=dict(do_sample=False),
run_cfg=dict(num_gpus=1),
)
]
运行评测,并打印 summary。
cd "$HOME/opencompass-qs/opencompass"
export PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}"
opencompass eval_qwen2_gsm8k.py --debug -w "$HOME/opencompass-qs/work" 2>&1
echo '--- summary ---'
cat "$HOME/opencompass-qs/work"/*/summary/summary_*.txt
完整输出较长,其中应包含:
...
opencompass_model_device npu:0
...
tabulate format
...
| dataset | version | metric | mode | qwen2-0.5b-instruct |
...
| demo_gsm8k | ... | accuracy | gen | 3.12 |
...
demo_gsm8k: {'accuracy': 3.125}
...
相关链接
数据集、模型接入和多卡评测等其余用法与社区文档相同。
官方文档:OpenCompass 文档
安装说明:Installation
上游评测入门:Quick Start
本文所用模型:Qwen2-0.5B-Instruct
GSM8K 官方数据:openai/grade-school-math