并发与自动扩缩容¶
BentoCloud 会自动扩缩容您的 Bento 部署,以高效处理不同负载,无需手动干预。通过根据传入流量和最大副本数内的并发性动态调整服务副本数量,它确保了最佳的资源利用率和成本效益。
本文档解释了如何在 BentoCloud 中配置并发和自动扩缩容。
副本¶
您可以设置最小和最大副本数来定义扩缩容的边界,允许自动扩缩容器根据需要减少或增加副本数量。
缩容到零¶
缩容到零是一项功能,允许自动扩缩容器在服务空闲时将副本数量缩减到零。当您希望在非活动期间将副本数量减少到零以最大程度地降低成本时,此功能非常有用。
要启用缩容到零,请在部署配置中将最小副本数设置为 0。
当服务接收到请求时,部署将自动从零副本扩容。请求将被放入外部队列中排队,并且直到服务扩容完成后,超时计时器才会启动。
注意
要手动触发从零副本的扩容,您可以使用 HTTP GET 请求调用 /readyz
端点。
并发¶
要启用自动扩缩容,首先为您的 BentoML 服务配置 concurrency
(并发)。并发是指 BentoML 服务能够同时处理的并发请求数量。适当的并发管理可确保服务能够高效处理不同负载,最大程度地利用资源同时保持高质量的服务 (QoS)。
使用 @bentoml.service
装饰器设置并发
@bentoml.service(
traffic={
"concurrency": 32, # An integer value
}
)
class MyService:
...
警告
如果未设置 concurrency
,服务将仅根据 CPU 利用率进行自动扩缩容,这可能不是您服务的最佳选择。
设置此参数意味着当每个副本的并发请求超过指定的并发阈值时,服务将在 BentoCloud 上自动扩缩容。
例如,考虑一个场景,concurrency
设置为 32,服务当前正在使用 2 个副本运行;在这种情况下,服务直到同时处理超过 64 个请求才会扩容。例如,如果服务收到 100 个并发请求,BentoCloud 将自动扩容到 4 个副本以有效管理增加的流量。相反,如果并发请求数量减少到 32 以下,BentoCloud 将智能地缩容到 1 个副本以优化资源利用率。
通常,自动扩缩容器将根据以下公式,在部署中 min_replicas
和 max_replicas
设置允许的范围内,扩缩容副本数量。

关于并发的关键点
默认情况下,BentoML 不对
concurrency
施加限制以避免瓶颈。为了确定concurrency
的最佳值,我们建议使用诸如 Locust 之类的负载生成工具在本地或 BentoCloud 上对您的服务进行压力测试。压力测试的目的是确定您的服务可以处理的最大并发请求数量。确定此最大值后,将并发参数设置为略低于此阈值的值,以确保服务有足够的余量来处理流量波动。如果您的服务支持自适应批处理或连续批处理,请将
concurrency
设置为与批处理大小匹配。这将处理能力与批处理需求对齐,优化吞吐量。对于设计为一次处理一个请求的服务,请将
concurrency
设置为1
,确保请求按顺序处理,不会重叠。
外部队列¶
您还可以配置启用外部请求队列来缓冲传入请求。当您希望防止服务因超出并发阈值的请求而过载时,此功能非常有用。
启用外部队列后,BentoCloud 会将多余的请求保存在队列中,直到服务有能力处理它们。这确保了服务同时接收的请求永远不会超过 concurrency
设置允许的数量。BentoCloud 将根据队列中的请求数量自动扩缩容副本数量。
注意
使用外部队列会增加服务的延迟,因为处理队列中的请求需要额外的 I/O 操作。
您可以使用 @bentoml.service
装饰器在 BentoCloud 上通过外部请求队列增强并发管理
@bentoml.service(
traffic={
"concurrency": 32, # An integer value
"external_queue": True, # A BentoCloud-only field. If set to true, BentoCloud will use an external queue to handle excess requests
}
)
class MyService:
...
注意
如果您在 @bentoml.service
装饰器中启用了 external_queue
,则必须指定一个 concurrency
值。
值得注意的是,当外部队列启用时,max_concurrency
将不再生效,因为 BentoCloud 保证服务同时接收的请求永远不会超过 concurrency
设置允许的数量。因此,永远不会达到 max_concurrency
。
自动扩缩容策略¶
您可以使用稳定窗口自定义扩缩容行为以匹配您服务的需求。
稳定窗口定义了一个时间段,在此期间自动扩缩容器暂时延迟对副本数量进行向上或向下扩缩容。这有助于防止因短暂的流量激增或下降而导致快速或不必要的扩缩容。
您可以将稳定窗口设置为 0 到 3600 秒之间的任何值。
要设置自动扩缩容策略,您需要在单独的 YAML 或 JSON 文件中配置上述字段。例如
services:
MyBentoService: # The Service name
scaling:
max_replicas: 2
min_replicas: 1
policy:
scale_up_stabilization_window: 180
scale_down_stabilization_window: 600
然后,您可以通过引用此文件来部署您的项目。
bentoml deploy . -f config-file.yaml
import bentoml
# Set `bento` to the Bento name if it already exists
bentoml.deployment.create(bento = "./path_to_your_project", config_file="config-file.yaml")