Windows系统PyTorch稳定安装指南:Conda环境配置与CUDA版本匹配详解
1. 项目概述为什么你的PyTorch安装总是不稳定在Windows上安装PyTorch尤其是想用上GPU加速这事儿听起来简单做起来却是个技术活。我见过太多新手甚至是有些经验的朋友照着官方文档或者一些简短的教程操作结果要么是版本不匹配要么是CUDA驱动冲突要么是conda环境里各种包打架最后弹出一个让人绝望的“RuntimeError: CUDA error: no kernel image is available for execution on the device”。这感觉就像拼乐高说明书看着都对但最后总有几个零件卡不进去。今天这篇内容就是我结合自己多次在Windows系统上“踩坑-填坑”的实战经验总结出来的一套超稳定的安装流程。它不仅仅是一份步骤清单更是一份“避坑指南”我会把每一步背后的逻辑、可能遇到的坑以及如何绕开都讲清楚。无论你是刚入门深度学习还是需要为新的项目或新的显卡比如热门的RTX 4060/5060配置环境这套方法都能帮你一次搞定避免反复折腾。2. 核心思路与工具选型为什么是CondaPyTorch官方通道在开始动手之前我们先理清思路。为什么我强烈推荐在Windows上用Conda来安装PyTorch而不是直接用pip这背后有几个关键的考量。2.1 Conda vs Pip环境隔离与依赖管理的本质区别pip是Python的包管理器它只管Python包。而Conda是一个跨平台的环境管理器它管理的不仅是Python包还包括这些包所依赖的非Python库比如CUDA Toolkit、cuDNN这些深度学习核心的底层驱动库。在Windows上手动安装和匹配CUDA、cuDNN版本是最大的痛点之一。Conda的强大之处在于它能自动解决这些复杂的依赖关系。当你通过Conda安装pytorch时它会一并安装与之精确匹配的cudatoolkit和cudnn确保整个软件栈版本兼容极大降低了环境配置的复杂度。注意很多人混淆了“系统安装的CUDA驱动”和“Conda环境里的cudatoolkit”。你的显卡需要安装NVIDIA的显卡驱动比如版本545.84这是系统级的。而Conda安装的cudatoolkit是一个运行时环境它包含了编译和运行CUDA程序所需的库文件版本如11.8、12.1需要与PyTorch预编译的版本严格对应。两者可以不同且通常Conda环境内的cudatoolkit优先级更高。2.2 镜像源的选择稳定压倒一切默认的Conda源特别是官方的defaults通道在国内访问速度慢且不稳定这是安装失败最常见的原因之一经常报错“CondaHTTPError”或“连接超时”。因此替换为国内镜像源是必须的第一步。但这里有个关键细节对于PyTorch我们优先使用其官方Conda通道。PyTorch官方维护了一个Conda通道pytorch里面存放着与特定CUDA版本匹配的、经过测试的PyTorch包。虽然清华、中科大等镜像也同步了该通道但同步可能有延迟。为了获得最稳定、最新的版本匹配我建议将官方通道添加到配置中并设置较高的优先级。我们将采用“国内源为主官方源为辅”的策略在保证速度的同时确保能获取到正确的包。2.3 版本匹配矩阵CPU、CUDA与PyTorch的三角关系这是整个安装过程的核心也是最多人栽跟头的地方。你需要明确三件事你的显卡是否支持CUDA绝大多数NVIDIA显卡都支持。你可以通过在命令行输入nvidia-smi来查看驱动版本和可支持的最高CUDA版本。你要安装CPU版还是CUDA版如果你的显卡性能不错如GTX 1060以上务必安装CUDA版本以利用GPU加速训练速度可能有数十倍的提升。如何确定版本号访问 PyTorch官网 使用其配置生成器。但注意官网给出的conda命令可能只包含pytorchtorchvision和torchaudio需要你根据PyTorch版本手动指定。一个更稳妥的方法是去PyTorch官方GitHub的Release页面查看详细的版本对应关系。我整理了一个截至目前的常见版本匹配参考表但强烈建议以PyTorch官网信息为准PyTorch 版本推荐 CUDA 版本对应 Condacudatoolkit说明2.3.0(最新)11.8, 12.1cudatoolkit11.8或12.1支持较新的RTX 40系显卡。2.2.011.8, 12.1cudatoolkit11.8或12.1稳定版本兼容性广。2.1.011.8, 12.1cudatoolkit11.8或12.12.0.011.7, 11.8cudatoolkit11.7或11.81.13.011.6, 11.7cudatoolkit11.6或11.7一些旧项目可能需要。对于RTX 4060/5060等40系、50系显卡它们需要CUDA 11.8或更高版本。因此选择PyTorch 2.x CUDA 11.8/12.1的组合是安全的。3. 超稳定安装步骤详解接下来我们进入实战环节。请严格按照步骤操作我会解释每一步的作用。3.1 第一步前置检查与Anaconda/Miniconda安装如果你已经安装了Anaconda或Miniconda可以跳过此步。但请确保conda可以在命令行中正常调用。检查显卡驱动打开命令提示符CMD或PowerShell输入nvidia-smi。如果能看到显卡信息和驱动版本说明驱动已安装。记下右上角显示的“CUDA Version”例如“12.4”这表示你的驱动最高支持CUDA 12.4但实际安装的CUDA工具包版本可以低于它。安装Miniconda推荐Anaconda体积庞大包含很多你可能用不到的包。Miniconda只包含conda和Python更加轻量。从 Miniconda官网 下载Windows 64位安装包。安装时务必勾选“Add Miniconda3 to my PATH environment variable”这样可以在任意命令行中使用conda。虽然安装程序警告说可能冲突但对于我们单独使用的情况勾选是最方便的。3.2 第二步配置超稳定Conda镜像与通道这是保障安装过程顺畅的关键。我们将配置清华源作为默认下载源同时添加PyTorch官方通道。以管理员身份打开“Anaconda Prompt”如果你安装了Anaconda或系统自带的“命令提示符CMD”或“PowerShell”。执行以下命令一次性添加清华镜像的各个频道和PyTorch官方频道。这些命令会修改用户目录下的.condarc文件。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/添加PyTorch官方通道优先级较高conda config --add channels pytorch设置搜索时显示通道地址方便我们确认包来源conda config --set show_channel_urls yes执行conda config --show channels检查通道顺序。pytorch通道应该在列表靠前的位置。如果需要调整顺序可以使用conda config --prepend channels pytorch将其置顶。清理并更新索引运行conda clean -i清除索引缓存然后运行conda update conda更新conda自身。这能确保我们获取到最新的包信息。实操心得有时即使配置了镜像下载某些特定包时仍然很慢或失败。这时可以临时使用-c参数指定从官方通道下载例如conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia。但优先让conda从我们配置的镜像中解决依赖大部分情况下速度更快。3.3 第三步创建独立的虚拟环境永远不要在base环境里直接安装项目依赖创建独立的虚拟环境是Python开发的最佳实践可以避免包版本冲突。创建一个名为pytorch_env的新环境并指定Python版本推荐3.9或3.10兼容性好conda create -n pytorch_env python3.9激活这个环境conda activate pytorch_env激活后命令行提示符前会出现(pytorch_env)字样表示后续所有操作都在这个隔离的环境中进行。3.4 第四步执行精准安装命令现在来到了最核心的一步。请不要直接复制网上过时的命令。我们以安装PyTorch 2.3.0 CUDA 12.1为例。确保你已经在pytorch_env环境下。访问 PyTorch官网 选择你的配置PyTorch Build: Stable (2.3.0) Your OS: Windows Package: Conda Language: Python Compute Platform: CUDA 12.1。官网会生成命令但通常只包含pytorch。我们需要一个更完整的命令确保torchvision和torchaudio版本也匹配。一个经过验证的完整命令如下conda install pytorch2.3.0 torchvision0.18.0 torchaudio2.3.0 pytorch-cuda12.1 -c pytorch -c nvidia命令解析pytorch2.3.0 torchvision0.18.0 torchaudio2.3.0精确指定三个核心包的版本确保它们彼此兼容。pytorch-cuda12.1这是一个“元包”它会自动拉取与CUDA 12.1兼容的PyTorch及其相关的CUDA依赖如正确的cudatoolkit。-c pytorch -c nvidia指定从pytorch和nvidia这两个官方通道查找这些包。即使配置了镜像这里显式指定可以确保获取到目标版本。执行命令后conda会解析依赖并列出将要安装、更新或降级的包列表。仔细核对特别是看是否包含了cudatoolkit-12.1.x。确认无误后输入y开始安装。这个过程会下载约2-3GB的文件请保持网络通畅。如果你想安装CPU版本命令更简单conda install pytorch2.3.0 torchvision0.18.0 torchaudio2.3.0 cpuonly -c pytorch3.5 第五步验证安装与CUDA是否可用安装完成后必须进行验证。首先在当前的pytorch_env环境下启动Python解释器python在Python交互界面中依次输入以下命令import torch print(torch.__version__) # 应该输出 2.3.0 print(torch.cuda.is_available()) # 对于CUDA版本这里应该输出 True如果第二行输出True那么恭喜你PyTorch和CUDA均已正确安装且被识别。 3. 进一步测试CUDA设备print(torch.cuda.get_device_name(0)) # 输出你的显卡型号例如 ‘NVIDIA GeForce RTX 4060’ print(torch.rand(3,3).cuda()) # 尝试在GPU上创建一个张量应该能成功运行退出Python交互界面exit()4. 深度避坑指南与疑难杂症排查即使按照上述步骤你可能还是会遇到一些问题。下面是我总结的常见“坑点”及其解决方案。4.1 错误“Solving environment: failed” 或 “PackagesNotFoundError”这是最常见的问题意味着conda在当前配置的频道中找不到完全满足版本依赖关系的包组合。原因1版本组合太新或太旧。解决方案访问PyTorch官网或GitHub Release页面确认你想要的PyTorch版本是否有对应的torchvision、torchaudio和cudatoolkit组合。有时需要稍微调整某个包的版本号。原因2频道优先级或缓存问题。解决方案运行conda config --show channels确认pytorch频道已添加。运行conda clean --all清除所有缓存然后重试。尝试不指定torchvision和torchaudio的次要版本让conda自动解决conda install pytorch2.3.0 pytorch-cuda12.1 -c pytorch -c nvidia安装后再用pip install torchvision torchaudio安装配套版本注意此时要用pip且仍在conda环境内。原因3网络问题导致元数据不完整。解决方案临时使用更快的镜像源如北京外国语大学源或阿里云源替换掉.condarc文件中的清华源地址然后重试。4.2 错误“CUDA error: no kernel image is available for execution on the device”这个错误非常典型意味着安装的PyTorch CUDA版本与你的显卡架构不兼容。RTX 40系Ada Lovelace架构等新显卡需要CUDA 11.8及以上版本才能有对应的“内核映像”。解决方案确保你安装的PyTorch配套的CUDA版本是11.8或12.1。最可靠的方法是使用我们上面提到的pytorch-cuda12.1这种元包安装方式或者使用conda install cudatoolkit11.8来明确指定工具包版本。4.3 错误“conda: command not found” 或 “无法将‘conda’识别为cmdlet、函数、脚本文件”这说明conda没有正确添加到系统PATH环境变量中。解决方案找到你的Anaconda或Miniconda安装路径通常是C:\Users\你的用户名\miniconda3或C:\ProgramData\miniconda3。将此路径下的Scripts和Library\bin文件夹路径添加到系统的PATH变量中。更简单的方法是直接使用“Anaconda Prompt”如果安装了Anaconda或重新运行Miniconda安装程序选择“Repair”。4.4 环境管理与后续使用列出所有环境conda env list回到base环境conda deactivate删除一个环境谨慎操作conda remove -n pytorch_env --all导出环境配置用于迁移或复现conda env export environment.yaml从YAML文件创建环境conda env create -f environment.yaml在PyCharm/VSCode中使用该环境在IDE的设置中将Python解释器路径指向C:\Users\你的用户名\miniconda3\envs\pytorch_env\python.exe。4.5 关于“Win系统如何阻止自动删除注册机”等无关热词的说明在获取的热词中混入了一些如“win系统如何阻止自动删除注册机”等完全无关甚至涉及灰色领域的内容。我必须强调在正规的软件开发和学习中应坚决使用正版软件和官方渠道获取工具。PyTorch、Conda等都是开源或免费工具无需任何“注册机”。Windows Defender或杀毒软件报毒通常是因为检测到了破解补丁或木马。我们的整个安装流程基于官方通道和镜像安全、稳定、合法完全不存在此类问题。请将注意力集中在技术本身远离任何破解、盗版软件那不仅是法律风险更会给你的系统带来巨大的安全隐患。5. 高级技巧环境迁移、离线安装与多CUDA版本共存对于更进阶的需求这里有一些实用技巧。5.1 环境迁移与离线安装有时候需要在无网络或内网机器上部署相同的环境。在联网机器上打包环境# 激活环境并导出精确的包列表 conda activate pytorch_env conda list --explicit spec-file.txt # 或者使用conda-pack打包整个环境目录 conda install conda-pack conda pack -n pytorch_env -o pytorch_env.tar.gz在离线机器上恢复使用spec-file.txt:conda create -n new_env --file spec-file.txt使用conda-pack: 将tar.gz文件拷贝到目标机器解压到%CONDA_PREFIX%\envs\pytorch_env目录下然后使用conda activate pytorch_env激活即可。5.2 在单机上管理多个CUDA版本如果你同时进行多个项目一个需要PyTorch 1.13 CUDA 11.6另一个需要PyTorch 2.3 CUDA 12.1Conda的虚拟环境可以完美解决。为每个项目创建独立的环境并在各自环境中安装不同版本的PyTorch和CUDA工具包。因为Conda将cudatoolkit安装在环境内部不同环境之间的CUDA版本是隔离的互不干扰。你只需要确保系统级的NVIDIA显卡驱动版本足够高能支持所有环境中用到的CUDA版本即可例如驱动支持CUDA 12.4那么它向下兼容11.0到12.4的所有CUDA运行时。5.3 使用pip作为conda环境的补充虽然推荐用Conda安装PyTorch但环境中其他纯Python包用pip安装通常没问题。为了避免冲突建议总是先尝试用conda install安装包。如果conda找不到或版本不对再使用pip install。安装后可以用conda list查看所有包pip安装的包会注明来源为pypi。这套基于Conda的PyTorch Windows安装方案是我经过无数次“爆炸”后总结出的最稳定路径。它的核心思想就是利用Cona解决底层依赖通过官方通道确保版本匹配在独立环境中进行操作。记住慢就是快按照步骤理清思路一次配置好远比反复重装节省时间。当你看到torch.cuda.is_available()返回True的那一刻这些折腾都是值得的。如果过程中遇到上面没覆盖的怪问题不妨去PyTorch官方论坛或GitHub Issues里搜一下错误信息大概率能找到答案。

相关新闻

从Uzi回应看技术评估:解构“第一”标签,构建健康工程思维

从Uzi回应看技术评估:解构“第一”标签,构建健康工程思维

在电子竞技领域,选手的自我认知与外界评价之间往往存在巨大鸿沟。当一位选手被粉丝或媒体冠以“世界第一”的头衔时,这种标签既是一种荣誉,也是一种沉重的负担。近期,知名《英雄联盟》职业选手Uzi在赛后采访中,面对“世…

2026/10/13 15:39:36 阅读更多 →
10分钟快速入门Magic动画库:让你的网页瞬间动起来的终极指南

10分钟快速入门Magic动画库:让你的网页瞬间动起来的终极指南

10分钟快速入门Magic动画库:让你的网页瞬间动起来的终极指南 【免费下载链接】magic CSS3 Animations with special effects 项目地址: https://gitcode.com/gh_mirrors/ma/magic 想要为你的网站添加令人惊艳的动画效果,但又不想学习复杂的JavaSc…

2026/10/10 13:27:00 阅读更多 →
Reflex纯Python全栈开发:不用写一行前端搭建数据可视化后台

Reflex纯Python全栈开发:不用写一行前端搭建数据可视化后台

平时做Python开发,相信很多人和我一样,痛点特别统一:后端写得飞快,前端拖垮整体进度。不管是做数据看板、业务监控后台、内部管理系统,明明后端逻辑、数据清洗、接口代码几分钟就能写完,但想要展示成可视化…

2026/10/12 5:10:25 阅读更多 →

最新新闻

GitHub Trending 榜单的深度解码:从星标数到技术趋势研判

GitHub Trending 榜单的深度解码:从星标数到技术趋势研判

1. 这不是榜单,而是一份开源生态的“实时心电图”你点开 GitHub Daily Top 10,看到的绝不止是十个仓库名和星标数。它是一张动态刷新的开源生态“心电图”——每一次 Star 的跃升、Fork 的扩散、Issue 的激增,都在同步传导着全球开发者真实的…

2026/10/15 22:28:47 阅读更多 →
C++与Node.js集成实战:原生模块构建、异步与内存安全指南

C++与Node.js集成实战:原生模块构建、异步与内存安全指南

如果你在Node.js项目里碰到CPU密集计算把进程拖到卡死,或者在数据编解码、图像处理这些环节上觉得纯JS的极限就摆在那里,那早晚会走到C与Node.js集成这条路上。我最早接触这块是被一个真实需求逼的:一个长时间运行的图像处理服务,…

2026/10/15 22:28:47 阅读更多 →
AI智能体如何用图纸识别与拆单技术重构全屋定制生产流程

AI智能体如何用图纸识别与拆单技术重构全屋定制生产流程

从门店接单到工厂出货,中间藏着全屋定制行业最磨人的环节:反复改图、人工拆单。这套流程慢、容易出错、还极度依赖熟练工——设计师熬夜改一版图纸,工厂拆单员又要对着图重新过一遍,客户等得急,工厂也等不起。AI智能体…

2026/10/15 22:28:47 阅读更多 →
C++与Node.js集成实战:N-API原生模块开发与异步性能优化

C++与Node.js集成实战:N-API原生模块开发与异步性能优化

1. 集成路线怎么选:先搞清楚三种玩法再动手C 与 Node.js 集成,我这边接触到的实际需求无非三种:第一是 CPU 密集型的计算逻辑想搬进 Node 里跑,比如图像处理、音视频编解码、加密解密、数值模拟;第二是公司积累了多年的…

2026/10/15 22:28:47 阅读更多 →
C++职责链模式实战:从if-else到优雅解耦

C++职责链模式实战:从if-else到优雅解耦

写C的职责链模式之前,我先说说自己是怎么掉进这个坑里的。当时在某跨平台消息中间件项目里处理收包逻辑,数据包要根据类型走不同分支:日志类的要落盘,业务类的要转发,异常类的要触发告警……用if-else硬写第一版还能凑…

2026/10/15 22:28:47 阅读更多 →
SpringBoot+Vue党员教育管理系统设计与实现:从需求分析到部署排坑

SpringBoot+Vue党员教育管理系统设计与实现:从需求分析到部署排坑

最近刚把一个计算机毕业设计项目完整跑通,用的是 SpringBoot Vue 的组合,题目是“党员教育和管理系统”,也可以理解成一套党校线上指导平台。如果你正好在选毕业设计题目,或者公司内部需要做一套线上学习培训系统,这个…

2026/10/15 22:27:31 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →