如何在国内使用 HuggingFace
概述
在中国大陆访问 Hugging Face Hub (huggingface.co) 可能会遇到网络连接慢或不稳定的问题。本文介绍几种稳定下载和使用 HuggingFace 模型的方法。
问题背景
在中国大陆访问 Hugging Face Hub (huggingface.co) 可能会遇到网络连接慢或不稳定的问题,导致模型下载失败。有几种推荐的方法可以在国内更稳定地下载和使用 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 这个模型:
方法一:使用 Hugging Face 官方中国镜像 (推荐)
Hugging Face 提供了一个官方的镜像站点 hf-mirror.com,专门用于改善中国用户的访问体验。你可以通过设置环境变量来让 transformers 和 sentence-transformers 库自动从这个镜像下载。
-
设置环境变量: 在运行你的 Python 脚本之前,在终端中设置以下环境变量:
export HF_ENDPOINT=https://hf-mirror.com- 说明:这个环境变量会告诉 Hugging Face 的库(包括
transformers和sentence-transformers)将所有对huggingface.co的请求重定向到hf-mirror.com。
- 说明:这个环境变量会告诉 Hugging Face 的库(包括
-
运行你的 Python 代码: 设置完环境变量后,你的 Python 代码无需任何修改。
SentenceTransformer在初始化时会自动尝试从镜像下载模型:# qdrant_service.py 或其他需要加载模型的文件 from sentence_transformers import SentenceTransformer import logging logger = logging.getLogger(__name__) # ... 其他代码 ... try: # 代码保持不变,库会自动使用 HF_ENDPOINT 指定的镜像 model_name = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2' logger.info(f"尝试从配置的端点加载嵌入模型:{model_name}...") embedding_model = SentenceTransformer(model_name) logger.info(f"模型 {model_name} 加载成功。") # vector_size = embedding_model.get_sentence_embedding_dimension() # 获取维度等后续操作 except Exception as e: logger.error(f"加载模型 {model_name} 时出错: {e}", exc_info=True) # 这里可以根据需要决定是否抛出异常或进行其他处理 raise # 重新抛出异常,以便上层代码知道失败了 # ... 后续使用 embedding_model 的代码 ... -
持久化环境变量 (可选):
- 如果你希望每次打开终端都自动设置这个环境变量,可以将其添加到你的 shell 配置文件中(如
~/.bashrc或~/.zshrc):echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc source ~/.bashrc # 使更改立即生效 - 如果你在 Docker 或其他服务环境中运行,请相应地配置环境变量。
- 如果你希望每次打开终端都自动设置这个环境变量,可以将其添加到你的 shell 配置文件中(如
方法二:使用 ModelScope 镜像 (国内常用)
ModelScope (魔搭社区) 是阿里巴巴达摩院推出的模型社区,也提供了 Hugging Face 模型的镜像。
-
安装 ModelScope (如果需要使用其库功能): 虽然我们主要用它的镜像地址,但了解一下其库可能也有用。
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple -
设置环境变量 (类似方法一): ModelScope 也可以通过
HF_ENDPOINT环境变量来使用,或者有时会推荐设置MODELSCOPE_CACHE来管理缓存,但对于下载,HF_ENDPOINT是关键。# 使用 ModelScope 提供的 HuggingFace 镜像地址(请查阅 ModelScope 最新文档确认地址) # 一个可能的地址是 (请验证): # export HF_ENDPOINT=https://modelscope.oss-cn-beijing.aliyuncs.com # 或者查找 ModelScope 官方推荐的 HF 镜像方式 # 更常见的是直接使用 ModelScope 库下载,见方法三注意:直接将 ModelScope 的 OSS 地址设为
HF_ENDPOINT可能不完全兼容所有 Hugging Face 库的功能,优先推荐官方镜像hf-mirror.com。
方法三:手动下载模型文件,并从本地加载
如果上述镜像方法仍有问题,或者你需要在完全离线的环境中使用,可以手动下载模型文件。
-
下载模型文件:
- 在网络条件较好的机器上,访问 Hugging Face 模型页面:
https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2/tree/main
(或者通过镜像访问:
https://hf-mirror.com/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2/tree/main) - 点击 “Files and versions” 标签页。
- 下载该目录下所有文件(特别是
pytorch_model.bin、config.json、tokenizer.json、vocab.txt、modules.json、sentence_bert_config.json等)。 - 将所有下载的文件放在目标服务器上的一个本地文件夹内,例如:
/data/models/paraphrase-multilingual-MiniLM-L12-v2
- 在网络条件较好的机器上,访问 Hugging Face 模型页面:
https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2/tree/main
(或者通过镜像访问:
-
修改 Python 代码以加载本地模型: 在你的代码中,将模型名称替换为包含模型文件的本地文件夹路径。
# qdrant_service.py 或其他需要加载模型的文件 from sentence_transformers import SentenceTransformer import logging import os # 引入 os 模块检查路径 logger = logging.getLogger(__name__) # ... 其他代码 ... # --- 指定本地模型路径 --- local_model_path = "/data/models/paraphrase-multilingual-MiniLM-L12-v2" # <--- 修改为你实际存放模型的路径 try: if not os.path.isdir(local_model_path): raise FileNotFoundError(f"指定的本地模型路径不存在或不是一个目录: {local_model_path}") logger.info(f"尝试从本地路径加载嵌入模型:{local_model_path}...") # 直接将本地路径传递给 SentenceTransformer embedding_model = SentenceTransformer(local_model_path) logger.info(f"模型从 {local_model_path} 加载成功。") # vector_size = embedding_model.get_sentence_embedding_dimension() except Exception as e: logger.error(f"从本地路径 {local_model_path} 加载模型时出错: {e}", exc_info=True) raise # ... 后续使用 embedding_model 的代码 ...
总结与建议:
- 首选方法一 (官方镜像):设置
HF_ENDPOINT=https://hf-mirror.com环境变量。这是最简单且兼容性最好的方法,代码无需修改。 - 备选方法三 (手动下载):如果网络完全受限或需要在离线环境部署,手动下载模型到本地并修改代码指定本地路径是最可靠的方案。
- 关于 ModelScope (方法二/四):虽然 ModelScope 是国内重要的模型平台,但将其镜像地址直接用于
HF_ENDPOINT的兼容性可能不如官方镜像。另一种方式是完全使用 ModelScope 的 Python SDK (modelscope库) 来加载和使用模型,但这需要修改你的代码逻辑以适配 ModelScope 的 API,而不是sentence-transformers的 API。
请根据你的具体网络环境和需求选择最合适的方法。对于大多数情况,方法一应该是最方便有效的。