我在 s3 中保存了两个文件(模型和向量化器),并尝试从 s3 下载并在我的 Flask 应用文件中运行它们。但目前返回的是 dill.dill(没有名为的模块错误)。有趣的是,我在任何地方都没有导入“dill”,但看起来它是在内部导入并抱怨的。
import flask from flask import Flask, request, render_template, jsonify from sklearn.externals import joblib import numpy as np from scipy import misc from sklearn.feature_extraction.text import TfidfVectorizer import boto3 import pickle BUCKET_NAME = 'xxxx' MODEL_FILE_NAME = 'text-classification-model-v1.pk' VECTORIZER_FILE_NAME = 'word_vectorizer.pk' ACCESS_KEY="QQQQ" SECRET_KEY="ZZZZZ" S3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY, region_name='us-west-2') app = Flask(__name__) @app.route('/', methods=['GET']) def index(): payload = [request.args.get('description')] prediction = predict_(payload) return parse_data() def predict_(payload): transformed_text_features = load_vectorizer(payload) return load_model(MODEL_FILE_NAME).predict(transformed_text_features) def parse_data(): return 'xxx' def load_vectorizer(payload): with open("downloaded_vectorizer.pk", 'wb') as data: S3.download_fileobj(BUCKET_NAME, VECTORIZER_FILE_NAME, data) infile = open("downloaded_vectorizer.pk","rb") loaded_vectorizer = joblib.load(infile) infile.close() transformed_text_features = loaded_vectorizer.transform(payload) return transformed_text_features def load_model(model): with open("downloaded_model_textclassification.pkl", 'wb') as data: S3.download_fileobj(BUCKET_NAME, MODEL_FILE_NAME, data) infile = open("downloaded_model_textclassification.pkl","rb") model = pickle.load(infile) infile.close() return model ========== error message ========== File "\flask\predict_commodity.py", line 32, in index prediction = predict_(payload) File "\flask\predict_commodity.py", line 38, in predict_ transformed_text_features = load_vectorizer(payload) File "\flask\predict_commodity.py", line 60, in load_vectorize loaded_vectorizer = joblib.load(infile) File " \lib\site-packages\sklearn\externals\joblib\numpy_pickle.py", line 568, in load obj = _unpickle(fobj) File " \lib\site-packages\sklearn\externals\joblib\numpy_pickle.py", line 508, in _unpickle obj = unpickler.load() File " \anaconda3\Lib\pickle.py", line 1050, in load dispatch[key[0]](self) File "\Lib\pickle.py", line 1338, in load_global klass = self.find_class(module, name) File "\Lib\pickle.py", line 1388, in find_class __import__(module, level=0) ModuleNotFoundError: No module named 'dill.dill'
回答:
在你的代码中,你使用了 pickle
和 sklearn.externals.joblib
。这可能会引起问题。
此外,你可以尝试更新包:pip install dill --upgrade
。这对我解决相同的问题有帮助。