LemonDecider / model.py
niqun123123's picture
Upload model.py with huggingface_hub
f2d0999 verified
Raw History Blame Contribute Delete
2.41 kB
"""Standalone local decision inference (not an AIStudio Maya canvas component).
Inside the exported checkpoint this file can be run directly with --checkpoint .
The actual HF architecture lives in modeling_lemondecider.py/configuration_lemondecider.py.
"""
import argparse
import json
from pathlib import Path
import torch
from transformers import AutoModel
if Path(__file__).with_name('decision_utils.py').is_file():
from decision_utils import predict_batch, answer_codes
else:
from modeling.decision_utils import predict_batch, answer_codes
def load_model(checkpoint, device='cuda:0'):
torch.set_num_threads(8)
if torch.cuda.is_available():
torch.backends.cuda.enable_cudnn_sdp(False)
model = AutoModel.from_pretrained(str(checkpoint), trust_remote_code=True,
local_files_only=True, dtype=torch.bfloat16, device_map=device,
attn_implementation='sdpa').eval()
if Path(__file__).with_name('decision_utils.py').is_file():
from decision_utils import load_processor
else:
from modeling.decision_utils import load_processor
processor = load_processor(checkpoint)
codes, ids = answer_codes(processor.tokenizer, model.config.max_options,
getattr(model.config, 'code_scheme', 'letters-v1'))
if codes != model.config.codes or ids != model.config.token_ids:
raise ValueError('Checkpoint code/tokenizer mapping mismatch')
if tuple(model.readout.weight.shape) != (len(codes), model.config.text_config.hidden_size):
raise ValueError('Checkpoint readout/code-table shape mismatch')
return model, processor
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--checkpoint', default=str(Path(__file__).resolve().parent))
parser.add_argument('--device', default='cuda:0')
parser.add_argument('--input', help='JSON file containing a list of decision inputs')
args = parser.parse_args()
model, processor = load_model(args.checkpoint, args.device)
rows = json.loads(Path(args.input).read_text()) if args.input else [{
'state': '我想申请退款。', 'question': {'type': 'choice', 'instructions': '判断主要诉求',
'criteria': {'refund': '退款相关', 'delivery': '物流相关', 'account': '账户相关'}}}]
print(json.dumps(predict_batch(model, processor, rows), ensure_ascii=False, indent=2))