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

Docker部署Flask+Hugging Face模型重复下载问题优化求助

问题与解决方案

问题概述

基于Flask+Gunicorn开发的应用,搭配850MB的Hugging Face模型,部署Docker容器时遇到以下问题:

  • 容器启动时模型下载失败,陷入循环重试
  • 收到API请求时,Gunicorn重启worker并重新触发模型下载
  • 构建镜像时内置模型会使镜像体积超过2GB,不符合轻量化需求(无模型镜像仅50MB)

优化方案

1. 调整模型加载逻辑,避免重复下载

修改Flask应用代码,将模型初始化从应用创建阶段移出,改为容器启动后异步加载,并添加锁机制防止重复下载:

from flask import Flask, request, jsonify
from happytransformer import HappyTextToText, TTSettings
import threading
import os

model_happy_tt = None
args = None
model_loaded = False
load_lock = threading.Lock()

def load_model():
    global model_happy_tt, args, model_loaded
    with load_lock:
        if not model_loaded:
            # 指定模型缓存目录,便于后续持久化
            os.environ["TRANSFORMERS_CACHE"] = "/app/model_cache"
            os.makedirs("/app/model_cache", exist_ok=True)
            
            model_happy_tt = HappyTextToText("T5", "vennify/t5-base-grammar-correction")
            args = TTSettings(num_beams=5, min_length=1)
            # 预热模型
            model_happy_tt.generate_text("grammar: It's a jst run!!", args=args)
            model_loaded = True

def create_app():
    app = Flask(__name__)
    
    # 容器启动后异步加载模型
    threading.Thread(target=load_model, daemon=True).start()
    
    @app.route('/')
    def welcome():
        return 'Welcome to ProofReader Service'
    
    @app.route('/proofread', methods=["GET", "POST"])
    def proofread():
        global model_happy_tt, args
        # 若模型未加载,等待加载完成
        if not model_loaded:
            with load_lock:
                load_model()
        
        text = request.args.get('text')
        result = model_happy_tt.generate_text("grammar: " + text, args=args)
        return jsonify({'corrected_text': result.text})
    
    return app

app = create_app()

2. 配置模型缓存持久化

通过Docker卷将模型缓存目录挂载到外部存储,避免容器重启后重复下载:

修改Dockerfile

FROM python:3.10-slim
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . .
# 创建模型缓存目录
RUN mkdir -p /app/model_cache
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app", "--workers=1", "--timeout=120"]

启动容器时挂载卷

docker run -d -p 5000:5000 -v ./model_cache:/app/model_cache your-image-name

3. 优化Gunicorn启动参数

  • 保持单worker模式(--workers=1),避免多worker重复触发模型下载
  • 添加--timeout=120参数,延长启动超时时间,给模型下载预留足够时间

4. 可选:预下载模型到共享存储

若有稳定存储环境,可先在宿主机预下载模型,再挂载到容器:

# 宿主机预下载模型
mkdir -p ./model_cache
python -c "from happytransformer import HappyTextToText; HappyTextToText('T5', 'vennify/t5-base-grammar-correction')"

启动容器时挂载该目录即可直接使用已下载的模型。

内容的提问来源于stack exchange,提问作者Jack Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:45:15