mirror of
https://github.com/open-compass/opencompass.git
synced 2025-05-30 16:03:24 +08:00
173 lines
7.1 KiB
Markdown
173 lines
7.1 KiB
Markdown
# Learn About Config
|
|
|
|
OpenCompass uses the OpenMMLab modern style configuration files. If you are familiar with the OpenMMLab style
|
|
configuration files, you can directly refer to
|
|
[A Pure Python style Configuration File (Beta)](https://mmengine.readthedocs.io/en/latest/advanced_tutorials/config.html#a-pure-python-style-configuration-file-beta)
|
|
to understand the differences between the new-style and original configuration files. If you have not
|
|
encountered OpenMMLab style configuration files before, I will explain the usage of configuration files using
|
|
a simple example. Make sure you have installed the latest version of MMEngine to support the
|
|
new-style configuration files.
|
|
|
|
## Basic Format
|
|
|
|
OpenCompass configuration files are in Python format, following basic Python syntax. Each configuration item
|
|
is specified by defining variables. For example, when defining a model, we use the following configuration:
|
|
|
|
```python
|
|
# model_cfg.py
|
|
from opencompass.models import HuggingFaceCausalLM
|
|
|
|
models = [
|
|
dict(
|
|
type=HuggingFaceCausalLM,
|
|
path='huggyllama/llama-7b',
|
|
model_kwargs=dict(device_map='auto'),
|
|
tokenizer_path='huggyllama/llama-7b',
|
|
tokenizer_kwargs=dict(padding_side='left', truncation_side='left'),
|
|
max_seq_len=2048,
|
|
max_out_len=50,
|
|
run_cfg=dict(num_gpus=8, num_procs=1),
|
|
)
|
|
]
|
|
```
|
|
|
|
When reading the configuration file, use `Config.fromfile` from MMEngine for parsing:
|
|
|
|
```python
|
|
>>> from mmengine.config import Config
|
|
>>> cfg = Config.fromfile('./model_cfg.py')
|
|
>>> print(cfg.models[0])
|
|
{'type': HuggingFaceCausalLM, 'path': 'huggyllama/llama-7b', 'model_kwargs': {'device_map': 'auto'}, ...}
|
|
```
|
|
|
|
## Inheritance Mechanism
|
|
|
|
OpenCompass configuration files use Python's import mechanism for file inheritance. Note that when inheriting
|
|
configuration files, we need to use the `read_base` context manager.
|
|
|
|
```python
|
|
# inherit.py
|
|
from mmengine.config import read_base
|
|
|
|
with read_base():
|
|
from .model_cfg import models # Inherits the 'models' from model_cfg.py
|
|
```
|
|
|
|
Parse the configuration file using `Config.fromfile`:
|
|
|
|
```python
|
|
>>> from mmengine.config import Config
|
|
>>> cfg = Config.fromfile('./inherit.py')
|
|
>>> print(cfg.models[0])
|
|
{'type': HuggingFaceCausalLM, 'path': 'huggyllama/llama-7b', 'model_kwargs': {'device_map': 'auto'}, ...}
|
|
```
|
|
|
|
## Evaluation Configuration Example
|
|
|
|
```python
|
|
# configs/llama7b.py
|
|
from mmengine.config import read_base
|
|
|
|
with read_base():
|
|
# Read the required dataset configurations directly from the preset dataset configurations
|
|
from .datasets.piqa.piqa_ppl import piqa_datasets
|
|
from .datasets.siqa.siqa_gen import siqa_datasets
|
|
|
|
# Concatenate the datasets to be evaluated into the datasets field
|
|
datasets = [*piqa_datasets, *siqa_datasets]
|
|
|
|
# Evaluate models supported by HuggingFace's `AutoModelForCausalLM` using `HuggingFaceCausalLM`
|
|
from opencompass.models import HuggingFaceCausalLM
|
|
|
|
models = [
|
|
dict(
|
|
type=HuggingFaceCausalLM,
|
|
# Initialization parameters for `HuggingFaceCausalLM`
|
|
path='huggyllama/llama-7b',
|
|
tokenizer_path='huggyllama/llama-7b',
|
|
tokenizer_kwargs=dict(padding_side='left', truncation_side='left'),
|
|
max_seq_len=2048,
|
|
# Common parameters for all models, not specific to HuggingFaceCausalLM's initialization parameters
|
|
abbr='llama-7b', # Model abbreviation for result display
|
|
max_out_len=100, # Maximum number of generated tokens
|
|
batch_size=16,
|
|
run_cfg=dict(num_gpus=1), # Run configuration for specifying resource requirements
|
|
)
|
|
]
|
|
```
|
|
|
|
## Dataset Configuration File Example
|
|
|
|
In the above example configuration file, we directly inherit the dataset-related configurations. Next, we will
|
|
use the PIQA dataset configuration file as an example to demonstrate the meanings of each field in the dataset
|
|
configuration file. If you do not intend to modify the prompt for model testing or add new datasets, you can
|
|
skip this section.
|
|
|
|
The PIQA dataset [configuration file](https://github.com/open-compass/opencompass/blob/main/configs/datasets/piqa/piqa_ppl_1cf9f0.py) is as follows.
|
|
It is a configuration for evaluating based on perplexity (PPL) and does not use In-Context Learning.
|
|
|
|
```python
|
|
from opencompass.openicl.icl_prompt_template import PromptTemplate
|
|
from opencompass.openicl.icl_retriever import ZeroRetriever
|
|
from opencompass.openicl.icl_inferencer import PPLInferencer
|
|
from opencompass.openicl.icl_evaluator import AccEvaluator
|
|
from opencompass.datasets import HFDataset
|
|
|
|
# Reading configurations
|
|
# The loaded dataset is usually organized as dictionaries, specifying the input fields used to form the prompt
|
|
# and the output field used as the answer in each sample
|
|
piqa_reader_cfg = dict(
|
|
input_columns=['goal', 'sol1', 'sol2'],
|
|
output_column='label',
|
|
test_split='validation',
|
|
)
|
|
|
|
# Inference configurations
|
|
piqa_infer_cfg = dict(
|
|
# Prompt generation configuration
|
|
prompt_template=dict(
|
|
type=PromptTemplate,
|
|
# Prompt template, the template format matches the inferencer type specified later
|
|
# Here, to calculate PPL, we need to specify the prompt template for each answer
|
|
template={
|
|
0: 'The following makes sense: \nQ: {goal}\nA: {sol1}\n',
|
|
1: 'The following makes sense: \nQ: {goal}\nA: {sol2}\n'
|
|
}),
|
|
# In-Context example configuration, specifying `ZeroRetriever` here, which means not using in-context example.
|
|
retriever=dict(type=ZeroRetriever),
|
|
# Inference method configuration
|
|
# - PPLInferencer uses perplexity (PPL) to obtain answers
|
|
# - GenInferencer uses the model's generated results to obtain answers
|
|
inferencer=dict(type=PPLInferencer))
|
|
|
|
# Metric configuration, using Accuracy as the evaluation metric
|
|
piqa_eval_cfg = dict(evaluator=dict(type=AccEvaluator))
|
|
|
|
# Dataset configuration, where all the above variables are parameters for this configuration
|
|
# It is a list used to specify the configurations of different evaluation subsets of a dataset.
|
|
piqa_datasets = [
|
|
dict(
|
|
type=HFDataset,
|
|
path='piqa',
|
|
reader_cfg=piqa_reader_cfg,
|
|
infer_cfg=piqa_infer_cfg,
|
|
eval_cfg=piqa_eval_cfg)
|
|
```
|
|
|
|
For detailed configuration of the **Prompt generation configuration**, you can refer to the [Prompt Template](../prompt/prompt_template.md).
|
|
|
|
## Advanced Evaluation Configuration
|
|
|
|
In OpenCompass, we support configuration options such as task partitioner and runner for more flexible and
|
|
efficient utilization of computational resources.
|
|
|
|
By default, we use size-based partitioning for inference tasks. You can specify the sample number threshold
|
|
for task partitioning using `--max-partition-size` when starting the task. Additionally, we use local
|
|
resources for inference and evaluation tasks by default. If you want to use Slurm cluster resources, you can
|
|
use the `--slurm` parameter and the `--partition` parameter to specify the Slurm runner backend when starting
|
|
the task.
|
|
|
|
Furthermore, if the above functionalities do not meet your requirements for task partitioning and runner
|
|
backend configuration, you can provide more detailed configurations in the configuration file. Please refer to
|
|
[Efficient Evaluation](./evaluation.md) for more information.
|