main
py 161 lines 4.99 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 from typing import Literal
5
6 from torch import nn
7
8 from vllm.config import ModelConfig, VllmConfig
9 from vllm.config.load import LoadConfig
10 from vllm.logger import init_logger
11 from vllm.model_executor.model_loader.base_loader import BaseModelLoader
12 from vllm.model_executor.model_loader.default_loader import DefaultModelLoader
13 from vllm.model_executor.model_loader.dummy_loader import DummyModelLoader
14 from vllm.model_executor.model_loader.modelexpress_loader import (
15 ModelExpressModelLoader,
16 )
17 from vllm.model_executor.model_loader.runai_streamer_loader import (
18 RunaiModelStreamerLoader,
19 )
20 from vllm.model_executor.model_loader.sharded_state_loader import ShardedStateLoader
21 from vllm.model_executor.model_loader.tensorizer_loader import TensorizerLoader
22 from vllm.model_executor.model_loader.utils import (
23 get_architecture_class_name,
24 get_model_architecture,
25 get_model_cls,
26 )
27 from vllm.model_executor.model_loader.weight_cache.ipc_loader import IpcModelLoader
28
29 logger = init_logger(__name__)
30
31 # Reminder: Please update docstring in `LoadConfig`
32 # if a new load format is added here
33 LoadFormats = Literal[
34 "auto",
35 "hf",
36 "dummy",
37 "fastsafetensors",
38 "instanttensor",
39 "ipc_cache",
40 "mistral",
41 "modelexpress",
42 "npcache",
43 "pt",
44 "runai_streamer",
45 "runai_streamer_sharded",
46 "safetensors",
47 "sharded_state",
48 "tensorizer",
49 ]
50 _LOAD_FORMAT_TO_MODEL_LOADER: dict[str, type[BaseModelLoader]] = {
51 "auto": DefaultModelLoader,
52 "hf": DefaultModelLoader,
53 "dummy": DummyModelLoader,
54 "fastsafetensors": DefaultModelLoader,
55 "instanttensor": DefaultModelLoader,
56 "ipc_cache": IpcModelLoader,
57 "mistral": DefaultModelLoader,
58 "modelexpress": ModelExpressModelLoader,
59 "npcache": DefaultModelLoader,
60 "pt": DefaultModelLoader,
61 "runai_streamer": RunaiModelStreamerLoader,
62 "runai_streamer_sharded": ShardedStateLoader,
63 "safetensors": DefaultModelLoader,
64 "sharded_state": ShardedStateLoader,
65 "tensorizer": TensorizerLoader,
66 }
67
68
69 def register_model_loader(load_format: str):
70 """Register a customized vllm model loader.
71
72 When a load format is not supported by vllm, you can register a customized
73 model loader to support it.
74
75 Args:
76 load_format (str): The model loader format name.
77
78 Examples:
79 >>> from vllm.config.load import LoadConfig
80 >>> from vllm.model_executor.model_loader import (
81 ... get_model_loader,
82 ... register_model_loader,
83 ... )
84 >>> from vllm.model_executor.model_loader.base_loader import BaseModelLoader
85 >>>
86 >>> @register_model_loader("my_loader")
87 ... class MyModelLoader(BaseModelLoader):
88 ... def download_model(self):
89 ... pass
90 ...
91 ... def load_weights(self):
92 ... pass
93 >>>
94 >>> load_config = LoadConfig(load_format="my_loader")
95 >>> type(get_model_loader(load_config))
96 <class 'MyModelLoader'>
97
98 """ # noqa: E501
99
100 def _wrapper(model_loader_cls):
101 if load_format in _LOAD_FORMAT_TO_MODEL_LOADER:
102 logger.warning(
103 "Load format `%s` is already registered, and will be "
104 "overwritten by the new loader class `%s`.",
105 load_format,
106 model_loader_cls,
107 )
108 if not issubclass(model_loader_cls, BaseModelLoader):
109 raise ValueError(
110 "The model loader must be a subclass of `BaseModelLoader`."
111 )
112 _LOAD_FORMAT_TO_MODEL_LOADER[load_format] = model_loader_cls
113 logger.info(
114 "Registered model loader `%s` with load format `%s`",
115 model_loader_cls,
116 load_format,
117 )
118 return model_loader_cls
119
120 return _wrapper
121
122
123 def get_model_loader(load_config: LoadConfig) -> BaseModelLoader:
124 """Get a model loader based on the load format."""
125 load_format = load_config.load_format
126 if load_format not in _LOAD_FORMAT_TO_MODEL_LOADER:
127 raise ValueError(f"Load format `{load_format}` is not supported")
128 return _LOAD_FORMAT_TO_MODEL_LOADER[load_format](load_config)
129
130
131 def get_model(
132 *,
133 vllm_config: VllmConfig,
134 model_config: ModelConfig | None = None,
135 prefix: str = "",
136 load_config: LoadConfig | None = None,
137 ) -> nn.Module:
138 loader = get_model_loader(load_config or vllm_config.load_config)
139 if model_config is None:
140 model_config = vllm_config.model_config
141 return loader.load_model(
142 vllm_config=vllm_config, model_config=model_config, prefix=prefix
143 )
144
145
146 __all__ = [
147 "get_model",
148 "get_model_loader",
149 "get_architecture_class_name",
150 "get_model_architecture",
151 "get_model_cls",
152 "register_model_loader",
153 "BaseModelLoader",
154 "ModelExpressModelLoader",
155 "DefaultModelLoader",
156 "DummyModelLoader",
157 "IpcModelLoader",
158 "RunaiModelStreamerLoader",
159 "ShardedStateLoader",
160 "TensorizerLoader",
161 ]