在try 使用FlaskTM将机器学习模型部署到Vercel时,我收到以下错误:
Traceback (most recent call last):
File "./index.py", line 16,
in load_models model = OnlineLearningModel.load("exchange_model.pkl")
File "/var/task/在线学习模型.py", line 65,
in load obj = joblib.load(f)
File "/var/task/joblib/numpy_pickle.py", line 648,
in load obj = _unpickle(fobj)
File "/var/task/joblib/numpy_pickle.py", line 577,
in _unpickle obj = unpickler.load()
File "/var/lang/lib/python3.9/pickle.py", line 1212,
in load dispatch[key[0]](self)
File "/var/lang/lib/python3.9/pickle.py", line 1537,
in load_stack_global self.append(self.find_class(module, name))
File "/var/lang/lib/python3.9/pickle.py", line 1581,
in find_class return _getattribute(sys.modules[module], name)[0]
File "/var/lang/lib/python3.9/pickle.py", line 331,
in _getattribute raise AttributeError("Can't get attribute {!r} on {!r}"
AttributeError: Can't get attribute 'OnlineLearningModel' on <module '__main__' from '/var/runtime/bootstrap.py'
我试着按照this link中的建议go 做,但错误仍然存在.当我在电脑上本地部署时,这款应用运行得很好,但在Vercel上却不行.我添加了一个Try/Catch来定位错误
Here is my folder structure and files
index.py
from flask import Flask, render_template, request
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from online_learning_model import OnlineLearningModel
import joblib
app = Flask(__name__)
def load_models():
try:
model = OnlineLearningModel.load("exchange_model.pkl")
error_message = None
return model, error_message
except Exception as error:
error_message = f"Model could not be loaded due to error: {error}"
return None, error_message
@app.route("/", methods=["GET", "POST"])
def home():
model, error_message = load_models()
result_message = error_message
if request.method == "POST":
result_message = "Testing"
return render_template("index.html", result=result_message)
if __name__ == "__main__":
app.run(debug=True)
在线学习模型.py
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
import joblib
class OnlineLearningModel:
def __init__(self):
self.sgd = SGDRegressor(loss="squared_loss", penalty="l2", random_state=0)
self.scaler = StandardScaler()
def predict(self, year):
X_new_scaled = self.scaler.transform([[year]])
y_pred = self.sgd.predict(X_new_scaled)
y_pred_rounded = round(y_pred[0], 4)
return y_pred_rounded
@staticmethod
def load(fileName):
with open(fileName, "rb") as f:
obj = joblib.load(f)
return obj
Vercel.json
{
"builds": [
{
"src": "index.py",
"use": "@vercel/python"
},
{
"src": "static/**",
"use": "@vercel/static"
}
],
"routes": [
{
"src": "/(.*)",
"dest": "/"
}
]
}