优化路由行为 Optimizing Routing Behavior

xxx

当同一应用程序有多个可用副本时,没有定义行为来选择使用哪个副本来处理特定请求,假设所有副本对于给定的一组输入都会表现相同。

对于保存状态并可能包含某些参数集的内存缓存的应用程序来说,这可能并非如此。例如,如果您正在为一个可以运行任何扩散模型但只能在内存中保留 3 个不同模型的应用程序提供服务,那么您希望根据用户提供的输入最小化缓存未命中次数(因为从头开始加载该模型会导致严重的性能损失)。

这就是语义感知路由提示发挥作用的地方。应用程序可以提供专业化的提示,并允许 fal 的路由器为特定请求选择合适的副本,而不是平等对待每个副本。为了使此逻辑有效工作,用户需要提供带有语义识别字符串提示的 X-Fal-Runner-Hint 标头,并且应用程序应实现返回提示列表的 provide_hints() 方法。如果任何副本中有匹配项,则 fal 的路由器会将请求发送到该副本。但是,如果没有匹配项,它将回退到标准路由算法。

py
from typing import Any

import fal
from fal.toolkit import Image
from pydantic import BaseModel

class Input(BaseModel):
    model: str = Field()
    prompt: str = Field()

class Output(BaseModel):
    image: Image = Field()

class AnyModelRunner(fal.App):
    def setup(self) -> None:
        self.models = {}

    def provide_hints(self) -> list[str]:
        # Choose to specialize on already loaded models; at first this will be empty
        # so we'll be picked for any request, but as slowly the cache builds up, the
        # replica will be more preferable compared to others.
        return self.models.keys()

    def load_model(self, name: str) -> Any:
        from diffusers import DiffusionPipeline

        if name in self.models:
            return self.models[name]

        pipeline = DiffusionPipeline.from_pretrained(name)
        pipeline.to("cuda")

        self.models[name] = pipeline
        return pipeline

    @fal.endpoint("/")
    def run_model(self, input: Input) -> Output:
        model = self.load_model(input.model)
        result = model(input.prompt)
        return Output(image=Image.from_pil(result.images[0]))

最后更新于 2024 年 6 月 21 日