除Git LFS外,如何上传超100MB的Pickle模型至GitHub?Streamlit修复求助
解决GitHub大Pickle模型文件上传及Git LFS额度耗尽后的Streamlit部署问题
一、替代Git LFS的大Pickle模型上传方法
模型压缩
用Python的gzip或zlib模块压缩Pickle文件,大幅减小体积,若压缩后小于100MB可直接提交到仓库。示例代码:import pickle import gzip # 压缩保存模型 with gzip.open('model.pkl.gz', 'wb') as f: pickle.dump(trained_model, f) # 加载压缩后的模型 with gzip.open('model.pkl.gz', 'rb') as f: model = pickle.load(f)模型拆分存储
将大模型拆分为多个小文件(每个小于100MB),加载时合并。示例代码:import pickle import os # 拆分保存模型 def split_save_model(model, chunk_size=90*1024*1024): # 按90MB每块拆分 data = pickle.dumps(model) chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)] for idx, chunk in enumerate(chunks): with open(f'model_chunk_{idx}.pkl', 'wb') as f: f.write(chunk) # 合并加载模型 def load_split_model(): chunks = [] idx = 0 while os.path.exists(f'model_chunk_{idx}.pkl'): with open(f'model_chunk_{idx}.pkl', 'rb') as f: chunks.append(f.read()) idx += 1 data = b''.join(chunks) return pickle.loads(data)外部存储+仓库存下载脚本
将模型上传至公开的云存储服务,仓库中仅保留自动下载模型的脚本,应用启动时自动拉取模型。示例脚本:import requests import os MODEL_URL = "你的模型公开下载链接" MODEL_PATH = "model.pkl" if not os.path.exists(MODEL_PATH): response = requests.get(MODEL_URL) with open(MODEL_PATH, 'wb') as f: f.write(response.content)
二、Git LFS额度耗尽后的Streamlit Cloud修复方案
替换LFS模型文件为本地可提交版本
- 移除LFS对模型文件的跟踪:
git lfs untrack "model.pkl" - 用压缩或拆分方法处理模型文件,将处理后的文件添加到仓库:
git add model.pkl.gz # 或拆分后的chunk文件 git commit -m "Replace LFS model with compressed version" git push - 修改Streamlit项目代码,改为加载压缩/拆分后的模型文件,重新部署。
- 移除LFS对模型文件的跟踪:
修改Streamlit应用的模型加载逻辑
更新应用代码,改为从外部公开存储下载模型(参考上述外部存储脚本示例),确保模型链接可公开访问。推送更新后的代码到GitHub,Streamlit Cloud会自动重新部署。清理仓库的LFS历史
若仓库历史中大量LFS文件占用额度,用git filter-repo彻底移除相关文件历史:git filter-repo --path model.pkl --invert-paths执行后强制推送更新仓库:
git push --force之后改用压缩、拆分或外部存储的方式管理模型文件。
内容的提问来源于stack exchange,提问作者Aditya Kelkar
相关产品推荐
相关产品推荐

