张芷铭的个人博客

Mixin 模式支持灵活组合模型算子,通过多继承动态注入功能,保持接口统一与资源可控。

基础架构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from abc import ABC, abstractmethod

class ModelMixin(ABC):
    """模型算子基类 Mixin"""
    @abstractmethod
    def initialize(self):
        """加载权重、分配资源"""
        pass

    @abstractmethod
    def process(self, data: dict) -> dict:
        """处理输入数据"""
        pass

class PipelineBase:
    """处理流水线基类"""
    def __init__(self):
        self.models = {}

    def run(self, input_data: dict) -> dict:
        return {name: model.process(input_data)
                for name, model in self.models.items()}

具体模型实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class RAMModelMixin(ModelMixin):
    def initialize(self):
        self.ram_model = get_ram_model()
        self.models["ram"] = self

    def process(self, data):
        return self.ram_model.predict(data["image"])

class GroundingDINOMixin(ModelMixin):
    def initialize(self):
        self.dino_model = load_dino_model()
        self.models["dino"] = self

    def process(self, data):
        return self.dino_model.detect(data["image"], data["text_prompt"])

动态流水线

1
2
3
4
5
6
7
8
9
class DynamicPipeline(PipelineBase):
    def __init__(self):
        super().__init__()
        self.initialize_models()

    def initialize_models(self):
        for base in type(self).__mro__:
            if issubclass(base, ModelMixin) and base != ModelMixin:
                base.initialize(self)

使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# RAM + ZeroDepth 组合
class SimplePipeline(DynamicPipeline, RAMModelMixin, ZeroDepthMixin):
    pass

pipeline = SimplePipeline()
result = pipeline.run({"image": "example.jpg"})

# 全模型组合
class FullVisionPipeline(DynamicPipeline, RAMModelMixin,
                         GroundingDINOMixin, RAFTMixin):
    pass

高级特性

延迟初始化:按需加载模型,减少内存占用

1
2
3
4
5
class LazyPipeline(PipelineBase):
    def run(self, input_data):
        for mixin in self.mixins:
            if not hasattr(mixin, "model"):
                mixin.initialize()

初始化顺序控制:通过 MRO 或显式排序

1
2
class OrderedPipeline(DynamicPipeline):
    __mixin_order__ = [GroundingDINOMixin, RAMModelMixin]

注意事项

  • 避免不同 Mixin 使用相同方法名
  • 依赖其他模型的 Mixin 需控制初始化顺序
  • 可结合工厂模式简化调用

Comments