refactor: 消除多处重复模式,统一工厂和参数传递
- AutoModel 继承 BaseFactory,消除自建 Registry(-30 行) - executor.execute_prefill 删除重复 forward 代码块(bug) - train_callback 移除 Protocol 上矛盾的 issubclass 检查 - engine.py 内部方法统一传 GenerationParams,校验内聚 - protocol.py SSEBuilder 类→函数,handle() 用 GenerationParams - StreamContext 动态属性改为显式 dataclass 字段 - BaseFactory 新增 get_component_class 方法
This commit is contained in:
@@ -4,13 +4,13 @@ AutoModel base class for model loading and saving.
|
||||
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
from typing import Self, Type, Union
|
||||
from typing import Self, Union
|
||||
|
||||
import safetensors.torch as st
|
||||
import torch.nn as nn
|
||||
|
||||
from astrai.config import ModelConfig
|
||||
from astrai.factory import Registry
|
||||
from astrai.factory import BaseFactory
|
||||
|
||||
|
||||
@contextmanager
|
||||
@@ -39,46 +39,16 @@ def _disable_random_init(enable: bool = True):
|
||||
setattr(nn.init, name, orig_func)
|
||||
|
||||
|
||||
class AutoModel(nn.Module):
|
||||
class AutoModel(BaseFactory["AutoModel"], nn.Module):
|
||||
"""
|
||||
Autoregressive language model base class.
|
||||
Provides model loading/saving and generation capabilities.
|
||||
Provides model loading/saving, registration, and generation.
|
||||
"""
|
||||
|
||||
_registry = Registry()
|
||||
|
||||
def __init__(self, config: ModelConfig):
|
||||
super().__init__()
|
||||
self.config = config
|
||||
|
||||
@classmethod
|
||||
def register(cls, model_type: str):
|
||||
"""
|
||||
Class method decorator to register model type.
|
||||
|
||||
Usage:
|
||||
@AutoModel.register('transformer')
|
||||
class Transformer(AutoModel):
|
||||
...
|
||||
"""
|
||||
|
||||
def decorator(sub_cls: Type["AutoModel"]) -> Type["AutoModel"]:
|
||||
cls._registry.register(model_type.lower(), sub_cls)
|
||||
return sub_cls
|
||||
|
||||
return decorator
|
||||
|
||||
@classmethod
|
||||
def get_model_class(cls, model_type: str) -> Type["AutoModel"]:
|
||||
"""Get model class by model_type string."""
|
||||
model_type = model_type.lower()
|
||||
if not cls._registry.contains(model_type):
|
||||
available = cls._registry.list_names()
|
||||
raise ValueError(
|
||||
f"Unknown model_type: {model_type}. Available: {available}"
|
||||
)
|
||||
return cls._registry.get(model_type)
|
||||
|
||||
@classmethod
|
||||
def from_pretrained(
|
||||
cls,
|
||||
@@ -98,7 +68,7 @@ class AutoModel(nn.Module):
|
||||
raise FileNotFoundError(f"Config file not found: {config_path}")
|
||||
|
||||
model_type = config.model_type or "transformer"
|
||||
actual_cls = cls.get_model_class(model_type)
|
||||
actual_cls = AutoModel.get_component_class(model_type)
|
||||
|
||||
with _disable_random_init(enable=disable_random_init):
|
||||
model = actual_cls(config)
|
||||
|
||||
Reference in New Issue
Block a user