这个错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate 指出 Python 在尝试建立安全的 HTTPS 连接时,无法验证远程服务器(在此案例中是 GitHub 或 Hugging Face Hub,用来下载模型)的 SSL 证书。这通常是因为你的系统缺少必要的根证书或证书存储区设置不正确。

torch.hub.load 在后台会使用 Python 的 urllib 来下载文件,而 urllib 依赖操作系统的 SSL 功能来验证证书。

你代码中加入的 trust_repo=True 参数是用来信任存储库中的代码,而不是用来解决 SSL 连接的证书验证问题,所以它无法解决这个特定的 SSLCertVerificationError

如下常见解决方案,可依次尝试:

1 安装或更新证书 (最推荐,尤其macOS)

macOS

Python 安装程序(特别是从 python.org 下载的版本)通常会包含一个脚本来安装 certifi 包提供的根证书。

  1. 找到 Python 应用程序文件夹: 通常在 /Applications/Python 3.11/ (版本号可能不同)。
  2. 执行安装证书的命令: 在该文件夹中找到并双击执行 Install Certificates.command 脚本。这会安装或更新必要的证书链接。
  3. 重新执行你的 Python 脚本: 再次执行你的代码

Linux

尝试更新系统的 CA 证书:

  • Debian/Ubuntu: sudo apt update && sudo apt install ca-certificates
  • CentOS/Fedora/RHEL: sudo yum update ca-certificatessudo dnf update ca-certificates

2 使用 certifi 包提供的证书

certifi 是一个 Python 包,它提供了最新的 Mozilla 受信任 CA 证书包。你可以尝试让 Python 的 SSL 模块明确使用这个证书包。

安装 certifi

pip install --upgrade certifi

修改你的 Python 脚本,在 torch.hub.load 之前加入以下代码:

import ssl
import certifi
import os

# --- 新增的代码 ---
# 设置 SSL 使用 certifi 提供的证书路径
# 有些库会检查环境变量
os.environ['SSL_CERT_FILE'] = certifi.where()
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where() # 如果有使用 requests 库

# 尝试修改默认的 SSL context,让 urllib 使用 certifi
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # 旧版 Python 默认不验证 HTTPS 证书
    pass
else:
    # Monkey patch(猴子补丁)默认的 context 创建函数
    # 来使用 certifi 的 CA 包。
    try:
        # 使用 certifi 的证书来创建默认的 HTTPS context
        ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where())
        print("已成功配置 SSL context 使用 certifi。")
    except Exception as e:
        print(f"使用 certifi 配置 SSL context 时出错: {e}")
        print("将回退到可能未经验证的 context(安全性较低)。")
        # 如果上面的方法失败 (例如在某些环境下),作为备选方案可以禁用验证,但不推荐
        # ssl._create_default_https_context = _create_unverified_https_context
# --- 新增代码结束 ---

import torch

# 预训练模型来源
source = 'huggingface/pytorch-transformers'
# 选定加载模型的哪一部分, 这里是模型的映射器
part = 'tokenizer'
# 加载的预训练模型的名字
model_name = 'bert-base-chinese'

# 添加 trust_repo=True 参数以避免『代码』的信任问题,与 SSL 无关
try:
    print(f"正在从 '{source}' 加载 tokenizer '{model_name}'...")
    tokenizer = torch.hub.load(source, part, model_name, force_reload=False, trust_repo=True)
    print("Tokenizer 加载成功。")
    # 在这里可以加上使用 tokenizer 的示例
    # text = "你好,世界!"
    # encoded_input = tokenizer(text, return_tensors='pt')
    # print(encoded_input)
except Exception as e:
    print(f"执行 torch.hub.load 时发生错误: {e}")
    import traceback
    traceback.print_exc() # 打印详细的错误追踪信息

重新执行你的 Python 脚本。

3 完全禁用 SSL 验证 (不建议,有安全风险)

警告: 这个方法会让你的 Python 程序在进行所有 HTTPS 连接时都不验证服务器证书,这会让你容易受到中间人攻击。只应在完全了解风险且无法使用前两种方法时,或在受信任的内部网络环境中临时使用。

在你的脚本开头(import torch 之前)加入以下代码:

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # 旧版 Python 默认不验证 HTTPS 证书
    pass
else:
    # 创建一个未经验证的 SSL context
    ssl._create_default_https_context = _create_unverified_https_context
    print("警告:已全局禁用 SSL 证书验证。这是不安全的。")

import torch
# ... (你原来的代码) ...

4 总结

  1. 优先尝试方案一: 执行 Install Certificates.command (macOS) 或更新系统 CA 证书 (Linux)。这是最标准和安全的方法。
  2. 如果方案一无效,尝试方案二: 使用 certifi 来提供证书包。
  3. 最后的手段(不推荐)是方案三: 完全禁用 SSL 验证,但务必了解其安全风险。

优先尝试方案一,如果问题仍然存在,再尝试方案二。

本文由博客一文多发平台 OpenWrite 发布!

JavaEdge
374 声望417 粉丝