资讯动态

BentoML 模板参数(Template Arguments)完全指南:用 use_arguments() 让同一份 Service 适配任意模型与配置

发布时间:2026/9/25 3:21:39 来源:尧图企业网站定制
模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载从 BentoML v1.4.8 起你可以通过use_arguments()API 为 Service 定义模板参数template arguments在serve、build、deploy时传入动态且经过校验的参数。本文将完整覆盖参数 schema 的定义Pydantic 与无校验两种模式、CLI 传参方式--arg与--arg-file、缺参报错行为并结合仓库源码剖析参数如何经由依赖注入容器流入 Service 代码。读完本文你能把一份固定的service.py改造为可复用的模型模板例如同一份代码分别构建 Llama、DeepSeek 等不同模型的多卡推理 Bento而无需维护多份几乎相同的源码。为什么需要模板参数在真实生产中同一个推理服务的代码往往是相同的不同的只是模型名、GPU 数量与 GPU 型号。以往的做法是复制多份service.py或用环境变量层层透传。模板参数把哪些值是每次构建/部署时才确定的从代码中显式剥离出来这些参数在 Python 代码里就是普通变量可以直接用在service.py的任何位置——包括条件分支、循环和其他动态逻辑中。对应文档入口为 Configure template arguments其前置概念Service 本身见 Services。用 Pydantic 定义参数 schema带默认值与校验推荐做法是用pydantic.BaseModel声明参数结构可以为参数设置默认值并获得 Pydantic 的类型校验能力。示例如下from pydantic import BaseModel import bentoml class BentoArgs(BaseModel): model_name: str gpu: int 8 gpu_type: str nvidia-h200-141gb args bentoml.use_arguments(BentoArgs)要点model_name没有默认值是必填参数gpu默认 8gpu_type默认nvidia-h200-141gb均可在 CLI 覆盖声明后即可像普通 Python 变量一样引用args例如import bentoml bentoml.service( resources{ gpu: args.gpu, gpu_type: args.gpu_type } ) class LLM: model bentoml.models.HuggingFaceModel(args.model_name) ...这里bentoml.service(resources...)声明的 GPU 资源数和型号、HuggingFaceModel加载的模型仓库名都直接来自运行时注入的参数——同一份代码构建出的不同 Bento 会携带不同的资源配置和模型。从源码看use_arguments()接收一个可选的 Pydantic 模型参数传入模型时用model(**arguments)构造实例并触发 Pydantic 校验校验失败会被包装为带提示信息的InvalidArgument异常提示通过--arg修正参数。见 use_arguments 实现inject def use_arguments( model: type[Model] | None None, *, arguments: dict[str, Any] Provide[BentoMLContainer.bento_arguments], ) - Model | types.SimpleNamespace: ... if model is None: return types.SimpleNamespace(**arguments) try: return model(**arguments) except ValidationError as e: raise InvalidArgument( fArgument error. Please provide correct arguments via --arg option: {e} ) from e注意实现中的两个细节函数带有inject装饰器arguments通过simple_di从BentoMLContainer.bento_arguments这一静态 provider 中解析——该 provider 在 configuration 容器 中初始化为空字典{}类型重载overload区分了两种签名传入type[Model]返回Model不传则返回types.SimpleNamespace静态类型检查可以据此推断属性访问。不用 Pydantic 定义参数SimpleNamespace 模式use_arguments()也可以完全不传 schema 直接调用import bentoml args bentoml.use_arguments() bentoml.service(resources{gpu: int(args.gpu)}) class LLM: model bentoml.models.HuggingFaceModel(args.model_name) ...此时返回一个包含所有参数值的types.SimpleNamespace对象对应源码中types.SimpleNamespace(**arguments)分支见 args.py。需要明确两个取舍没有校验CLI 传入的所有值都保持字符串类型因此示例中int(args.gpu)需要手动转换没有默认值schema 模式里由 Pydantic 字段默认值兜底的逻辑在此不可用缺参时属性访问会直接抛AttributeError。仓库的单测 fixture 就采用了这种无 schema 用法测试用 service 把参数直接放进labelsimport bentoml args bentoml.use_arguments() bentoml.service(labels{foo: args.label}) class MyService: pass这说明模板参数不仅能驱动资源与模型加载也可以写入labels等元数据用于后续检索与区分构建产物。通过 CLI 提供参数值声明好模板参数后在以下命令中都可以动态供给参数值bentoml serve、bentoml build、bentoml deploy传入 Bento 路径时、以及bentoml codebentoml build --arg model_namemeta-llama/Llama-3.3-70B-Instruct --arg gpu4 bentoml serve --arg model_namedeepseek-ai/DeepSeek-V3 bentoml deploy --arg model_namedeepseek-ai/DeepSeek-V3 bentoml deployment update deployment_name --arg model_tag$MODEL_TAG --bento ./project/directory # 也可以在 YAML 文件中定义参数并传入 bentoml build --arg-file bento_args.yaml从源码看--arg与--arg-file由统一的装饰器build_args_option挂到各命令上见 build_args_option。该装饰器被bentoml buildbentos.py、bentoml serveserve.py以及deploy相关命令deployment.py 中create、update、code等命令共 5 处复用与文档描述的命令覆盖范围一致。两个选项的解析行为值得注意--arg KEYVALUE可以重复指定多次multipleTrue。回调 set_build_args 对每项执行item.partition()拆分若格式不是keyvalue会直接抛click.BadParameter报错解析出的键值对最终调用set_arguments(arguments, overrideFalse)写入依赖注入容器。--arg-file path指向一个 YAML 文件click.Path(existsTrue, dir_okayFalse)保证文件存在且不是目录。回调 set_build_args_from_file 用yaml.safe_load读取YAML 解析失败时抛出Invalid YAML file错误。示例文件格式即普通的键值对model_name: deepseek-ai/DeepSeek-V3 gpu: 4参数合并语义文件兜底命令行覆盖set_arguments的实现揭示了两种来源的合并规则见 set_argumentsdef set_arguments(arguments: dict[str, Any], override: bool True) - None: if not override: arguments | BentoMLContainer.bento_arguments.get() BentoMLContainer.bento_arguments.set(arguments)--arg与--arg-file都以overrideFalse调用新传入的键值与容器内已有值做并集|新传入的值对同名键具有更高优先级。因此若bento_args.yaml与--arg同时指定了同名参数命令行--arg的值生效——这与 CI/CD 场景中配置文件提供基线、流水线注入覆盖值的用法天然契合。参数如何流转到 Bento 与运行期写入容器后参数沿两条路径生效Service 定义期模块顶层的args bentoml.use_arguments(...)在构建/加载service.py时执行从BentoMLContainer.bento_arguments取到当前 CLI 注入的值因此bentoml.service(resources...)、HuggingFaceModel(args.model_name)等装饰与初始化代码拿到的就是本次运行传入的值Bento 元数据构建产物会把参数固化进 Bento 对象Bento 类 的args字段即以BentoMLContainer.bento_arguments.get()作为默认工厂——这使得bentoml deploy --bento path这类基于已构建 Bento 的操作也能复用其中固化的参数而不是重新要求传一遍。运行期服务侧同样读取该容器serving 实现 在拉起服务进程前取bento_args参与进程编排。缺省必填参数时的报错行为官方文档明确提示如果缺少必填参数BentoML 会在执行命令时报错。具体行为因模式而异Pydantic 模式model(**arguments)触发ValidationError被包装为InvalidArgument错误信息中会提示 Please provide correct arguments via--argoption见 args.pySimpleNamespace 模式无默认值兜底args.某必填字段在属性访问时抛AttributeErrorCLI 层--arg值格式非法缺或--arg-file指向不存在/非法 YAML 时在参数解析阶段即被 Click 拦截报错。因此建议优先使用 Pydantic schema它把参数是否齐全、类型是否正确的检查前移到服务加载之前错误信息也更可读。典型应用一份模板构建多个模型部署把上述能力组合起来一个典型的模型工厂工作流是维护一份模板化的service.py其中BentoArgs声明model_name必填、gpu、gpu_type带默认值每次需要部署新模型时仅通过 CLI 传参构建# 构建 Llama 3.3 70B 的 4 卡版本 bentoml build --arg model_namemeta-llama/Llama-3.3-70B-Instruct --arg gpu4 # 构建 DeepSeek-V3 版本走 YAML 文件 bentoml build --arg-file deepseek_args.yaml # 本地验证 bentoml serve --arg model_namedeepseek-ai/DeepSeek-V3 # 部署并滚动更新既有部署 bentoml deployment update deployment_name --arg model_tag$MODEL_TAG --bento ./project/directory由于参数被固化在 Bento 元数据中bentoml deploy等后续操作可直接基于构建产物工作无需重复声明参数。小结模板参数把每次部署才确定的值从 Service 代码中解耦出来use_arguments(BentoArgs)提供带默认值和 Pydantic 校验的强类型参数use_arguments()提供轻量的无校验SimpleNamespace--arg与--arg-file分别支持命令行逐项传参与 YAML 批量传参且同名键以命令行优先覆盖参数经BentoMLContainer.bento_arguments依赖注入容器分发并固化进 Bento 元数据供部署阶段复用。核心实现可进一步阅读 use_arguments 源码、CLI 选项定义 与 测试 fixture。适用前提该功能自 BentoML v1.4.8 起可用本文示例均以当前仓库v1.4.x 开发线的源码为准。赞分享模型推理服务人工智能后端大模型MLOpsLLMOps【免费下载链接】BentoMLThe easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!项目地址https://gitcode.com/gh_mirrors/be/BentoML点击查看免费下载相关推荐解锁AHKActionSheet自定义潜能3种按钮类型与UIAppearance高级技巧解锁AHKActionSheet自定义潜能3种按钮类型与UIAppearance高级技巧 AHKActionSheet是一款受Spotify应用启发的UIAc移动开发WeChatFerry 安装教程3 步跑通 Python 微信机器人WeChatFerry 安装教程3 步跑通 Python 微信机器人 WeChatFerry 是一个通过 hook PC 版微信客户端来运行微信机器人的开源微txtai Agent 配置完全指南模型、工具集、指令、模板与记忆参数详解txtai Agent 配置完全指南模型、工具集、指令、模板与记忆参数详解 txtai 的 Agent 框架是一个自动编排智能体它接收一个 LLM 与一人工智能大模型RAGAI Agent向量数据库NLP本地部署上一篇Go Micro 的 Model 包让每个服务都拥有类型化数据层Client、Server、Model 三位一体下一篇Instatic与Web Components服务企业开发的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑