Ubuntu20.04安装NVIDIA混合精度计算库apex全流程及各类报错问题解答

news/2024/7/21 3:54:22 标签: 深度学习, 人工智能, 电脑

目录

  • 一. 安装CUDA
  • 二. 安装apex
  • 三. 各类报错问题解决
    • 3.1 C++编译错误
    • 3.2 Apex优化算子错误
    • 3.3 CUDA错误
    • 3.4 g++或gcc错误

背景:跟李沐老师一起探索RTX 3090的深度学习浮点运算性能,需要安装apex进行半精度运算,本文总结了Ubuntu20.04安装NVIDIA混合精度计算库apex全流程及各类报错问题解答

环境:
Ubuntu20.04
AMD 5800 8-core 16-Thread
NVIDIA RTX 3090
Pytorch1.13(gpu)
Python3.9
CUDA11.7

一. 安装CUDA

确保你的apex跟CUDA版本对应,如果不对应,则在运行程序时会产生各类kernel fusion之类的错误。

wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
sudo sh cuda_11.7.1_515.65.01_linux.run

网不好可以先用浏览器下载,然后再安装。
安装时一直确认就可以了,如果已经安装过NVIDIA驱动可以去掉驱动的选项。
添加环境变量:

vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda

source ~/.bashrc

如何进行软链接来对不同CUDA版本进行切换,看我其他专栏的相关文章写的很详细。

二. 安装apex

此前记得安装gcc g++ make,并确保三者都可以在命令行中直接找到。


git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

正常安装成功是没有任何error信息的,会显示成功安装:

请添加图片描述

三. 各类报错问题解决

3.1 C++编译错误

报错信息:

subprocess.CalledProcessError: Command '['which', 'c++']' returned non-zero

原因:
ubuntu提供了这样一个包 build-essential,编译c/c++的,安装build-essential:

sudo apt-get install build-essential

3.2 Apex优化算子错误

报错信息:

RuntimeError: apex.optimizers.FusedAdam requires cuda extensions

原因:Apex缺少cuda_ext 库,一定是没有正确安装好apex,需要卸载重装:

pip uninstall apex

3.3 CUDA错误

报错信息:

RuntimeError: Error compiling objects for extension

原因:没有正确安装CUDA库,或者CUDA版本与所安装的Pytorch版本不对应。
解决:重新安装正确版本的CUDA

3.4 g++或gcc错误

报错信息:

subprocess.calledprocesserror command ' 'which' 'g++' ' returned non-zero exit status 1

原因:gcc与g++不是同一个大版本,编译失败。
解决:

sudo apt remove g++ 
sudo apt remove gcc
sudo apt-get update
sudo apt-get install gcc-9 g++-9
#建立强链接
sudo ln -s /usr/bin/gcc-9 /usr/bin/gcc -f
sudo ln -s /usr/bin/g++-9 /usr/bin/g++ -f

http://www.niftyadmin.cn/n/144396.html

相关文章

mysql查询语句

执行sql文件 source D:\sql文件.sql 查询当前使用的数据库 select database();起别名 select 字段名 as 别名 from dept; 条件查询语句 3.列的数学运算select 工资*12 from 表名; 等于 查看工资为800的员工名称 select name from emp where sal 800;<>或 ! 不等…

LeetCode819. 最常见的单词(python)

题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多&#xff0c;同时不在禁用列表中的单词。 题目保证至少有一个词不在禁用列表中&#xff0c;而且答案唯一。 禁用列表中的单词用小写字母表示&#xff0c;不含标点符号。段落中的单词不区分大小写。…

如何高效优雅的使用RabbitMQ

前言 RabbitMQ无疑是目前最流行的消息队列之一&#xff0c;对各种语言环境的支持也很丰富&#xff0c;作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种&#xff1a; 系统集成&#xff0c;分布式系统的设计。各种子系统通过消息来对接&#xff…

Spring——Spring事务角色和事务属性

事务管理员 在入门案例里面需要在transfer上加上一个事务&#xff0c;该方法里面会调用数据层的两个操作又会分别开启两个事务T1和T2 加上一个开启事务的注解会将范围内的所有事务 事务角色 事务管理员:发起事务方&#xff0c;在Spring中通常代指业务层开启事务的方法事务协调…

Java ~ Collection/Executor ~ TransferQueue【总结】

一 概括 简介 TransferQueue&#xff08;迁移队列&#xff09;接口&#xff08;下文简称迁移队列&#xff09;是BlockingQueue&#xff08;阻塞队列&#xff09;接口的两大子接口之一&#xff0c;在原本的操作定义上新增了迁移操作的定义。所谓的迁移是一种作用于操作本身&…

SpringBoot接口 - 如何提供多个版本接口

在以SpringBoot开发Restful接口时&#xff0c;由于模块&#xff0c;系统等业务的变化&#xff0c;需要对同一接口提供不同版本的参数实现&#xff08;老的接口还有模块或者系统在用&#xff0c;不能直接改&#xff0c;所以需要不同版本&#xff09;。如何更加优雅的实现多版本接…

2020蓝桥杯真题音节判断 C语言/C++

题目描述 小明对类似于 hello 这种单词非常感兴趣&#xff0c;这种单词可以正好分为四段&#xff0c;第一段由一个或多个辅音字母组成&#xff0c;第二段由一个或多个元音字母组成&#xff0c;第三段由一个或多个辅音字母组成&#xff0c;第四段由一个或多个元音字母组成。 给…

【项目精选】springboot音乐网站与分享平台(论文+源码)

&#x1f449;&#x1f449;&#x1f449;如果你对该系统或者计算机专业的毕业设计有任何疑问或者需要&#xff0c;可以在评论区留言或者私信我哦&#xff01; 本论文主要论述了如何使用JAVA语言开发一个音乐网站与分享平台 &#xff0c;本系统将严格按照软件开发流程进行各个…