Skip to content

Commit

Permalink
merge, 增加了drop和xsum,完善了输出,修复了推理格式
Browse files Browse the repository at this point in the history
  • Loading branch information
PPMark0712 committed Sep 4, 2024
1 parent 2f5991b commit 36021fc
Show file tree
Hide file tree
Showing 23 changed files with 237 additions and 530 deletions.
101 changes: 67 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# lm-cute-eval:一个轻量级的大语言模型评测框架

这是一个轻量级的大语言模型评测框架,目前支持少量常用评测集,其优点在于不同任务模块之间解耦,扩展性强,可以较方便地添加新的任务。该评测框架使用vllm库进行推理,暂时不支持使用transformers自带的推理函数
这是一个轻量级的大语言模型评测框架,目前支持少量常用评测集,其优点在于不同任务模块之间解耦,扩展性强,可以较方便地添加新的任务。该评测框架使用transformers和vllm库进行推理

## 开始运行

Expand All @@ -21,69 +21,89 @@ unzip data.zip
编辑run.sh脚本,需要考虑的参数如下:

```
模型配置
model_path: 模型绝对路径
model_type: 模型类型,用于控制prompt格式,默认default
sampling_params: vllm推理框架使用的参数
tasks: 需要评测的任务名称,用空格隔开,例如需要评测mmlu和gsm8k,则在命令中加入--tasks gsm8k mmlu
save_name: 输出文件夹名称
model_type: 模型变量类型,默认vllm,目前可选vllm和hf
format_type: 模型类型,用于控制prompt格式,默认default
任务配置
tasks: 需要评测的任务名称,用空格隔开,例如需要评测mmlu和gsm8k,则在命令中加入--tasks gsm8k mmlu,也可以包含一个all,自动评测所有任务。
config_path: 任务配置文件路径,缺失值自动填充为对应任务文件夹中的默认config。
data_path(不需要修改): 数据集路径。
保存配置
output_path: 输出目录,默认output
save_name: 输出文件夹名称。
save_infer_results: 保存推理结果,而非只保存一个分数
config_path: 任务配置文件路径
output_path: 输出目录,默认./output
save_infer_texts: 保存便于阅读的输入输出文本到infer_result{round_idx}.txt
no_timestamp: 输出文件夹不包含时间,若包含时间,则会保存到"./output/{time}_{model_name}/"中
temp_file_path(不需要修改): 临时文件保存目录,主要用于humaneval评测集。
推理配置
rounds: 推理轮数(用于其他实验,需要自己控制中间对话的prompt,具体见lm_cute_eval/get_multiround_prompt.py。
seed: 随机种子。
use_cpu(不需要使用): 使用CPU推理(用于debug)。
temperature:模型推理参数
top_p:模型推理参数
top_k:模型推理参数
max_new_tokens: 最多生成的token数量,默认160,不同数据集不一样,且本框架不可以分开设置每个任务的new token数量,所以取了个较大的值。
```

可能不需要考虑的参数:

```
rounds: 推理轮数,默认1,仅用于其他实验
refine_prompt: 多轮推理过程中的prompt,仅用于其他实验
temp_file_path: 临时文件保存目录,主要用于humaneval评测集
```

例如你想要评测mmlu和gsm8k
例如你想用mmlu和gsm8k评测两个模型

```bash
export CUDA_VISIBLE_DEVICES=0
export CUDA_VISIBLE_DEVICES=3
export TOKENIZERS_PARALLELISM=false

declare -A models=(
["model_name"]="model_path"
["model_name1"]="model_path1"
["model_name2"]="model_path2"
)

for model_name in "${!models[@]}"; do
model_path=${models[$model_name]}
python main.py \
--model_path "$model_path" \
--model_type default \
--tasks gsm8k mmlu \
--model_type vllm \
--format_type default \
--tasks mmlu gsm8k \
--save_name "$model_name" \
--save_infer_texts \
--save_infer_results \
--config_path config.json \
--output_path output
--config_path "config.json" \
--output_path output/debug \
--max_new_tokens 180 \
--temperature 0.1 \
--top_p 0.2 \
--top_k 20 \

done

```

配置config:

根目录下,有默认config.json文件,可以根据需要来修改config中的内容,其格式如下:
根目录下,有默认config.json文件,在每个数据集的config文件中也又默认值,可以根据需要来修改config中的内容,其格式如下:

```
{
task_name_1: task_config_1,
task_name_2: taks_config_2,
...
task_name_1: task_config_1,
task_name_2: taks_config_2,
...
}
例如:
{
"gsm8k": {
"num_fewshot": 8,
"limit": 0
}
"mmlu": {
"num_fewshot": 5,
"limit": null
}
"gsm8k": {
"num_fewshot": 8,
"limit": 0
}
"mmlu": {
"num_fewshot": 5,
"limit": null
}
}
```

Expand All @@ -97,7 +117,7 @@ subjects: (list) 需要评测的子任务的名称列表,例如mmlu中有abstr



## 评测任务细节
## 评测任务介绍

### arc

Expand Down Expand Up @@ -135,7 +155,7 @@ flexible_match:匹配回答中任何数字,有一个正确则为正确。

### icleval

数据集来源:使用原始数据([ICLEval/data/tasks_data](https://github.com/yiye3/ICLEval/tree/main/data/tasks_data)),修复了部分文件中的错误,且不支持copy_dict_search_string.json、copy_natural_language_string.json这两个子任务
数据集来源:[ICLEval/data/tasks_data](https://github.com/yiye3/ICLEval/tree/main/data/tasks_data),修复了部分文件中"examples"写成"exmaples"的拼写错误

评测指标:若标准答案是模型生成文本的子串,则为正确。

Expand All @@ -151,3 +171,16 @@ flexible_match:匹配回答中任何数字,有一个正确则为正确。

评测指标:匹配回答中的第一个选项,判断是否正确。

### rgb

数据集来源:[chen700564/RGB](https://github.com/chen700564)

评测指标:有一个可能的回答出现在答案里即为正确。

### xsum

数据集来源:[新建标签页 (github.com)](https://github.com/EdinburghNLP/XSum)

评测指标:用BAAI/bge-m3模型计算和答案的相似度。

注意,该功能由于依赖包较复杂,暂未完善,全部被注释掉了,自己配好环境是可以用的。
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
{
"arc": {
"arc_e": {
"num_fewshot": 0
},
"arc_c": {
"num_fewshot": 25
}
},
"commonsenseqa": {
"num_fewshot": 7
},
Expand Down
26 changes: 16 additions & 10 deletions config_debug.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,48 @@
"arc": {
"arc_e": {
"num_fewshot": 0,
"limit": 10
"limit": 1
},
"arc_c": {
"num_fewshot": 25,
"limit": 10
"limit": 1
}
},
"commonsenseqa": {
"num_fewshot": 7,
"limit": 10
"limit": 1
},
"drop": {
"num_fewshot": 5,
"limit": 10
"limit": 1
},
"gsm8k": {
"num_fewshot": 8,
"limit": 10
"limit": 1
},
"hellaswag": {
"num_fewshot": 4,
"limit": 10
"limit": 1
},
"humaneval": {
"limit": 10
"limit": 1
},
"icleval": {
"limit": 1
},
"mmlu": {
"num_fewshot": 5,
"limit": 10
"limit": 1
},
"rgb": {
"limit": 1
},
"winogrande": {
"num_fewshot": 5,
"limit": 10
"limit": 1
},
"xsum":{
"num_fewshot": 5,
"limit": 10
"limit": 1
}
}
3 changes: 3 additions & 0 deletions lm_cute_eval/get_multiround_prompt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def get_multiround_prompt(round_idx, args):
refine_prompt = "Please further think about and give me a more precise and professional answer.\n"
return refine_prompt
24 changes: 8 additions & 16 deletions lm_cute_eval/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ def __init__(self, args) -> None:
sampling_kwargs = {
"top_p": args.top_p,
"top_k": args.top_k,
"max_tokens": args.max_new_tokens,
"temperature": args.temperature,
"max_tokens": args.max_new_tokens,
"stop": [
"Question:",
"</s>",
Expand All @@ -29,12 +29,7 @@ def __init__(self, args) -> None:
"Input"
]
}
if args.top_p:
sampling_kwargs.update({"top_p": args.top_p})
if args.temperature:
sampling_kwargs.update({"temperature": args.temperature})
if args.top_k:
sampling_kwargs.update({"top_K": args.top_k})
sampling_kwargs = {k: v for k, v in sampling_kwargs.items() if v is not None}
self.sampling_params = SamplingParams(**sampling_kwargs)

def generate(self, prompts):
Expand All @@ -53,15 +48,12 @@ def __init__(self, args) -> None:
self.generate_kwargs = {
"max_new_tokens": args.max_new_tokens,
"pad_token_id": self.tokenizer.pad_token_id,
"temperature": args.temperature,
"top_p": args.top_p,
"top_k": args.top_k,
"do_sample": True,
}

if args.temperature or args.top_p or args.top_k:
self.generate_kwargs.update({
"temperature": args.temperature,
"top_p": args.top_p,
"top_k": args.top_k,
"do_sample": True,
})
self.generate_kwargs = {k: v for k, v in self.generate_kwargs.items() if v is not None}
self.model = AutoModelForCausalLM.from_pretrained(args.model_path).to(self.device)

def generate(self, prompts):
Expand All @@ -73,7 +65,7 @@ def generate(self, prompts):
**self.generate_kwargs
)
output = self.tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
generated_texts.append(output.strip())
generated_texts.append(output[len(prompt):].strip())
return generated_texts


Expand Down
Loading

0 comments on commit 36021fc

Please sign in to comment.