import logging from typing import List, Mapping, Optional, Type import lm_eval.api.utils from lm_eval.api.model import LM from . import dummy from . import openai_completions from . import huggingface logger = logging.getLogger(__name__) MODEL_API_REGISTRY = { "hf-causal": huggingface.AutoCausalLM, "hf-seq2seq": huggingface.AutoSeq2SeqLM, "hf-mlm": huggingface.AutoMaskedLM, "openai": openai_completions.OpenAICompletionsLM, "dummy": dummy.DummyLM, } def list_model_apis() -> List[str]: """Returns a list of all the model API names available for language model construction.""" return sorted(list(MODEL_API_REGISTRY)) def get_model(model_api_name: str, **model_kwargs) -> LM: """Returns a language model from the specified model API, instantiated with the specified kwargs. Args model_api_name: Name of the model API to use as found in the model registry. **model_kwargs: Keyword arguments to pass to the model constructor. See constructor args for the model API in `lm_eval.models`. Returns: A language model instance. """ model_api_class = _get_model_api_from_registry(model_api_name) return model_api_class(**model_kwargs) def get_model_from_args_string( model_api_name: str, model_args: str, additional_config: Optional[Mapping[str, str]] = None, ) -> LM: """Returns a language model from the specified model API, instantiated with the given kwargs. Args: model_api_name: Name of the model API to use as found in the model registry. model_args: A string of comma-separated key=value pairs that will be passed to the model constructor. E.g. "pretrained=gpt2,batch_size=32". additional_config: An additional dictionary of key=value pairs that will be passed to the model constructor. Returns: A language model instance. """ additional_config = {} if additional_config is None else additional_config additional_args = {k: v for k, v in additional_config.items() if v is not None} kwargs = lm_eval.api.utils.parse_cli_args_string(model_args) kwargs.update(additional_args) return get_model(model_api_name, **kwargs) def _get_model_api_from_registry(model_api_name: str) -> Type[LM]: try: return MODEL_API_REGISTRY[model_api_name] except KeyError: logger.warning(f"Available model APIs:\n{list_model_apis()}") raise KeyError(f"Model API `{model_api_name}` is missing.")