🍍个人主页:Yang-ai-cao
📕系列专栏:深度学习
🌸博学而日参省乎己,知明而行无过矣
目录
在本篇博客中,我们将详细介绍如何从训练一个BERT模型开始,逐步实现API部署,并最终制作一个简单的网页应用来调用该API。整个过程包括模型训练、API服务端开发、网页端开发,以及如何将这些部分集成起来。看到许多朋友在使用BERT模型,网上多数文章只提到了模型的训练方法,后面的生产部署及调用并没有说明。这段时间使用BERT模型完成了从数据准备到生产部署的全流程,在这里整理出来,方便大家参考。
一、基本架构
实现思路
+-------------------+
| 应用端(HTML) |
+-------------------+
^^
||
VV
+-------------------+
| API服务端 |
+-------------------+
^^
||
VV
+-------------------+
| BERT模型服务端 |
+-------------------+
1. BERT模型服务端
功能:
- 加载预训练的 BERT-BiLSTM-CRF 模型。
- 提供实时预测服务。
实现:
- 使用 Flask 或 FastAPI 创建一个服务端。
- 加载模型时只在服务启动时进行,以提高效率。
- 提供一个 HTTP 接口,接受文本输入并返回预测结果。
代码:BERT完整全流程代码,文件命名:sentiment_model.py
2. API服务端
接下来,我们将训练好的模型部署为一个API服务。我们使用Flask框架来实现。
功能:
- 调用 BERT 情感分类模型服务端的预测接口。
- 提供一个 API 接口,供应用端调用。
实现:
- 使用 Flask 创建一个服务端。
- 在接收到请求后,调用 BERT 模型服务端的预测接口,并返回结果。
示例代码:命名:app.py
# app.py
from flask import Flask, request, jsonify
from flask_cors import CORS
from sentiment_model import SentimentClassifier
app = Flask(__name__)
CORS(app)
classifier = SentimentClassifier()
@app.route('/predict', methods=['POST'])
def predict():
text = request.form.get('text', '') # 从表单数据获取文本
if not text:
return jsonify({'error': 'No text provided'}), 400
label, confidence = classifier.predict(text)
return jsonify({'label': label, 'confidence': confidence})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
3. 应用端
我们将制作一个简单的HTML网页,用户可以在网页上输入文本,并通过调用API获取分类结果。
功能:
- 提供用户界面,允许用户输入文本并查看预测结果。
- 调用 API 服务端的接口,获取预测结果并展示给用户。
实现:
- 使用 HTML 和 JavaScript 创建一个简单的网页。
- 使用 AJAX 调用 API 服务端的接口。
示例代码:
命名:index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sentiment Analysis</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head>
<body>
<div class="container mt-5">
<div class="card">
<div class="card-body">
<h1 class="card-title text-center">Sentiment Analysis</h1>
<textarea class="form-control my-3" id="text-input" placeholder="Enter text here..."></textarea>
<button class="btn btn-primary btn-block" onclick="analyzeSentiment()">Analyze</button>
<div class="result mt-3" id="result"></div>
</div>
</div>
</div>
<script>
async function analyzeSentiment() {
const text = document.getElementById('text-input').value;
const response = await fetch('/predict', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({ text })
});
const result = await response.json();
document.getElementById('result').innerHTML = `<div class="alert alert-info">Label: ${result.label}, Confidence: ${(result.confidence * 100).toFixed(2)}%</div>`;
}
</script>
</body>
</html>
二、部署思路与细节知识
(1)、部署思路
- 模型训练:在本地或云端训练BERT模型,并保存训练好的模型。
- API部署:将训练好的模型部署为API服务,可以使用Flask或FastAPI等框架。
- 网页制作:创建一个简单的前端网页,用户可以在网页上输入文本,并调用API获取结果。
- 集成与测试:将前端网页与API服务集成,进行测试和调试。
(2)、部署涉及的细节知识
-
环境配置:
- 确保所有必要的库已经安装。
- 配置虚拟环境以避免依赖冲突。
-
模型加载优化:
- 在服务启动时加载模型,避免每次请求都加载模型。
- 使用缓存机制来提高性能。
-
API安全性:
- 使用API密钥或其他认证机制来保护API。
- 对输入数据进行验证和清理,防止注入攻击。
-
跨域资源共享(CORS):
- 使用
flask-cors
库来处理跨域请求问题。
- 使用
-
容器化部署(可选):
- 使用Docker将API服务容器化,便于部署和管理。
- 创建Dockerfile,定义容器的构建过程。
-
负载均衡和扩展:
- 使用负载均衡器来分发请求,确保服务的高可用性。
- 水平扩展API服务,处理更多的并发请求。
三、集成和测试
我们可以在Pycharm-Terminal执行:
1.启动BERT模型服务端:
python sentiment_model.py
2.启动API服务端
运行app.py
python app.py
注意:根据自己实际的port和网址进入。如本文app.py中
@app.route('/predict', methods=['POST']) 即: http://127.0.0.1:5000/predict进入。
3.打开应用端
- 将
index.html
文件打开,选择浏览器访问:进入以下界面,输入自己的文本,Analyze即可实现情感分类。
-
HTML Form:
- 一个简单的表单,用于输入文本并提交。
- 表单包含一个输入字段和一个提交按钮。
-
JavaScript:
- 使用
fetch
API 发送 AJAX 请求到 Flask API。 - 请求类型为
POST
,并设置Content-Type
为application/json
。 - 提交表单时将输入的文本作为 JSON 数据发送到 Flask API。
- 接收到响应后,更新页面上的结果区域。
- 使用