Files
2026-07-13 13:33:03 +08:00

69 lines
2.7 KiB
Python

# pip install lm_eval
from lm_eval.models.huggingface import TemplateLM, HFLM
from lm_eval import simple_evaluate
import MNN.llm as mnnllm
import torch
import json
import copy
import argparse
from typing import List
class MNNLM(HFLM):
def __init__(self, pretrained, batch_size = 1, device = 'cpu'):
TemplateLM.__init__(self)
self._model = mnnllm.create(pretrained)
self._model.load()
self._model.set_config({'all_logits': True})
self.backend = "causal"
self.logits_cache = True
self.batch_size_per_gpu = batch_size
self.batch_size_per_gpu = batch_size
self._max_length = 32768
self._device = device
self.pretrained = pretrained
self.revision = "main"
self.model_type = "mnnllm"
self.delta = None
self.peft = None
self.softmax_dtype = torch.float32
def tok_encode(
self, string: str, left_truncate_len=None, add_special_tokens=None
) -> List[int]:
encoding = self._model.tokenizer_encode(string)
# left-truncate the encoded context to be at most `left_truncate_len` tokens long
if left_truncate_len:
encoding = encoding[-left_truncate_len:]
return encoding
def _model_call(self, inps, attn_mask=None, labels=None):
# return self._model(inps).logits
lm_logits_list = []
for ids in inps:
ids_list = ids.tolist()
logits = self._model.forward(ids_list)
npy_logits = copy.deepcopy(logits.read())
torch_logits = torch.from_numpy(npy_logits)
lm_logits_list.append(torch_logits)
lm_logits = torch.concat(lm_logits_list, axis=0)
return lm_logits
def eval(model, tasks, limit=None):
lm = MNNLM(pretrained=model)
results = simple_evaluate(model=lm, tasks=tasks, batch_size=1, verbosity="ERROR", limit=limit)
filtered_results = {key: value for key, value in results.items() if key == "results"}
json_filtered_results = json.dumps(filtered_results, indent=4)
print(json_filtered_results)
with open("results.json", "w") as json_file:
json_file.write(json_filtered_results)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='mnnllm eval', formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('-m', type=str, required=True, help='path to mnn llm model config.')
parser.add_argument('-d', type=str, default='arc_challenge,ceval-valid', help='tasks to evaluate, separated by comma.')
parser.add_argument('--limit', type=int, default=None, help='limit number of samples per task.')
args = parser.parse_args()
tasks = [t.strip() for t in args.d.split(',')]
eval(args.m, tasks, args.limit)