我尝试通过
创建一个Python模型课程看起来像:
# Model wrapper class
class ModelWrapper(mlflow.pyfunc.PythonModel):
def __init__(self):
self.generator = None
def predict(self, json_input):
# preprocess
df = function1(self, json_input) # returns a pandas df
# calculation
result = function12(self, df) # returns the result
return result
当我尝试使用 mlflow 记录模型时,问题出现了:
with mlflow.start_run() as run:
mlflow.pyfunc.log_model("custom_model",
python_model=ModelWrapper(),
input_example=json_input)
它给了我错误/警告:
WARNING mlflow.utils.requirements_utils: Failed to run predict on input_example, dependencies introduced in predict are not captured.
TypeError('ModelWrapper.predict() takes 2 positional arguments but 3 were given')Traceback (most recent call last): ...
直接调用类时使用:
model_wrapper = ModelWrapper()
print(model_wrapper.predict(json_input))
我得到了所需的输出。
但是当我尝试记录模型或加载然后调用预测函数时,我收到了上述错误。
有谁知道为什么或者第三个参数是什么,因为我只给函数提供“json_input”和“self”?
首先,
self
是一个特殊的类论证。在类中,当您定义以 self
作为输入的方法(例如/ def myfunction(self, myarg)
)时,必须将其作为类的属性(例如/ self.myfunction(myarg)
)而不是函数来调用。这有两件事:
固定类定义:
# Model wrapper class
class ModelWrapper(mlflow.pyfunc.PythonModel):
def __init__(self):
self.generator = None
def predict(self, json_input):
# preprocess
df = self.function1(json_input) # returns a pandas df
# calculation
result = self.function12(df) # returns the result
return result
其次,如果这不能解决问题,您可能需要向函数定义添加其他参数。当将调用传播到
input_example
时,调用 json_input
的方式可能会发送不需要的参数。
您始终可以将
*args
和 **kwargs
输入添加到 predict
方法定义中,以查看 log_model
实际上传递了哪些参数:
<-SNIP->
# find out what is being passed to your function:
def predict(self, *args, **kwargs):
for value in [*args]:
print(value)
for key in kwargs:
print(key, kwargs[key])
<-SNIP->
一旦您知道要发送的内容,您就可以根据自己的喜好重新排列输入。例如,如果您发现
json_input
是 arg[0]
,您可以这样定义:
<-SNIP->
def predict(self, my_value, event_value):
<-SNIP->