为什么我的 PythonModel 需要 3 个参数,但只定义了 2 个?

问题描述 投票:0回答:1

我尝试通过

创建一个Python模型
  1. 创建班级
  2. 使用 mlflow 记录它

课程看起来像:

# 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”?

python mlflow custom-function
1个回答
0
投票

首先,

self
是一个特殊的类论证。在类中,当您定义以
self
作为输入的方法(例如/
def myfunction(self, myarg)
)时,必须将其作为类的属性(例如/
self.myfunction(myarg)
)而不是函数来调用。这有两件事:

  1. 它调用类方法,而不是类外部的方法
  2. 它输入 self 作为方法调用的第一个参数

固定类定义:

# 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->

© www.soinside.com 2019 - 2024. All rights reserved.