import sys sys.path.append('/kaggle/input/demonews/') import os os.environ['HF_ENDPOINT']='https://hf-mirror.com' from flask import Flask, request, jsonify import torch import os from preprocess import preprocess_text from model import MultiModalClassifier from flask_cors import CORS # ✅ 允许跨域请求 from gevent.pywsgi import WSGIServer # 初始化 Flask 应用 app = Flask(__name__) CORS(app) # ✅ 允许所有前端访问 # 加载训练好的模型 model_path = os.path.join("/kaggle/working", "model.pth") model = MultiModalClassifier() try: model.load_state_dict(torch.load(model_path, weights_only=True)) # ✅ 安全模式 model.eval() print("✅ 模型加载成功") except Exception as e: print(f"❌ 模型加载失败: {str(e)}") exit(1) # 终止启动,避免无效运行 #model.load_state_dict(torch.load(model_path)) #model.eval() @app.route('/predict/text', methods=['POST']) def predict_text_api(): try: data = request.get_json() text = data.get('text', '').strip() if len(text) < 10: return jsonify({"error": "文本需≥10字符"}), 400 text_inputs = preprocess_text(text) # 需确保preprocess_text有异常处理 with torch.no_grad(): output = model(text_inputs, torch.zeros((1, 3, 224, 224))) prediction = torch.argmax(output, dim=1).item() print(f"🔍 预测结果: {prediction}") # ✅ 添加调试信息 return jsonify({"prediction": "AI Generated" if prediction == 1 else "Human Written"}) except Exception as e: print(f"⚠️ 预测异常: {str(e)}") return jsonify({"error": "内部处理错误"}), 500 if __name__ == '__main__':优化代码能在kaggle跑web服务
时间: 2025-07-06 08:36:30 浏览: 10
<think>嗯,用户想在Kaggle Notebook里部署一个包含Flask、PyTorch和多模态模型的Web服务,但需要优化代码来解决路径配置、依赖项和兼容性问题。首先,我得回忆一下Kaggle的环境限制。Kaggle的Notebook默认不支持外部访问,所以可能需要使用ngrok或者类似工具来暴露服务。然后,路径配置方面,Kaggle的工作目录通常是/kaggle/working,所以应该用绝对路径来确保模型和文件正确加载。
接下来是依赖项的问题。Kaggle预装了一些库,但可能没有用户需要的所有包。所以得在代码里用pip install命令安装缺失的依赖,比如flask_ngrok、pyngrok或者multimodal需要的特定库。不过要注意,Kaggle可能限制某些安装,所以需要确认是否允许。
兼容性方面,Kaggle使用的Python版本和PyTorch版本需要匹配。可能需要指定PyTorch的版本,避免版本冲突。另外,多模态模型可能比较大,Kaggle的内存和存储有限,得考虑模型加载的方式,比如使用预训练模型并确保只加载必要的部分。
Flask应用方面,通常会用app.run(),但在Kaggle里可能需要结合ngrok来启动。记得设置debug=False,避免多线程问题。另外,路由和端口配置也要调整,使用ngrok分配的公共URL。
还有,静态文件和模板的路径可能需要调整,确保Flask能找到它们。Kaggle的工作目录结构可能和本地不同,所以得用绝对路径或者正确的相对路径。
最后,测试整个流程,确保模型加载正确,依赖安装无误,并且外部能通过ngrok的URL访问服务。可能还需要处理超时问题,因为Kaggle Notebook在无操作一段时间后会休眠,所以用户需要知道这个限制。
总结步骤应该是:安装依赖、配置路径和模型加载、调整Flask应用设置、使用ngrok暴露服务,然后测试。同时提醒用户注意Kaggle的环境限制,比如资源限制和会话超时问题。</think>针对在Kaggle Notebook中部署包含Flask、PyTorch和多模态模型的Web服务需求,以下是分步优化方案:
### 一、环境适配性优化
1. **路径配置标准化**
```python
import os
# Kaggle默认工作路径为/kaggle/working
MODEL_PATH = os.path.join('/kaggle/input/your-model-path', 'multimodal_model.pth') # 模型文件需提前上传至数据集
UPLOAD_FOLDER = '/kaggle/working/uploads' # 文件上传目录
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
```
2. **依赖项管理**
```python
# 在Notebook首个单元格执行
!pip install flask_ngrok pyngrok==5.0.5 torchvision==0.15.2 transformers==4.30.2
# 注意需匹配Kaggle预装的PyTorch版本(可通过!pip freeze查看)
```
### 二、Flask服务改造
```python
from flask import Flask, request, jsonify
from flask_ngrok import run_with_ngrok # 添加ngrok支持
app = Flask(__name__)
run_with_ngrok(app) # 自动配置ngrok
# 初始化多模态模型
model = YourMultimodalModel()
model.load_state_dict(torch.load(MODEL_PATH, map_location=torch.device('cpu'))) # 强制CPU模式
model.eval()
@app.route('/predict', methods=['POST'])
def predict():
if 'file' not in request.files:
return jsonify({'error': 'No file uploaded'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'Empty filename'}), 400
file_path = os.path.join(UPLOAD_FOLDER, file.filename)
file.save(file_path)
# 执行推理(示例)
inputs = processor(Image.open(file_path), return_tensors="pt")
outputs = model(**inputs)
return jsonify({'prediction': outputs.logits.argmax(-1).item()})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False) # 必须关闭debug模式
```
### 三、Kaggle特性适配
1. **会话保持策略**
- 添加周期性访问保持代码防止会话超时:
```python
import threading
import time
import requests
def keep_alive():
while True:
time.sleep(60)
requests.get('http://localhost:5000/')
threading.Thread(target=keep_alive, daemon=True).start()
```
2. **资源限制应对**
```python
# 在模型加载后立即释放显存缓存
with torch.no_grad():
torch.cuda.empty_cache()
```
### 四、部署验证流程
1. 将模型文件上传至Kaggle数据集并挂载
2. 在Notebook中完整执行代码
3. 获取ngrok生成的公共访问URL(自动显示在输出中)
4. 使用curl测试接口:
```bash
curl -X POST -F "[email protected]" <ngrok_url>/predict
```
### 五、注意事项
1. Kaggle Notebook**不支持持久化服务**,最长运行时间为9小时[^1]
2. 免费版ngrok**每次重启会变更URL**,付费版可固定域名[^2]
3. 建议将预处理代码封装为独立函数,避免内存泄漏:
```python
def preprocess_image(image_path):
# 包含完整的预处理逻辑
# 处理完成后立即删除临时文件
os.remove(image_path)
return processed_tensor
```
阅读全文
相关推荐


















