You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:55:23