如何解决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/子目录,代码中修改加载路径:
这种方式能彻底避免部署时下载大体积文件,大幅压缩Slug尺寸。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')
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 uvicornsentence-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
相关产品推荐
相关产品推荐

