如何自定义huggingface模型导入路径
如何自己定义导入的路径(包含对于.cache中模型的导入)
第一种是有一个完整的下载好的模型的情况,比如我这里有一个unet的模型,不管是什么格式,但是已经被下载到了本地的一个路径
这里需要注意的是huggingface这种导入模型都要有对应的一个config.json文件,缺失的话不能正确读入模型的一些模块类,对于这个自己手动下载到指定位置的模型,只需要使用它本身的路径即可,注意添加一个local_files_only=True,即不通过repo id的方式导入模型
unet = UNet2DConditionModel.from_pretrained(args.ckpt, trust_remote_code=True, local_files_only=True)
第二种是我在本地已经下载好了一个模型,这个模型是通过huggingface-cli download方式下载的,那么它会在一个huggingface默认配置的缓存路径存放,通常就是home路径下的这里
.cache/huggingface/hub
这里的模型是使用文件本体和软链接并存的方式,对于所有模型而言,会有3个文件夹分别是blobs,refs和snapshots
而我们真正要使用的模型其实是在blobs里,但是如果进入后会发现这些文件都不是正常的命名格式,是一堆编码文件名,但是他们的大小和原始模型的大小都完全对应的上,所以如果这些文件被删除或者移动,模型就没法正常被导入了,但是我们在使用的时候,更常见的情况是使用snapshots里的文件,snapshots文件夹
下也有一个编码命名的文件夹,再进去就是对应huggingface仓库中的目录格式了
但是要注意这里所有的文件其实都是软链接
,它们是刚刚blobs真实文件对应的软链接,而且这些软链接都是相对路径,一旦被复制到其他地方,就不能被使用了(如果绝对路径可以被使用,相对路径的情况下是否可以通过修改实现使用不确定,这里不做探究),所以为了保证不出问题,且方便管理,仍然遵循huggingface默认的这种模型管理方式,我们希望在自定义导入模型的时候,不去破坏这个hub里的模型文件——因此在传入模型的时候,就可以直接将对应模型的软链接所在路径传给导入模型的api
例如
base_path = '/home/用户名/.cache/huggingface/hub/models--stable-diffusion-v1-5--stable-diffusion-v1-5/snapshots/stable-diffusion-v1-5/'
vae_path = base_path+'vae'
vae = AutoencoderKL.from_pretrained(
vae_path,
revision=None,
local_files_only=True //这里同样要有这个标志位
)
这里我的snapshots下的文件夹名自己改过了,但是不影响模型导入,这样就可以自己使用stable diffusion仓库中特定的模型了,这个模型是事先通过huggingface-cli download到默认缓存路径的。
补充huggingface下载指定文件
首先为了加速国内下载,要使用
export HF_ENDPOINT=https://hf-mirror.com
这个指令是临时环境变量,只对当前终端所在进程生效,然后就可以使用hf的cli进行下载了,下载时可以通过–inclue “*.xxx” 或者–exclude “*.xxx”来实现包含和不包含某些文件了,譬如一个模型他有gguf,safetensors,bin等多种格式,或者有多个不同量化的版本,我们希望只下载其中一个,就可以通过exclude将其他的文件类型通过这种正则表达式来进行忽略,但是文件夹会仍然按照原始仓库的排列形式
下载如果是需要通过一些协议的,就需要使用huggingface-cli login,然后在settings里设置专门的token进行登录,这个指令很看网速,经常登录不上去,只能多尝试了
参考链接: huggingface 模型下载与离线加载
有其他问题或者实现方式欢迎补充。