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

如何解决Heroku部署中因Huggingface分词器导致的slug超限问题

解决Heroku部署Slug超500MB的优化方案

针对你因加载两个分词器触发Heroku Slug大小限制的问题,以下是几个更优的解决思路:

1. 本地加载分词器核心文件,避免部署时自动下载

手动下载两个分词器的必要文件(无需完整模型权重),放入项目目录后本地加载:

  • 从Huggingface Hub下载bert-base-uncased的核心分词器文件:vocab.txt、tokenizer_config.json、special_tokens_map.json、tokenizer.json
  • 下载multi-qa-MiniLM-L6-cos-v1对应的分词器文件(该模型的分词器基于bert-base-uncased变种,可直接下载其tokenizer相关文件)
  • 将文件放入项目的tokenizers/子目录,代码中修改加载路径:
    from transformers import BertTokenizerFast
    # 加载本地BERT分词器
    bert_tokenizer = BertTokenizerFast.from_pretrained('./tokenizers/bert-base-uncased')
    # 加载本地SentenceTransformer对应分词器
    st_tokenizer = BertTokenizerFast.from_pretrained('./tokenizers/multi-qa-MiniLM-L6-cos-v1')
    
    这种方式能彻底避免部署时下载大体积文件,大幅压缩Slug尺寸。

2. 精简依赖包,移除冗余组件

分词器本身不需要PyTorch等深度学习框架依赖,通过精简requirements减少体积:

  • 将requirements.txt中的transformers[torch]改为transformers,移除不必要的Torch依赖(Torch包体积通常超过300MB)
  • 若仅需使用multi-qa-MiniLM-L6-cos-v1的分词器,无需安装完整sentence-transformers库,直接用transformers加载即可,移除sentence-transformers依赖。修改后的requirements.txt:
    fastapi
    transformers
    requests
    uvicorn
    
    若必须使用sentence-transformers,可指定CPU版本依赖:sentence-transformers[cpu],避免下载GPU相关组件。

3. 启动时按需下载分词器至临时目录

Heroku的/tmp目录不计算入Slug大小,可在应用启动时将分词器下载至该目录:

from transformers import BertTokenizerFast, AutoTokenizer
import os

# 下载BERT分词器至临时目录
bert_tmp_dir = '/tmp/bert-tokenizer'
os.makedirs(bert_tmp_dir, exist_ok=True)
bert_tokenizer = BertTokenizerFast.from_pretrained(
    'bert-base-uncased',
    cache_dir=bert_tmp_dir
)

# 下载SentenceTransformer对应分词器至临时目录
st_tmp_dir = '/tmp/st-tokenizer'
os.makedirs(st_tmp_dir, exist_ok=True)
st_tokenizer = AutoTokenizer.from_pretrained(
    'multi-qa-MiniLM-L6-cos-v1',
    cache_dir=st_tmp_dir
)

缺点是应用重启时需重新下载,但能完全规避Slug大小限制。

4. 使用Docker多阶段构建控制镜像体积

通过Docker多阶段构建,分离依赖安装与运行环境,大幅压缩镜像大小:

# 第一阶段:安装依赖并预下载分词器
FROM python:3.9-slim as builder
WORKDIR /app
COPY requirements.txt .
# 安装依赖到用户目录
RUN pip install --user -r requirements.txt
# 预下载分词器到缓存目录
RUN python -c "
from transformers import BertTokenizerFast, AutoTokenizer
BertTokenizerFast.from_pretrained('bert-base-uncased')
AutoTokenizer.from_pretrained('multi-qa-MiniLM-L6-cos-v1')
"

# 第二阶段:构建轻量运行镜像
FROM python:3.9-slim
WORKDIR /app
# 复制依赖和分词器缓存
COPY --from=builder /root/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY --from=builder /root/.cache/huggingface/hub /root/.cache/huggingface/hub
# 复制项目代码
COPY . .
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "$PORT"]

构建时可添加RUN pip cache purge清理pip缓存,进一步减小镜像体积。

内容的提问来源于stack exchange,提问作者Christian Adib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:51:18