本地下载huggingface模型并在服务器上使用流程

宇宙计算机 2024-10-11 15:07:05 阅读 94

linux服务器连接不上huggingface的解决办法(以及本地下载huggingface模型流程)

本地下载huggingface模型的办法方法一:使用huggingface_hub库下载离线加载模型

方法二:使用transformers库下载(需要安装pytorch库)离线加载模型

方法三: 使用git工具下载(但需要在git里设置代理)方法四:需要代理(使用huggingface-cli工具)

加载本地下载模型的方法:1. 模型存放路径的选择2. 项目文件结构示例3. 如何在代码中加载本地模型重点解释:

找到本地下载huggingface模型的服务器默认路径的方法最后的碎碎念

本地下载huggingface模型的办法

方法一:使用huggingface_hub库下载

先安装<code>huggingface_hub库:

pip install huggingface_hub

之后运行:

from huggingface_hub import snapshot_download

# 指定模型名称和下载路径

model_name = "bert-base-uncased"

save_path = "./my_local_model"

# 下载模型

snapshot_download(repo_id=model_name, cache_dir=save_path)

但是注意,因为网络问题需要科学上网才能下载下来.

但是我们可以使用镜像网站,不需要科学上网就能直接下载。

import os

os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 这个镜像网站可能也可以换掉

from huggingface_hub import snapshot_download

snapshot_download(repo_id="google-bert/bert-base-uncased",code>

local_dir_use_symlinks=False,

local_dir="./google-bert/bert-base-uncased")code>

离线加载模型

如果你已经下载好了模型,并且希望之后在离线环境中使用这些模型,你可以通过local_files_only=True参数来确保模型从本地加载,而不是重新联网下载。

model = AutoModel.from_pretrained(model_save_path, local_files_only=True)

tokenizer = AutoTokenizer.from_pretrained(model_save_path, local_files_only=True)

方法二:使用transformers库下载(需要安装pytorch库)

首先需要安装好pytorch库(AutoModelForSequenceClassification这个类是基于PyTorch的一个库)其次需要安装好Hugging Face 的 transformers 库以及 huggingface_hub 库。这两个库可以通过 pip 安装:

pip install transformers

pip install huggingface_hub

如果你使用的是Windows和pip,没有合适的GPU,可以安装CPU版本的PyTorch,可以使用以下命令:

pip install torch torchvision torchaudio

pip install transformers

from transformers import AutoTokenizer, AutoModelForSequenceClassification

# 下载模型和分词器

model_name = "bert-base-uncased"

tokenizer = AutoTokenizer.from_pretrained(model_name)

model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 保存模型到本地

model.save_pretrained("./models/bert-base-uncased")

tokenizer.save_pretrained("./models/bert-base-uncased")

离线加载模型

如果你已经下载好了模型,并且希望之后在离线环境中使用这些模型,你可以通过local_files_only=True参数来确保模型从本地加载,而不是重新联网下载。

model = AutoModel.from_pretrained(model_save_path, local_files_only=True)

tokenizer = AutoTokenizer.from_pretrained(model_save_path, local_files_only=True)

方法三: 使用git工具下载(但需要在git里设置代理)

参考如下帖子:

如何将 huggingface上的模型文件下载到本地

方法四:需要代理(使用huggingface-cli工具)

如何快速下载huggingface模型

加载本地下载模型的方法:

1. 模型存放路径的选择

根据项目的需求和规模,存放模型的路径一般有以下几种可能:

models/ 文件夹:这是最常见的做法。你可以在项目的根目录下创建一个名为 models 的文件夹,将下载好的 Hugging Face 模型存放在这个文件夹中。data/ 或 assets/ 文件夹:如果你的项目已经有其他资源文件目录(如 data 或 assets 文件夹),你可以选择将模型放在这些文件夹中,并确保代码路径能找到它。项目中的子模块:如果你的项目包含多个子模块,且每个模块需要使用不同的模型,你可以将模型放置到各个子模块的目录中。

2. 项目文件结构示例

假设你的项目是一个 NLP 应用,并且使用了 Hugging Face 的预训练模型。那么项目的结构可能会如下:

my_nlp_project/

├── models/ # 用于存放模型文件

│ └── bert-base-uncased/ # 具体模型文件目录

│ ├── config.json # 模型配置文件

│ ├── pytorch_model.bin # 模型权重

│ ├── tokenizer.json # 分词器文件

│ └── vocab.txt # 词汇表文件

├── data/ # 其他数据文件(可选)

├── src/ # 项目的源代码

│ └── main.py # 主代码文件

├── requirements.txt # 项目的依赖

└── README.md # 项目说明

比如模型是这样的时候,可以将Hugging Face的模型文件存放在 models/bert-base-uncased/ 目录下。

3. 如何在代码中加载本地模型

想要加载本地模型,最重要的一件事,是需要找到项目中的的from_pretrained方法,这个函数会指定指定模型的本地路径

示例代码

from transformers import AutoModel, AutoTokenizer

# 模型路径(相对于项目根目录)

model_path = "../models/bert-base-uncased/"

# 加载模型和分词器

model = AutoModel.from_pretrained(model_path)

tokenizer = AutoTokenizer.from_pretrained(model_path)

# 测试模型是否加载成功

print("模型和分词器成功加载!")

也可以使用相对路径来加载模型:

import os

# 获取当前文件的目录

current_dir = os.path.dirname(os.path.abspath(__file__))

# 构建模型的相对路径

model_path = os.path.join(current_dir, "../models/bert-base-uncased/")

model = AutoModel.from_pretrained(model_path)

tokenizer = AutoTokenizer.from_pretrained(model_path)

重点解释:

model_path:这是你指定的模型在项目中的路径。在这个例子中,模型文件存放在 models/bert-base-uncased/ 目录下,所以路径为 ../models/bert-base-uncased/

AutoModel.from_pretrainedAutoTokenizer.from_pretrained:这些函数可以直接从本地路径加载模型和分词器。

找到本地下载huggingface模型的服务器默认路径的方法

可以全局搜索,找到~/.cache/huggingface/hub/ 这个路径,我们可以把文件上传到这个路径上去。找到from_pretrained函数,比如这样的代码

大家加载huggingface模型,基本都是使用这两条代码来下载相关的文件的,所以我们只要找到这两条代码在哪里,就能找到文件的下载位置。

最后的碎碎念

我在运行grounddino的时候,是通过代码运行不成功的报错,还有一些调试搜索方法,找到的上面两行相关代码。(实际上使用vscode的全局搜索更好

也就是根据from_pretrained函数,进一步去好好搜索看了AutoTokenizer函数,之后找到的相应的信息。

# 我的代码报了错,我通过from_pretrained的报错,找到了这个文件

/root/anaconda3/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py

# 然后看了一下这个文件里的内容,找到了from_pretrained函数

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")

tokenizer = AutoTokenizer.from_pretrained("dbmdz/bert-base-german-cased")

tokenizer = AutoTokenizer.from_pretrained("FacebookAI/roberta-base", add_prefix_space=True)

然后对这些from_pretrained函数进行修改即可:

pytorch_pretrained_bert 的 .from_pretrained(‘bert-base-uncased‘)下载到了本地的那个位置_CodingPark编程公园

比如我在下面的代码里

from transformers import AutoTokenizer, BertModel, BertTokenizer, RobertaModel, RobertaTokenizerFast

import os

def get_tokenlizer(text_encoder_type):

# import ipdb;ipdb.set_trace();

if not isinstance(text_encoder_type, str):

# print("text_encoder_type is not a str")

if hasattr(text_encoder_type, "text_encoder_type"):

text_encoder_type = text_encoder_type.text_encoder_type

elif text_encoder_type.get("text_encoder_type", False):

text_encoder_type = text_encoder_type.get("text_encoder_type")

elif os.path.isdir(text_encoder_type) and os.path.exists(text_encoder_type):

pass

else:

raise ValueError(

"Unknown type of text_encoder_type: {}".format(type(text_encoder_type))

)

print("final text_encoder_type: {}".format(text_encoder_type))

# 新添加代码片段

tokenizer_path = "/root/autodl-tmp/GroundingDINO/bert-base-uncased" # 这个需要使用绝对路径才可以。他这里使用了相对路径,有可能报错。

tokenizer = BertTokenizer.from_pretrained(tokenizer_path, use_fast=False)

return tokenizer

'''

tokenizer = AutoTokenizer.from_pretrained(text_encoder_type)

return tokenizer

'''

def get_pretrained_language_model(text_encoder_type):

# import ipdb;ipdb.set_trace();

if text_encoder_type == "bert-base-uncased" or (os.path.isdir(text_encoder_type) and os.path.exists(text_encoder_type)):

# 新添加代码片段

model_path = "/root/autodl-tmp/GroundingDINO/bert-base-uncased"

return BertModel.from_pretrained(model_path)

# return BertModel.from_pretrained(text_encoder_type)

if text_encoder_type == "roberta-base":

return RobertaModel.from_pretrained(text_encoder_type)

raise ValueError("Unknown text_encoder_type {}".format(text_encoder_type))

重点是通过下面的语句更改了模型的使用路径

tokenizer_path = "/root/autodl-tmp/GroundingDINO/bert-base-uncased" # 这个需要使用绝对路径才可以。他这里使用了相对路径,有可能报错。

tokenizer = BertTokenizer.from_pretrained(tokenizer_path, use_fast=False)

model_path = "/root/autodl-tmp/GroundingDINO/bert-base-uncased"

return BertModel.from_pretrained(model_path)

可以好好参考一下下面这个帖子(huggingface 的官方文档)

huggingface-PreTrainedModel

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

以上



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。