如何在Heroku上直接部署已托管的预训练BERT模型Flask REST API?
可行方案:直接从托管地址加载BERT权重部署到Heroku
当然可以直接部署!完全不用把权重上传到Github或S3——直接从你现有的托管地址加载就行,下面是具体的步骤和优化技巧:
1. 在Flask应用中动态下载和解压权重
核心思路是让你的Flask应用在首次启动时自动从托管地址下载权重zip包,解压后直接使用,不用提前把权重放进代码仓库。
示例代码(假设你的Flask主文件是app.py):
import requests import zipfile import os from flask import Flask from transformers import BertModel # 根据你的BERT使用库调整 app = Flask(__name__) # 替换成你的权重zip托管地址 WEIGHTS_URL = "你的权重zip托管链接" # 解压后权重存放的目录 WEIGHTS_DIR = "./bert_pretrained_weights" # 首次请求前完成权重下载和解压 @app.before_first_request def setup_weights(): if not os.path.isdir(WEIGHTS_DIR): os.makedirs(WEIGHTS_DIR, exist_ok=True) # 流式下载zip文件,避免占用过多内存 zip_temp_path = "./temp_weights.zip" with requests.get(WEIGHTS_URL, stream=True) as r: r.raise_for_status() with open(zip_temp_path, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) # 解压到指定目录 with zipfile.ZipFile(zip_temp_path, 'r') as zip_ref: zip_ref.extractall(WEIGHTS_DIR) # 删除临时zip文件 os.remove(zip_temp_path) # 提前加载模型(可选,避免首次请求等待) global model model = BertModel.from_pretrained(WEIGHTS_DIR) # 你的API路由示例 @app.route('/predict', methods=['POST']) def predict(): # 这里编写你的预测逻辑,直接使用已加载的model return {"status": "success", "prediction": "sample_result"} if __name__ == '__main__': app.run()
2. 配置Heroku部署环境
要让Heroku正确运行你的应用,需要准备两个关键文件:
requirements.txt:列出所有依赖包,比如:flask==2.3.3 requests==2.31.0 transformers==4.35.2 torch==2.1.0 # 如果用PyTorch版本的BERT gunicorn==21.2.0 # Heroku推荐的WSGI服务器Procfile:指定Heroku的启动命令:web: gunicorn app:app
3. 优化启动和运行体验
- 应对大权重文件:如果你的权重zip很大,Heroku默认60秒的启动超时可能不够,可以通过Heroku CLI设置更长的超时:
heroku config:set WEB_CONCURRENCY=1 TIMEOUT=120(超时时间可根据实际情况调整) - 提升下载速度:确保你的权重托管地址是CDN加速的,这样Heroku dyno下载会更快
- 避免重复下载(可选):付费dyno不会睡眠,权重只会在首次启动时下载一次;免费dyno每次唤醒都会重新下载,这是免费版的限制,若权重不大则影响有限
4. 注意事项
- 确保你的权重托管地址是公开可访问的,没有权限验证,否则应用启动时会下载失败
- 本地先测试:在本地运行
python app.py,确认权重能正常下载、解压,模型能加载,再部署到Heroku - Heroku的文件系统是临时的,重启dyno后所有临时文件会被清空,但我们的逻辑是每次启动都重新下载,所以不影响使用
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

