MLflow R版注册模型加载后对象未找到问题求助
问题根源
问题出在R6类生成器的环境绑定逻辑:TRCDetector这类R6类在定义时,依赖的SESD、TRES、TCHA存放在原脚本环境中。用carrier::crate打包后,这些依赖虽被存入crate的函数环境,但TRCDetector的内部查找路径仍指向原脚本环境,容器的新环境中不存在该路径,因此触发"Object not found"错误。
可行解决方案
方案1:在预测函数内部绑定依赖到R6类环境
直接在crate的预测函数中,将打包好的依赖R6类注入TRCDetector的运行环境,确保其内部能直接找到依赖:
library(carrier) library(rlang) predictor <- crate( function(x) { # 将依赖R6类绑定到TRCDetector的专属环境 env_bind(environment(TRCDetector), SESD = SESD, TRES = TRES, TCHA = TCHA) # 调用模型 TRCDetector( data = x$value, time = x$timestamps, train_size = TRAIN_SIZE, dwin = DWIN, rwin = RWIN, alpha = ALPHA, maxr = MAXR ) }, # 打包所有必要依赖 TRCDetector = TRCDetector, SESD = SESD, TRES = TRES, TCHA = TCHA, TRAIN_SIZE = TRAIN_SIZE, DWIN = DWIN, RWIN = RWIN, ALPHA = ALPHA, MAXR = MAXR )
方案2:提前修改R6类环境再打包
若不想在预测函数中加入额外逻辑,可提前修改TRCDetector的环境,让它直接指向包含所有依赖的环境:
library(carrier) library(rlang) # 克隆TRCDetector原始环境并绑定所有依赖 trc_env <- env_clone(environment(TRCDetector)) env_bind(trc_env, SESD = SESD, TRES = TRES, TCHA = TCHA) # 替换TRCDetector的环境为新的绑定环境 environment(TRCDetector) <- trc_env # 打包模型(无需重复传入SESD/TRES/TCHA) predictor <- crate( function(x) TRCDetector( data = x$value, time = x$timestamps, train_size = TRAIN_SIZE, dwin = DWIN, rwin = RWIN, alpha = ALPHA, maxr = MAXR ), TRCDetector = TRCDetector, TRAIN_SIZE = TRAIN_SIZE, DWIN = DWIN, RWIN = RWIN, ALPHA = ALPHA, MAXR = MAXR )
验证方法
用mlflow_log_model()记录模型后,在容器中通过mlflow_load_model()加载,直接调用预测函数或执行mlflow models serve命令,即可正常使用模型,无需手动提取依赖。
内容的提问来源于stack exchange,提问作者jdevoo
相关产品推荐
相关产品推荐

