在Vercel部署Flask机器学习应用时遭遇AttributeError求助
Flask机器学习模型部署Vercel时的AttributeError问题
将基于Flask的机器学习模型部署到Vercel时,出现如下错误:
Traceback (most recent call last): File "./index.py", line 16, in load_models model = OnlineLearningModel.load("exchange_model.pkl") File "/var/task/online_learning_model.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'
该应用本地运行正常,但部署到Vercel后无法加载模型,已尝试相关调试建议,添加try/catch定位错误,问题仍未解决。
文件夹结构

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)
online_learning_model.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": "/" } ] }
内容的提问来源于stack exchange,提问作者donmoy
相关产品推荐
相关产品推荐

