Repository: open-compass/opencompass
Issue: [Bug] Benchmarks for SFT models on some datasets are not correctly implemented
Root cause: Validation Gap

### Describe the bug

Running opencompass on my own SFT model, we saw some suspicious results.
```
dataset                               version    metric            mode    model-hf
------------------------------------  ---------  ----------------  ------  -----------------
--------- 语言 Language ---------       -          -                 -       -
WiC                                   d06864     accuracy          gen     0.00
WSC                                   6dc406     accuracy          gen     0.00
winogrande                            a9ede5     accuracy          gen     0.00
--------- 推理 Reasoning ---------      -          -                 -       -
AX_g                                  68aac7     accuracy          gen     0.00
RTE                                   68aac7     accuracy          gen     0.00
openai_humaneval                      8e312c     humaneval_pass@1  gen     0.00
mbpp                                  1e1056     score             gen     0.00
```

### Environment
```py
{'CUDA available': True,
 'CUDA_HOME': '/usr/local/cuda',
 'GCC': 'gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0',
 'GPU 0,1,2,3,4,5,6,7': 'NVIDIA A100-SXM4-80GB',
 'MMEngine': '0.8.1',
 'NVCC': 'Cuda compilation tools, release 12.1, V12.1.66',
 'OpenCV': '4.8.0',
 'PyTorch': '2.0.1',
 'PyTorch compiling details': 'PyTorch built with:\n'
                              '  - GCC 9.3\n'
                              '  - C++ Version: 201703\n'
                              '  - Intel(R) oneAPI Math Kernel Library Version '
                              '2023.1-Product Build 20230303 for Intel(R) 64 '
                              'architecture applications\n'
                              '  - Intel(R) MKL-DNN v2.7.3 (Git Hash '
                              '6dbeffbae1f23cbbeae17adb7b5b13f1f37c080e)\n'
                              '  - OpenMP 201511 (a.k.a. OpenMP 4.5)\n'
                              '  - LAPACK is enabled (usually provided by '
                              'MKL)\n'
                              '  - NNPACK is enabled\n'
                              '  - CPU capability usage: AVX2\n'
                              '  - CUDA Runtime 11.8\n'
                              '  - NVCC architecture flags: '
                              '-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86;-gencode;arch=compute_90,code=sm_90;-gencode;arch=compute_37,code=compute_37\n'
                              '  - CuDNN 8.7\n'
                              '  - Magma 2.6.1\n'
                              '  - Build settings: BLAS_INFO=mkl, '
                              'BUILD_TYPE=Release, CUDA_VERSION=11.8, '
                              'CUDNN_VERSION=8.7.0, '
                              'CXX_COMPILER=/opt/rh/devtoolset-9/root/usr/bin/c++, '
                              'CXX_FLAGS= -D_GLIBCXX_USE_CXX11_ABI=0 '
                              '-fabi-version=11 -Wno-deprecated '
                              '-fvisibility-inlines-hidden -DUSE_PTHREADPOOL '
                              '-DNDEBUG -DUSE_KINETO -DLIBKINETO_NOROCTRACER '
                              '-DUSE_FBGEMM -DUSE_QNNPACK '
                              '-DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK '
                              '-DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC '
                              '-Wall -Wextra -Werror=return-type '
                              '-Werror=non-virtual-dtor -Werror=bool-operation '
                              '-Wnarrowing -Wno-missing-field-initializers '
                              '-Wno-type-limits -Wno-array-bounds '
                              '-Wno-unknown-pragmas -Wunused-local-typedefs '
                              '-Wno-unused-parameter -Wno-unused-function '
                              '-Wno-unused-result -Wno-strict-overflow '
                              '-Wno-strict-aliasing '
                              '-Wno-error=deprecated-declarations '
                              '-Wno-stringop-overflow -Wno-psabi '
                              '-Wno-error=pedantic -Wno-error=redundant-decls '
                              '-Wno-error=old-style-cast '
                              '-fdiagnostics-color=always -faligned-new '
                              '-Wno-unused-but-set-variable '
                              '-Wno-maybe-uninitialized -fno-math-errno '
                              '-fno-trapping-math -Werror=format '
                              '-Werror=cast-function-type '
                              '-Wno-stringop-overflow, LAPACK_INFO=mkl, '
                              'PERF_WITH_AVX=1, PERF_WITH_AVX2=1, '
                              'PERF_WITH_AVX512=1, '
                              'TORCH_DISABLE_GPU_ASSERTS=ON, '
                              'TORCH_VERSION=2.0.1, USE_CUDA=ON, USE_CUDNN=ON, '
                              'USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, '
                              'USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, '
                              'USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, '
                              'USE_OPENMP=ON, USE_ROCM=OFF, \n',
 'Python': '3.10.12 (main, Jul  5 2023, 18:54:27) [GCC 11.2.0]',
 'TorchVision': '0.15.2',
 'numpy_random_seed': 2147483648,
 'opencompass': '0.1.0+18efcb0',
 'sys.platform': 'linux'}
```

### Other information

Take `WiC` as example, the prediction of the model is either `Yes` or `No`. 
```json
{
        "origin_prompt": "Human: Sentence 1: As he called the role he put a check mark by each student's name.\nSentence 2: A check on its dependability under stress.\nAre 'check' in the above two sentenses the same?\nA. Yes\nB. No\nAnswer: \n\nAssistant:",
        "prediction": "Yes"
    }
```
But the labels are `true` or `false`, as can be seen below.
```json
{"word": "brush", "sentence1": "She gave her hair a quick brush.", "sentence2": "The dentist recommended two brushes a day.", "idx": 3, "label": "true", "start1": 26, "start2": 28, "end1": 31, "end2": 35, "version": 1.1}
```

Thanks for reporting, yet both the label and model's prediction make sense. It's likely due to postprocessing that fails to map the result back to the right option.

When WiC is loaded, "true" and "false" labels are mapped to "A" and "B":
https://github.com/InternLM/opencompass/blob/3cfe73de3ff75cdb657f0db77cd6228c28f41da1/opencompass/datasets/wic.py#L39

Then the model's predictions will be processed through the answer postprocessor:
https://github.com/InternLM/opencompass/blob/014b24dd0200829c1fca0fa6f10a79022d58378b/configs/datasets/SuperGLUE_WiC/SuperGLUE_WiC_gen_d06864.py#L35

We assumed that the model generates some answers including "A" or "B", which unfortunately wasn't the case. To alleviate this problem, the postprocessor will need to be enhanced to handle more corner cases.

In practice, controlling the model's output is generally hard and its postprocessing is tricky. Inferencing with PPL is much more recommended for these datasets with a fixed number of labels.

@gaotongxiao Yes, I agree with you that it is difficult to evaluate on the SFT models. That's why I'm interested in your project. Thanks for the detailed explanation. I guess you may refine the process for custom models, so that it also applies to new models.

Thanks for the insightful suggestions, we will add the process refinement into our backlog, also PRs are welcomed for improving OpenCompass. Feel free to re-open this issue if you have more questions.