官方文档:https://github.com/triton-inference-server/server/blob/519a37a4ff35332bab5d129e6b04fb4da35e0fa6/docs/model_management.md
Model Management - 模型管理
triton 提供了模型管理API,作为HTTP/REST and GRPC protocols, and as part of the C API 的一部分。
triton 有三种控制模式:NONE, EXPLICIT or POLL
控制模式决定了 Triton
如何响应模型仓库(model repository)的变化,以及哪些协议和API是可用的。
Model Control Mode NONE - 模型控制模式: NONE
在启动 Triton 的时候,添加参数 --model-control-mode=none
,那么 Triton 会选择以 NONE 模式运行。如果不加 --model-control-mode
参数,Triton 会默认使用NONE模式。当 Triton正在运行的时候,修改模型仓库一定要谨慎行事,具体原因参考下面的 Modifying the Model Repository 一节。
Triton 启动时会尝试加载所以的模型,如果无法加载某个模型,Triton 会把这个模型标记为 UNAVAILABLE ,并且不会提供推理服务。
当服务正在运行时,修改了模型仓库,Triton 会忽略仓库的修改。通过模型控制协议进行加载(load)和卸载(unload)的操作请求,也会被忽略,同时会返回错误。
Model Control Mode EXPLICIT - 模型控制模式:EXPLICIT
在启动 Triton 服务时,添加 --model-control-mode=explicit
参数,则会启用 EXPLICIT 控制模式。当 Triton正在运行的时候,修改模型仓库的时候一定要谨慎行事,具体原因参考下面的 Modifying the Model Repository 一节。
启动 Triton 服务的时候,如果指定了 --load-model
参数,那么 Triton 只会加载这个参数指定的那些模型文件。如果要加载所有的模型文件,可以使用 --load-model=*
参数,并且命令中只能有一个 --load-model
参数出现。如果在命令中同时添加了 --load-model=*
和其它的 --load-model
参数,则会报错。在启动 Triton 服务时如果不指定任何 --load-model
参数,那么 Triton 就不会加载任何模型。Triton 无法加载的模型会被标记为 UNAVAILABLE 并且不会进行推理服务。
Triton 服务启动之后,所有加载模型和卸载模型的操作,都必须明确的使用模型控制协议来进行。使用模型控制协议进行操作时,可以从返回结果的状态知道加载/卸载模型的操作是成功了还是失败了。如果尝试重载一个已经加载的模型时失败了,那么已经加载的模型不会受到影响。如果重载成功,那么新加载的模型会替换掉之前加载的模型,并且不会丢失模型的可用性。
Model Control Mode POLL - 模型控制模式:POLL
在启动 Triton时,会尝试加载模型仓库中所以的模型。Triton 无法加载的模型,会被标记为 UNAVAILABLE ,并且不会进行推理服务。
对模型仓库的任何修改都会被检测到,Triton 将根据这些修改尝试加载或者卸载模型。当重载一个已经加载的模型时,如果失败了,那么之前加载的模型不会被影响;如果重载成功了,新加载的模型会替换之前加载的模型,并且模型的可用性不会受影响。
对模型仓库的修改不会被马上捕捉到,因为 Triton 服务时定期对模型仓库进行检测。你可以通过 --repository-poll-secs
参数来控制检测频率。通过终端日志或者模型准备协议,或者模型控制协议的操作索引,可以确定模型仓库的修改是否已经生效。
** WARNING **:Triton 检测模型和对模型进行修改操作这两者之间不存在同步。而结果就是,Triton 可能观察到部分以及不完整的改变,从而导致无法预料的行为。基于这个原因,不建议在生产环境环境中使用 POLL模式。
使用模型控制协议进行加载和卸载请求时,不会生效并且会返回错误信息。
在 POLL模式下,Triton 会对模型参考的如下几个改变进行响应:
-
可以在对应模型的目录添加/删除用来控制版本信息的子目录,来添加/删除版本信息。在执行请求的过程中删除了版本信息时,Triton 会继续完成未完成的请求。但是当版本信息被删除后,再对当前模型发起请求时会失败。根据模型版本协议,修改可用的版本信息,默认也会修改哪个模型会对外提供服务。
-
通过删除当前的模型根目录,可以把已经存在的模型删除。当删除已存在的模型后,Triton 会把正在进行的请求完成,而新的请求会失败。
-
增加一个新的模型目录可以增加一个新的模型。
-
模型配置文件(config.pbtxt) 被修改时,Triton 会卸载并重新加载这个模型,并重新加载配置文件。
-
标记文件用来对输出的信息进行标记,用来对输出信息进行分类。当添加、删除及修改标记文件时,Triton 会卸载并重新加载模型,以重载标记文件。如果添加或者删除了一个标记文件,那么也需要同时修改这个标记文件所属的模型配置文件。
Modifying the Model Repository - 修改模型仓库
在一个模型仓库中,每一个模型都放在自己的子目录中。每个模型子目录中被允许哪些活动,需要视 Triton 如何使用这个模型来确定。模型的状态可以通过 model metadata 或者 repository index API 来确定。
-
如果模型正在处于加载/卸载的过程中,那么禁止在子目录中增加、删除或者编辑文件或目录。
-
如果模型还没有开始加载,或者已经卸载完成,那么整个子目录都可以被删除,也可以在子目录中增加、删除或修改内容。
-
如果模型已经加载完成了,那么除了实现模型后端的共享库之外,可以在这个子目录中增加、删除或修改任何文化和目录。Triton 在加载模型时会使用这些后端的共享库,所以删除或者修改共享库会导致 Triton 崩溃。如果要更新一个模型的后端,那么你需要先完整的下载这个模型,然后再修改后端共享库,然后再重新加载这个模型。在一些操作系统中,也可以直接把当前的共享库移动到模型子目录以外的某个位置,然后把新的共享库复制进来,然后重新加载模型。