-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
105 lines (88 loc) · 5.9 KB
/
Copy pathDockerfile
File metadata and controls
105 lines (88 loc) · 5.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# ============================================================
# MiaoCut 后端 Dockerfile(Hugging Face Docker Space)
# ============================================================
# 多阶段构建:builder 装依赖 → runtime 只拷成品,镜像更小。
#
# 构建:docker build -t miaocut-api .
# 运行:docker run --rm -p 7860:7860 \
# -e PORT=7860 \
# -e ALLOWED_ORIGINS=https://miaocut.app,https://www.miaocut.app \
# -e TRUST_PROXY=1 \
# -e MAX_CONCURRENCY=1 \
# miaocut-api
# ============================================================
FROM python:3.11-slim AS builder
WORKDIR /build
# 构建阶段也会 import rembg/mediapipe/OpenCV 来预下载模型;
# slim 镜像默认没有 libGL,缺失时会在 builder 的 python -c 里失败。
RUN apt-get update && \
apt-get install -y --no-install-recommends libgl1 libglib2.0-0 && \
rm -rf /var/lib/apt/lists/*
# 先装依赖(利用 Docker 缓存,改代码不重装依赖)
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
# 构建阶段预下载 sharp 档两个候选模型,避免容器启动后首个请求再去 GitHub 下载。
# isnet-general-use —— 当前 SHARP_MODEL 默认值(~1.3s,硬边主体性价比最高)
# birefnet-general-lite —— 设 SHARP_MODEL=birefnet-general-lite 可切回(发丝级细节)
# 两份都预置,运行时切 SHARP_MODEL 不用重新构建镜像。
# pip --prefix 安装的包不在 builder 默认 sys.path 中,所以显式设置 PYTHONPATH。
RUN mkdir -p /model-cache && \
U2NET_HOME=/model-cache \
PYTHONPATH=/install/lib/python3.11/site-packages \
python -c "from rembg.sessions import sessions_class; \
names=['isnet-general-use','birefnet-general-lite']; \
[print(next(sc for sc in sessions_class if sc.name()==n).download_models()) for n in names]"
# 构建期预下载 SimpleLama 的 big-lama.pt(~196MB,去水印 /api/remove-watermark 的 inpainting 模型)。
# 不预置的话,容器每次重启后第一个去水印请求都会触发 torch.hub 去 GitHub 重新下载这 196MB
# (容器日志里的 "Downloading ... big-lama.pt to ~/.cache/torch/..."),既拖慢冷启动恢复,
# 又可能让那个请求超时。预置到 /model-cache(下面会随 BiRefNet 权重一起 COPY 到 /opt/miaocut-models),
# 运行时用 LAMA_MODEL 环境变量直接指向它,SimpleLama 检测到本地文件就完全跳过下载。
RUN PYTHONPATH=/install/lib/python3.11/site-packages \
python -c "from torch.hub import download_url_to_file; \
download_url_to_file('https://github.com/enesmsahin/simple-lama-inpainting/releases/download/v0.1.0/big-lama.pt', '/model-cache/big-lama.pt')"
# ============================================================
FROM python:3.11-slim
# 系统依赖:MediaPipe/OpenCV 运行时需要 libGL/libglib。
RUN apt-get update && \
apt-get install -y --no-install-recommends libgl1 libglib2.0-0 && \
useradd -m -u 1000 user && \
mkdir -p /home/user/app /data && \
chown -R user:user /home/user/app /data && \
rm -rf /var/lib/apt/lists/*
WORKDIR /home/user/app
# 从 builder 拷贝已安装的 Python 包
COPY --from=builder /install /usr/local
COPY --from=builder --chown=user:user /model-cache /opt/miaocut-models
# 拷贝后端运行必需文件。前端由 Cloudflare Pages 托管,不放进 Space 镜像。
COPY --chown=user:user main.py .
# INT8 量化的 BiRefNet-lite 模型(~155 MB,由 scripts/quantize_birefnet_dynamic.py 离线生成)。
# main.py 检测到 .u2net/ 下有 birefnet-general-lite-int8.onnx 时会自动启用,
# 在 AVX-512 VNNI CPU(HF Space 的 Xeon 8375C 已确认有)上预期比 FP32 快 1.5~2.5×。
# 找不到该文件时静默回退到 FP32,本地 dev / 没跑量化的 build 都能正常运行。
COPY --chown=user:user models/birefnet-general-lite-int8.onnx /opt/miaocut-models/
# fur 档的 BiRefNet_lite-matting 模型(~224MB,由 scripts/export_matting_onnx.py 离线导出)。
# 维护方式和上面 int8 完全一致:owner 手动跑 scripts/upload_model_to_hf.py 把 onnx 推到三个 Space 的
# models/ 目录(同一个脚本现在两个模型一起推),workflow 的 allow_patterns 不碰 *.onnx。
# main.py 的 get_matting_session 检测到它就启用 fur matting;缺失时 fur 自动回退 legacy(见 ENABLE_FUR_MATTING)。
# ⚠️ 改这行会触发三个 Space rebuild:务必先把 onnx 传齐全部 3 个 Space 再 push,否则 COPY 找不到文件会让 build 失败。
COPY --chown=user:user models/birefnet-lite-matting.onnx /opt/miaocut-models/
# sharp 折中档的 BiRefNet-general-lite @ 768² 模型(~196MB,由 scripts/export_general_lite_onnx.py 导出)。
# 这是 SHARP_MODEL 的**默认底座**:毛发质量接近 1024² BiRefNet,速度只要 ~1/3。
# 维护方式和上面 int8 / matting 完全一致(upload_model_to_hf.py 三个模型一起推)。
# main.py 的 _find_sharp_768_model_path 检测到它就启用;缺失时自动回退 SHARP_768_FALLBACK(默认 isnet)。
# ⚠️ 同样:改这行会触发三个 Space rebuild,务必先把 onnx 传齐全部 3 个 Space 再 push。
COPY --chown=user:user models/birefnet-general-lite-768.onnx /opt/miaocut-models/
# Hugging Face Spaces 默认公开 7860 端口;反馈数据写 /data 以便挂载持久化存储。
# 模型已内置到镜像;rembg 模型缺失时会自动退到可写缓存目录。
# big-lama(去水印 inpainting 模型)由上面 builder 预置到 /opt/miaocut-models/big-lama.pt,
# 用 LAMA_MODEL 指定后 SimpleLama 直接加载本地文件,容器重启不再去 GitHub 重下 196MB。
ENV PORT=7860 \
U2NET_HOME=/opt/miaocut-models \
LAMA_MODEL=/opt/miaocut-models/big-lama.pt \
DATA_DIR=/data \
MALLOC_ARENA_MAX=2 \
MALLOC_TRIM_THRESHOLD_=131072
USER user
# 单 worker,不要加 --workers!(限流和并发控制在进程内存里)
EXPOSE 7860
CMD ["python", "main.py"]