PyTorch环境配置
《动手学深度学习》运行环境

配置命令汇总
sh
# conda env list
# conda remove --name d2l --all
# 创建隔离环境d2l
conda create --name d2l python=3.9 -y
# 激活d2l环境
conda activate d2l
# 安装PyTorch的GPU版(NVIDIA 960M),并指定清华源
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 将NumPy降级为与PyTorch1.12.0匹配的版本
pip install numpy==1.26.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装d2l包,以方便调用书中常用的函数和类
pip install d2l==1.0.3
# 打开Jupyter笔记本,需先cd到对应目录
jupyter notebook
# 允许任何IP访问且不弹出浏览器,设置密码避免输入长串token
jupyter notebook --ip=0.0.0.0 --no-browser password
# 查看所有jupyter服务
jupyter server list验证配置是否成功
sh
# 查看本环境安装的所有包
conda listpython
# 验证运行状态
import torch
import numpy as np
print(f"PyTorch 版本: {torch.__version__}")
print(f"NumPy 版本: {np.__version__}")
print(f"CUDA 可用: {torch.cuda.is_available()}")
print(f"cuDNN 版本: {torch.backends.cudnn.version()}")
print(torch.tensor([1.0], device="cuda"))问题及处理方案
问题1:安装PyTorch时自动下载的NumPy为2.x,运行时会报错
sh
# 将NumPy降级为与PyTorch1.12.0匹配的版本
pip install numpy==1.26.4 -i https://pypi.tuna.tsinghua.edu.cn/simple问题2:Jupyter笔记本启动失败
log
(d2l) C:\codes\pytorch_jupyter>jupyter notebook
Traceback (most recent call last):
File "C:\Users\...\.conda\envs\d2l\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\...\.conda\envs\d2l\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\...\.conda\envs\d2l\Scripts\jupyter-notebook.EXE\__main__.py", line 2, in <module>
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\notebook\app.py", line 13, in <module>
from jupyter_server.base.handlers import JupyterHandler
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\jupyter_server\base\handlers.py", line 24, in <module>
from tornado import web
File "<frozen importlib._bootstrap>", line 1055, in _handle_fromlist
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\__init__.py", line 66, in __getattr__
return importlib.import_module("." + name, __name__)
File "C:\Users\...\.conda\envs\d2l\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\web.py", line 88, in <module>
from tornado.httpserver import HTTPServer
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\httpserver.py", line 32, in <module>
from tornado.http1connection import HTTP1ServerConnection, HTTP1ConnectionParameters
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\http1connection.py", line 34, in <module>
from tornado import iostream
File "<frozen importlib._bootstrap>", line 1055, in _handle_fromlist
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\__init__.py", line 66, in __getattr__
return importlib.import_module("." + name, __name__)
File "C:\Users\...\.conda\envs\d2l\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\iostream.py", line 40, in <module>
from tornado.netutil import ssl_wrap_socket, _client_ssl_defaults, _server_ssl_defaults
File "C:\Users\...\.conda\envs\d2l\lib\site-packages\tornado\netutil.py", line 35, in <module>
_client_ssl_defaults = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
File "C:\Users\...\.conda\envs\d2l\lib\ssl.py", line 753, in create_default_context
context.load_default_certs(purpose)
File "C:\Users\...\.conda\envs\d2l\lib\ssl.py", line 577, in load_default_certs
self._load_windows_store_certs(storename, purpose)
File "C:\Users\...\.conda\envs\d2l\lib\ssl.py", line 569, in _load_windows_store_certs
self.load_verify_locations(cadata=certs)
ssl.SSLError: [ASN1: NOT_ENOUGH_DATA] not enough data (_ssl.c:4192) # [!code highlight]原因
Windows 证书存储(Windows Certificate Store)中存在损坏/格式错误的证书。
详细信息
1.jupyter notebook 启动需要 tornado 服务器。
2.tornado 初始化网络连接时,默认会调用 ssl.create_default_context()。
3.Python 试图加载 Windows 系统根证书以建立安全连接。
4.在遍历系统证书时,某张证书的数据不完整(ASN1 解析错误),导致程序崩溃。
成功方案
釜底抽薪(Monkey patch),修改源文件捕获异常
C:\Users\...\.conda\envs\d2l\Lib\ssl.py
python
def _load_windows_store_certs(self, storename, purpose):
certs = bytearray()
try:
for cert, encoding, trust in enum_certificates(storename):
# CA certs are never PKCS#7 encoded
if encoding == "x509_asn":
if trust is True or purpose.oid in trust:
certs.extend(cert)
except PermissionError:
warnings.warn("unable to enumerate Windows certificate store")
if certs:
self.load_verify_locations(cadata=certs)
try:
self.load_verify_locations(cadata=certs)
except SSLError:
pass
return certs尝试过的方案
1.设置环境变量跳过 Windows 证书存储 (测试无效)
sh
set SSL_CERT_FILE=C:\Users\...\.conda\envs\d2l\Lib\site-packages\certifi\cacert.pem
jupyter notebook2.找到并删除 Windows 证书存储中的损坏证书
certmgr.msc -> 受信任的根证书颁发机构 -> 证书
找到了,但被系统环境所依赖,无法删除。
3.安装pip-system-certs (测试无效)
专门用来解决Windows证书信任问题,可能会绕过直接解析原始ASN1数据的过程。 通过注入机制,使Python的SSL/TLS上下文全局信任操作系统已安装的根证书 。 特别适用于公司内网、使用了中间人(MITM)代理或私有CA证书的环境,避免因为证书不被certifi收录而导致的SSL验证失败 。
sh
pip install pip-system-certs