BentoML SDK

Service 装饰器

bentoml.service(inner: type[T], /) Service[T][source]
bentoml.service(inner: None = None, /, *, image: Image | None = None, envs: list[dict[str, str]] | None = None, labels: dict[str, str] | None = None, **kwargs: Unpack) _ServiceDecorator

将一个类标记为 BentoML 服务。

示例

@service(traffic={“timeout”: 60}) class InferenceService

@api def predict(self, input: str) -> str

return input

bentoml.runner_service(runner: Runner, **kwargs: Unpack) Service[Any][source]

从旧版 Runner 创建服务

bentoml.asgi_app(app: ASGIApp, *, path: str = '/', name: str | None = None) t.Callable[[R], R][source]

将 ASGI 应用挂载到服务。

参数:
  • app – 要挂载的 ASGI 应用。

  • path – 挂载应用的路径。

  • name – 应用的名称。

Service API

bentoml.api(func: t.Callable[t.Concatenate[t.Any, P], R]) APIMethod[P, R][source]
bentoml.api(*, route: str | None = None, name: str | None = None, input_spec: type[IODescriptor] | None = None, output_spec: type[IODescriptor] | None = None, batchable: bool = False, batch_dim: int | tuple[int, int] = 0, max_batch_size: int = 100, max_latency_ms: int = 60000) t.Callable[[t.Callable[t.Concatenate[t.Any, P], R]], APIMethod[P, R]]

创建一个 BentoML API 方法。此装饰器可以带参数使用,也可以不带参数使用。

参数:
  • func – 要包装的函数。

  • route – API 的路由。例如:“/predict”

  • name – API 的名称。

  • input_spec – API 的输入规范,应是 pydantic.BaseModel 的子类。

  • output_spec – API 的输出规范,应是 pydantic.BaseModel 的子类。

  • batchable – API 是否可批量处理。

  • batch_dim – API 的批量维度。

  • max_batch_size – API 的最大批量大小。

  • max_latency_ms – API 的最大延迟(毫秒)。

请注意,启用批处理时,batch_dim 可以是元组或单个值。

  • 对于元组 (input_dim, output_dim)

    • input_dim: 确定在发送进行处理之前,输入数组应沿哪个维度进行批处理(或堆叠)。例如,如果您正在处理 2-D 数组,并且 input_dim 设置为 0,BentoML 将沿第一个维度堆叠这些数组。这意味着如果您有两个尺寸为 5x2 和 10x2 的 2-D 输入数组,指定 input_dim 为 0 会将它们组合成一个 15x2 的数组进行处理。

    • output_dim: 推理完成后,输出数组需要按原始批量大小拆分回去。output_dim 指示应沿哪个维度拆分输出数组。在上面的示例中,如果推理过程返回一个 15x2 的数组,并且 output_dim 设置为 0,BentoML 将根据记录的输入批量边界,将此数组拆分回原始大小的 5x2 和 10x2。这确保了每个请求者接收到与他们输入相对应的正确部分输出。

  • 如果您为 batch_dim 指定单个值,则此值将同时应用于 input_dimoutput_dim。换句话说,用于批处理输入和拆分输出的是同一个维度。

batch_dim 的图像说明

此图解说明了在处理二维数组时 batch_dim 的概念。

Batching dimension explanation

左侧有两个尺寸为 5x2 的二维数组,分别由蓝色和绿色框表示。箭头显示了这些数组根据 batch_dim 配置可以采用的两种不同路径。

  • 顶部路径配置为 batch_dim=(0,0)。这意味着批处理沿第一维度(行数)进行。两个数组堆叠在一起,形成一个尺寸为 10x2 的新组合数组,用于推理。推理后,结果被拆分回两个独立的 5x2 数组。

  • 底部路径配置为 batch_dim=(1,1)。这意味着批处理沿第二维度(列数)进行。两个数组并排连接,形成一个尺寸为 5x4 的更大数组,由模型处理。推理后,输出数组被拆分回原始维度,形成两个独立的 5x2 数组。

bentoml.task(func: t.Callable[t.Concatenate[t.Any, P], R]) APIMethod[P, R][source]
bentoml.task(*, route: str | None = None, name: str | None = None, input_spec: type[IODescriptor] | None = None, output_spec: type[IODescriptor] | None = None, batchable: bool = False, batch_dim: int | tuple[int, int] = 0, max_batch_size: int = 100, max_latency_ms: int = 60000) t.Callable[[t.Callable[t.Concatenate[t.Any, P], R]], APIMethod[P, R]]

将方法标记为 BentoML 异步任务。此装饰器可以带参数使用,也可以不带参数使用。

参数:
  • func – 要包装的函数。

  • route – API 的路由。例如:“/predict”

  • name – API 的名称。

  • input_spec – API 的输入规范,应是 pydantic.BaseModel 的子类。

  • output_spec – API 的输出规范,应是 pydantic.BaseModel 的子类。

  • batchable – API 是否可批量处理。

  • batch_dim – API 的批量维度。

  • max_batch_size – API 的最大批量大小。

  • max_latency_ms – API 的最大延迟(毫秒)。

bentoml.depends

bentoml.depends(*, url: str | None = None, deployment: str | None = None, cluster: str | None = None) Dependency[None][source]
bentoml.depends(on: Service[T], *, url: str | None = None, deployment: str | None = None, cluster: str | None = None) Dependency[T]

创建对其他服务或部署的依赖

参数:
  • on – Service[T] | None: 依赖的服务。

  • url – str | None: 依赖服务的 URL。

  • deployment – str | None: 依赖服务的部署。

  • cluster – str | None: 依赖服务的集群。

示例

@bentoml.service
class MyService:
    # depends on a service
    svc_a = bentoml.depends(SVC_A)
    # depends on a deployment
    svc_b = bentoml.depends(deployment="ci-iris")
    # depends on a remote service with url
    svc_c = bentoml.depends(url="http://192.168.1.1:3000")
    # For the latter two cases, the service can be given to provide more accurate types:
    svc_d = bentoml.depends(url="http://192.168.1.1:3000", on=SVC_D)

bentoml.validators

class bentoml.validators.PILImageEncoder[source]

Bases: object

decode(obj: bytes | t.BinaryIO | UploadFile | PILImage.Image) t.Any[source]
encode(obj: PILImage.Image) bytes[source]
class bentoml.validators.FileSchema(format: str = 'binary', content_type: str | None = None)[source]

Bases: object

content_type: str | None
decode(obj: bytes | BinaryIO | UploadFile | PurePath | str) Any[source]
encode(obj: Path) bytes[source]
format: str
class bentoml.validators.TensorSchema(format: TensorFormat, dtype: t.Optional[str] = None, shape: t.Optional[t.Tuple[int, ...]] = None)[source]

Bases: object

property dim: int | None
dtype: t.Optional[str]
encode(arr: TensorType, info: core_schema.SerializationInfo) t.Any[source]
format: TensorFormat
property framework_dtype: Any
shape: t.Optional[t.Tuple[int, ...]]
validate(obj: Any) Any
class bentoml.validators.DataframeSchema(orient: str = 'records', columns=None)[source]

Bases: object

columns: tuple[str] | None
encode(df: pd.DataFrame, info: core_schema.SerializationInfo) t.Any[source]
orient: str
validate(obj: t.Any) pd.DataFrame
class bentoml.validators.ContentType(content_type: str)[source]

Bases: BaseMetadata

content_type: str
class bentoml.validators.Shape(dimensions: tuple[int, ...])[source]

Bases: BaseMetadata

dimensions: tuple[int, ...]
class bentoml.validators.DType(dtype: str)[source]

Bases: BaseMetadata

dtype: str