Python-Docker环境首次API调用成功后二次调用遇Socket hang up致容器退出
Docker容器中Flask API二次调用崩溃问题排查与解决
问题概述
基于Hugging Face Transformers和FAISS开发的Python程序,本地测试API完全正常,但部署到Docker容器后,首次API调用成功,第二次调用时出现Error: Socket hang up错误,随后容器直接退出。
已尝试的排查动作
- 在请求URL末尾添加'/'
- 将Flask的host设置为
0.0.0.0 - 降级torch版本至1.11.0
- 调整Postman超时时间、最大响应大小,取消勾选'Send Postman token header'选项
- 使用Thunder Client与cURL测试API,问题依旧
Docker配置信息
FROM python:3.8.0 COPY . . RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt RUN python3 -m spacy download en_core_web_sm CMD [ "python3", "-m" , "flask", "run", "--host", "0.0.0.0", "--port=8002"] EXPOSE 8002
日志详情
首次成功调用日志
INFO:werkzeug:172.17.0.1 - - [14/Nov/2022 11:33:55] "POST /api/v1/quotes3/ HTTP/1.1" 200 - DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): huggingface.co:443 DEBUG:urllib3.connectionpool:https://huggingface.co:443 "HEAD /sentence-transformers/multi-qa-mpnet-base-dot-v1/resolve/main/tokenizer_config.json HTTP/1.1" 200 0 DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): huggingface.co:443 DEBUG:urllib3.connectionpool:https://huggingface.co:443 "HEAD /sentence-transformers/multi-qa-mpnet-base-dot-v1/resolve/main/config.json HTTP/1.1" 200 0
第二次失败调用日志
INFO:werkzeug:172.17.0.1 - - [14/Nov/2022 11:34:21] "POST /api/v1/quotes3/ HTTP/1.1" 200 - (test2) Meghas-Mac:test2 mj$
可能的原因与解决办法
1. Flask内置服务器性能不足
Flask默认的开发服务器为单进程单线程模式,无法承载Transformer大模型的多次请求,第二次调用时进程直接崩溃。
解决办法:替换为生产级服务器gunicorn:
- 在
requirements.txt中添加gunicorn - 修改Dockerfile的CMD命令:
注:CMD ["gunicorn", "--workers", "2", "--bind", "0.0.0.0:8002", "app:app"]app:app需根据实际代码调整,第一个app是Flask主文件名(如app.py),第二个app是Flask实例名。
2. 模型重复加载导致内存溢出
若每次请求都重新加载模型,两次调用后内存会被迅速占满,触发系统OOM(内存不足)杀死容器进程。
解决办法:在Flask应用启动时预加载模型,避免重复加载:
from flask import Flask from transformers import AutoModel, AutoTokenizer app = Flask(__name__) # 应用启动时一次性加载模型到内存 tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1") model = AutoModel.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1") @app.route('/api/v1/quotes3/', methods=['POST']) def handle_request(): # 直接使用已加载的模型处理请求 pass
同时检查FAISS索引的处理逻辑,及时释放无用资源,避免内存累积。
3. Docker内存限制不足
容器默认的内存配额可能无法支撑两次模型调用,导致进程因内存不足被系统终止。
解决办法:
- 启动容器时增加内存分配,例如分配4G内存:
docker run -m 4g -p 8002:8002 你的镜像名称 - 验证是否为OOM导致崩溃:
若返回docker inspect 你的容器ID | grep "OOMKilled""OOMKilled": true,则确认为内存不足问题。
4. 模型运行时下载异常
首次调用时模型从Hugging Face下载并缓存,第二次调用可能因缓存路径权限或网络问题触发异常。
解决办法:在Docker构建阶段提前下载模型,避免运行时动态下载:
修改Dockerfile,添加预下载步骤:
RUN python3 -c "from transformers import AutoModel, AutoTokenizer; AutoTokenizer.from_pretrained('sentence-transformers/multi-qa-mpnet-base-dot-v1'); AutoModel.from_pretrained('sentence-transformers/multi-qa-mpnet-base-dot-v1')"
同时确保容器内的模型缓存目录具备读写权限。
内容的提问来源于stack exchange,提问作者Megha John
相关产品推荐
相关产品推荐

