搭建GPU环境的TensorFlow并将单块GPU划分逻辑为分区的实践

news2024/11/26 14:48:05

1、搭建环境

1.1、查看GPU版本

在安装tensorflow的GPU版本之前可以先看下自己的显卡情况
命令:nvidia-smi 

 

 或者桌面右下角,NVIDIA图标,进入到NVIDIA的控制面板:

点击左下角的系统信息组件中查看NVCUDA64.dll的版本

1.2、新建虚拟环境

创建一个虚拟环境,名称为myTFGPU,Python版本为3.7,这两个按自己环境指定,也可以进入站点:tensorflow-GPU版本 选择适合自己的版本
conda create -n myTFGPU python=3.7
进入这个虚拟环境:activate myTFGPU

1.3、安装带GPU版本的tensorflow

安装命令,带上豆瓣镜像要快很多

pip install tensorflow-gpu==2.9.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 

安装好之后,我们来看下自己的设备情况:

import tensorflow as tf
tf.test.gpu_device_name()
#Created device /device:GPU:0 with 1318 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1
'/device:GPU:0'

可以看到GPU的型号,大小,计算能力。这些能够正确显示,说明就安装成功了。再来看下本机的物理GPU和CPU的情况

# 查看gpu和cpu的数量
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
#[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]

1.4、CUDA和cuDNN版本对应

 其中cudnn和cuda因为以前安装过,这里就省略了,安装命令:

conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0

当然这两个对应的版本,可以使用命令:conda search -f cudnn 查看对应的版本,避免出现版本问题

(tensorflowGPU) C:\Users\Tony>conda search -f cudnn
Fetching package metadata .........
cudnn                        7.1.4                 cuda9.0_0  defaults
                             7.1.4                 cuda8.0_0  defaults
                             7.3.1                 cuda9.0_0  defaults
                             7.3.1                cuda10.0_0  defaults
                             7.6.0                cuda10.1_0  defaults
                             7.6.0                cuda10.0_0  defaults
                             7.6.0                 cuda9.0_0  defaults
                             7.6.4                cuda10.1_0  defaults
                             7.6.4                 cuda9.0_0  defaults
                             7.6.4                cuda10.0_0  defaults
                             7.6.5                 cuda9.0_0  defaults
                             7.6.5                cuda10.1_0  defaults
                             7.6.5                cuda10.0_0  defaults
                             7.6.5                cuda10.2_0  defaults
                             7.6.5                 cuda9.2_0  defaults
                             8.2.1                cuda11.3_0  defaults

1.5、CUDA和cuDNN下载

CUDA和cuDNN比较大,建议下载安装要好点:
CUDA Toolkit:https://developer.nvidia.com/cuda-toolkit-archive
cuDNN:https://developer.nvidia.com/rdp/cudnn-archive

安装好了之后,将下面这几个文件复制到对应位置即可:

Copy <installpath>\cuda\bin\cudnn*.dll to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin.
Copy <installpath>\cuda\include\cudnn*.h to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\include.
Copy <installpath>\cuda\lib\x64\cudnn*.lib to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib\x64.

如果安装中遇到问题可以参看:https://blog.csdn.net/weixin_41896770/article/details/127444808

2、GPU逻辑分区

我们知道在Windows里面的硬盘,可以将其随意划分成多个逻辑盘,C、D、E、F等,同样道理,GPU也可以做这样的设置。

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
#[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

比如我的电脑就只有一块GPU,有时想做一些多GPU的测试,没有多余的GPU,不过很好的一点是,tensorflow等框架都支持分布式的,同时也支持对GPU做逻辑划分。

#逻辑划分
tf.config.experimental.set_virtual_device_configuration(
     gpus[0],
     [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
#我们看下是否将GPU成功划分逻辑分区
print(logical_gpus)
#[LogicalDevice(name='/device:GPU:0', device_type='GPU'), LogicalDevice(name='/device:GPU:1', device_type='GPU'), LogicalDevice(name='/device:GPU:2', device_type='GPU')]

打印出来,我们可以看到,将本机的一块物理GPU划分成了三块逻辑GPU,名字分别是/device:GPU:0/device:GPU:1/device:GPU:2

其余一些实用方法可以查阅print(dir(tf.config))

tf.debugging.set_log_device_placement(True)#打印一些变量在哪些设备
gpus = tf.config.experimental.list_physical_devices('GPU')#物理的GPU列表
tf.config.experimental.set_visible_devices(gpus[0], 'GPU')#设置GPU可见

下面有很多方法,有兴趣的可以了解它们的作用: 

['LogicalDevice', 'LogicalDeviceConfiguration', 'PhysicalDevice', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_sys', 'experimental', 'experimental_connect_to_cluster', 'experimental_connect_to_host', 'experimental_functions_run_eagerly', 'experimental_run_functions_eagerly', 'functions_run_eagerly', 'get_logical_device_configuration', 'get_soft_device_placement', 'get_visible_devices', 'list_logical_devices', 'list_physical_devices', 'optimizer', 'run_functions_eagerly', 'set_logical_device_configuration', 'set_soft_device_placement', 'set_visible_devices', 'threading']

3、JupyterLab测试

由于这里我们是新建的一个环境,激活之后在这个虚拟环境中,我们先进行安装 :
conda install -c conda-forge jupyterlab
然后输入命令即可:jupyter lab
这样就可以在JupyterLab中写代码进行测试了

我们来实际测试下这个逻辑分区的GPU:

import tensorflow as tf

gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_virtual_device_configuration(
     gpus[0],
     [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')

c = []
for gpu in logical_gpus:
    print(gpu.name)
    with tf.device(gpu.name):
        a = tf.constant([[1,2,3],[4,5,6]])
        b = tf.constant([[7,8],[9,10],[11,12]])
        c.append(tf.matmul(a, b))
print(c)
#将三块GPU计算的值,通过CPU计算相加
with tf.device('/cpu:0'):
    matmul_sum = tf.add_n(c)

print(matmul_sum)

'''
/device:GPU:0
/device:GPU:1
/device:GPU:2
[<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>, <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>, <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>]
tf.Tensor(
[[174 192]
 [417 462]], shape=(2, 2), dtype=int32)
'''

我们可以看到分别在三块逻辑GPU上面进行了矩阵的乘法计算,还可以将它们指定到CPU来计算和。所以需要使用某块GPU或CPU,我们通过使用with tf.device('GPU或CPU名称') 来指定。这种对于大模型来说是很实用的,一般一块GPU的大小是有限的,而大模型的参数是非常大的,这样就可以将不同的层使用不同的GPU来分别计算了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

英特尔淡化混合 CPU-GPU 引擎,将 NNP 合并到 GPU 中

早在 2022 年 2 月&#xff0c;当英特尔宣布其“Falcon Shores”项目以构建混合 CPU-GPU 计算引擎时&#xff0c;该项目允许在单个插槽中独立扩展 CPU 和 GPU 容量&#xff0c;看起来这家芯片制造商正准备与竞争对手 Nvidia 较量AMD 开始使用混合计算电机&#xff0c;Intel 称之…

基于Flask框架和Vue框架搭建一个Web端的深度学习检测系统(从模型训练,界面设计到服务器部署实现一个完整项目实战)

从Pytorch框架下YOLOv5的模型训练&#xff0c;到Flask框架的模型加载&#xff0c;再到Vue框架的界面设计到最后的服务器部署。 实验环境 1.Windows10系统 2.编辑器pycharm 3.GPU 1080Ti 4.anaconda虚拟环境安装相应的安装包 5.pytorch版本1.7.1 6.Python3.7.15 实验数据集 …

C++初阶—stackqueue

目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack使用及OJ 1.2.1 最小栈 1.2.2 栈的弹出压入顺序 1.2.3 逆波兰表达式求值 1.2.4 用两个栈实现一个队列 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用及OJ 2.2.1 用队列实现栈 2.3 queue的模拟实现 3…

用户测试:确保产品质量的关键一环

用户测试&#xff1a;确保产品质量的关键一环 在当今竞争激烈的市场中&#xff0c;产品的质量是企业脱颖而出的关键因素之一。为了确保产品的质量&#xff0c;用户测试成为了开发过程中不可或缺的一环。用户测试是通过让真实用户使用产品并提供反馈意见来验证产品的功能、易用性…

【系统开发】尚硅谷 - 谷粒商城项目笔记(四):JSR303数据校验

文章目录 JSR303数据校验引入依赖和简介配置验证规则开启验证BindResult校验的统一异常处理JSR303分组校验自定义校验注解 JSR303数据校验 引入依赖和简介 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

Python和c语言爬虫如何选择?

Python是最受欢迎的爬虫语言之一&#xff0c;因为它易于学习和使用&#xff0c;有大量的库和框架可供选择。JavaScript通常用于Web爬虫&#xff0c;因为它可以直接在浏览器中运行&#xff0c;可以轻松地从动态网站中提取数据。java是一种广泛使用的语言&#xff0c;它有很多强大…

提高电商平台精准营销效果的IP定位离线库应用场景

随着电子商务的快速发展&#xff0c;越来越多的人们选择在线购物。随之而来的是消费者数量的增加和商品竞争的激烈。如何精准地找到目标客户&#xff0c;并进行有效的营销&#xff0c;成为了电商平台需要攻克的难题。在这种情况下&#xff0c;IP定位离线库技术的应用成为了电商…

Python基础语法第一章、认识Python

一、计算机基础概念 1.1什么是计算机? 很多老一辈的人, 管下面这个叫做计算机. 然鹅, 它只是 "计算器", 和计算机是有很大区别的. 现在我们所说的计算机, 不光能进行算术运算, 还能进行逻辑判断, 数据存储, 网络通信等等功能, 以至于可以自动的完成非常复杂的工作…

SerDes的原理解析

01 SerDes简介 首先我们要了解什么是SerDes&#xff0c;SerDes的应用场景又是什么呢&#xff1f;SerDes又有哪些常见的种类&#xff1f;做过FPGA的小伙伴想必都知道串口&#xff0c;与并行传输技术相比&#xff0c;串行传输技术的引脚数量少、扩展能力强、采 用点对点的连接方式…

从uCOSii中抠出来的内存管理程序

从uCOSii中抠出来的内存管理程序 1、学习uCOSii的内存管理的原因 操作系统和内存管理是分不开的&#xff0c;每个操作系统都有自己的一套内存管理方法。在实际应用中&#xff0c;我们尽量使用其自带的内存管理。学习和使用uCOSii也有一段时间了&#xff0c;觉得它的内存管理方…

高效处理报表,掌握原生JS打印和导出报表为PDF的顺畅技巧!

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言篇 在日常工作中&#xff0c;报表打印和导出为PDF是经常要处理的任务之一。除了方…

管理类联考——写作——素材篇——论说文——写作素材02——志篇:毅力·坚持

管理类专业学位联考 (写作能力) 论说文素材 02——志篇&#xff1a;毅力坚持 论文说材料: 骐骥一跃&#xff0c;不能十步&#xff1b;驽马十驾&#xff0c;功在不舍。 ——《荀子劝 学》 一&#xff1a;道理论据 咬住青山不放松&#xff0c;立根原在破岩中&#xff1b;千磨…

gitLens插件简单使用(默认上传github)

1.安装 在vscode中的插件管理输入如下后下载 GitLens — Git supercharged 2.配置 点击文件--首选项--设置 点击右上角设置小图标 3.github使用 首先仓库文件一定是要git init是git所管理的 1.在代码文件夹下使用git init创建仓库 2.打开vscode的git管理 3.点击添加暂存区…

如何使用ArcGIS加载天地图

天地图是自然资源部主管&#xff0c;国家基础地理信息中心负责建设的国家地理信息公共服务平台&#xff0c;于2011年1月18日上线。 有的时候可能需要将在线的天地图加载到ArcGIS内&#xff0c;但是加载方式越来越复杂&#xff0c;很多方法都需要申请key&#xff0c;这里为大家…

C++基础(3)——类和对象(2)

前言 本文主要介绍了C中类和对象的基本知识。 4.2.5&#xff1a;深拷贝和浅拷贝 浅拷贝&#xff1a;编译器给我们提供的拷贝函数就是等号复制操作 深拷贝&#xff1a;自己手动重写一个拷贝构造函数&#xff0c;重新new 浅拷贝会出现的问题&#xff1a;如果使用编译器提供的…

AI是什么?AI工具集网站大全

AI是什么&#xff1f; AI 是人工智能的缩写&#xff0c;指的是通过计算机技术和算法来实现智能的能力。我们人类的智能是基于我们的大脑所实现的&#xff0c;而 AI 因此也常被称为机器智能。AI技术需要机器能够感知、推理和行动&#xff0c;这些都需要底层算法的支持&#xff…

2.2C++公有继承与私有继承

C公有继承 C中的公有继承是指一个类可以从另一个类继承公有成员&#xff0c;包括公有成员函数和变量。 公有继承是面向对象编程中最基本的继承方式&#xff0c;它表示父类的公有成员在子类中仍然是公有成员&#xff0c;可以被外部访问。 我写一个 Animal 的基类&#xff0c;…

哪些公司里面有高性能计算方向cuda方向岗位?

CUDA可以为高性能计算、科学计算、深度学习和人工智能、图形渲染和游戏开发、并行数据处理等领域提供了强大的并行计算能力和编程模型。它加速了计算任务的执行&#xff0c;推动了科学研究和创新的进程&#xff0c;同时也为开发者提供了更多的工具和资源&#xff0c;促进了开放…

留个档,Unity Animator state节点的Motion动态替换AnimationClip

前言 由于Unity没有提供直接替换的API&#xff0c;所以在仅限的API下进行逻辑操作。 替换的原理是差不多的&#xff0c;利用AnimatorOverrideController&#xff0c;进行运行时的覆盖。 网上搜索很多文章是利用 名字字符串作为hash的key来进行替换。不满足我自己项目中的需求…

【系统开发】尚硅谷 - 谷粒商城项目笔记(五):分布式缓存

文章目录 分布式缓存缓存使用场景redis作缓存中间件引入redis依赖配置redis堆外内存溢出 缓存失效问题缓存穿透缓存雪崩缓存击穿 Redisson分布式锁导入依赖redisson配置类可重入锁读写锁缓存一致性解决 缓存-SpringCache简介Cacheable自定义缓存配置CacheEvictCachePut原理与不…