引言
刚开始接从HuggingFace下载模型时,发现直接用git clone
会遇到一个头疼的问题:明明只想下载几个小配置文件,结果却一直卡着不动,原因就在于它在下载模型文件,且没有进度条,不知道何时结束。
技术背景小贴士:HuggingFace 使用 Git LFS(Large File Storage)管理大文件。这个系统会在本地仓库中保留 LFS 文件指针,实际下载时再进行替换。这就导致了双倍空间占用——指针占一份,真实文件又占一份。
为什么需要跳过模型文件?
- 空间浪费:结合上面的小贴士,15G 的模型文件下载时实际需要 30G 存储空间
- 网络脆弱:没有进度条和断点续传,断网就要重头再来
- 灵活管理:用下载工具单独处理大文件更可靠
核心解决方案:GIT_LFS_SKIP_SMUDGE
配置一个环境变量来跳过模型文件的下载。一开始我只是考虑使用git clone来指定跳过文件,发现没有这种方法。后来搜索大文件,给了这样一个解决方案。
永久设置方案(适合长期开发者)
# Windows CMD
setx GIT_LFS_SKIP_SMUDGE 1
# Windows PowerShell
[System.Environment]::SetEnvironmentVariable('GIT_LFS_SKIP_SMUDGE','1','User')
临时设置方案(推荐单次使用)
# CMD 一次性方案
set GIT_LFS_SKIP_SMUDGE=1 && git clone --single-branch --branch 6_5 https://huggingface.co/bartowski/starcoder2-3b-exl2
# PowerShell 临时方案
$env:GIT_LFS_SKIP_SMUDGE=1; git clone --single-branch --branch 6_5 https://huggingface.co/bartowski/starcoder2-3b-exl2
注意:这里有个常见坑点——PowerShell 需要用分号分隔命令,而 CMD 用双&&符号。之前就因为这个差异,我的脚本在凌晨三点报错了十几次。
git clone后的补救措施
git clone完小文件后,模型文件的位置会被同名文本文件占用,这时候可以:
- 用 IDM/XDown 等工具下载大文件
- 把下载好的模型文件放到仓库的对应位置
比如目标模型文件地址是:
wget https://huggingface.co/bartowski/starcoder2-3b-exl2/resolve/6_5/output.safetensors
为什么推荐这个方案?
- 省空间:之前部署 Stable Diffusion 模型时,使用git clone提示磁盘空间不足,害我删除了好多文件。后来下载完成后发现没有占用那么大空间。
- 省流量:断网之后你要重新下载,因为不支持断点续传,所以之前下载的作费。