热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

anaconda使用及tensorflowgpu安装

Anaconda简易使用创建新环境删除环境重命名环境conda其实没有重命名指令,实现重命名是通过clone完成的,分两步:先clone一份newname的环境删除oldname的

Anaconda简易使用

创建新环境

conda create -n rcnn python=3.6

删除环境

conda remove -n rcnn --all

重命名环境

conda 其实没有重命名指令,实现重命名是通过 clone 完成的,分两步:

  • 先 clone 一份 new name 的环境
  • 删除 old name 的环境

比如,想把环境 rcnn 重命名成 tf

第1步

conda create -n tf --clone rcnn
Source:      /anaconda3/envs/rcnn
Destination: /anaconda3/envs/tf
Packages: 37
Files: 8463

第2步

conda remove -n rcnn --all

结果

conda info -e
# conda environments:
#
crawl                    /anaconda3/envs/crawl
flask                    /anaconda3/envs/flask
tf                       /anaconda3/envs/tf
root                  *  /anaconda3

tensorflow gpu 安装

首先显卡一定要支持

没想到的是GTX 1050TI,GTX 1070TI等主流显卡竟然都不支持

(还好我买的是GTX 1050)

(并没有暗示需要一块TESLA)

点这里查看CUDA支持列表

其次需要对好版本号,不同的TensorFlow版本对应的CUDA驱动程序版本号也有所不同

然而这还不够,还需要安装CUDNN才能完美运行,CUDNN的版本号和CUDA的版本号也要对好

CUDA离线版下载网址

CUDNN下载网址

但是下载CUDNN需要注册NVIDIA账号,那就点击join注册喽

注册的时候刚开始我使用了QQ邮箱,按道理这没毛病

但是到了验证邮箱一步又嗝屁了

你的验证邮件呢,验证邮件呢,邮件呢?????

经过百度多方查阅,原来不能用QQ邮箱

坑爹的是过了三个小时它又发过来了,没错,就是QQ邮箱,它发过来了。。。

不过我的163邮箱都注册好了。。。。。

所以就使用163邮箱注册了一个账号

终于顺利下载

下载完了也很懵逼

压缩包里面是长这样的:

技术图片

使用这样的东西已经完全超出了我的能力范围了呀,怎么办

于是乎又百度,原来是放在CUDA的安装目录下呀。。。。

好的安装好了,听度娘说可以用安装目录\extras\demo_suite下的bandwidthTest.exe和deviceQuery.exe来检测

检测出来好像没什么问题

技术图片

(图片中用了pause暂停来查看的)

然后环境搭载完成,到了万众瞩目的安装环节

pip install tensorflow-gpu

当然是需要卸载之前的版本的tensorflow 的

20KB/s的高速下了不知道多久

反正最后是装好了

大概是这样的

技术图片

看起来还不错有没有

但是运行一下吧

。。。。。。。

下面的错误我都不忍心看,红了一片。。。。。

(画面太过血腥,已被屏蔽)

然后继续求助万能的度娘

最后找到了这个帖子

Win10 +VS2017+ python3.66 + CUDA10 + cuDNNv7.3.1 + tensorflow-gpu 1.12.0

你早说不支持CUDA10.0嘛,害的我费那么大力

于是就看了下这个贴子里面所附带的大佬创作的安装包

tensorflow_gpu-1.12.0-cp36-cp36m-win_amd64.whl

CUDA10.0+CUDNN7.3.1

然后又跑去重新安装CUDNN7.3.1

再cd到安装包目录下

pip install tensorflow_gpu-1.12.0-cp36-cp36m-win_amd64.whl

效果拔群,最终安装完成

技术图片

如图

(当时看到可把我激动惨了)


至此安装完成


既然安装了就来测试一下喽,不测试的话显得自己很捞

求助度娘找到了大佬写的五层卷积神经网络的代码

Tensorflow对比AlexNet的CPU和GPU运算效率

为了简便起见,就直接放经过我魔改的大佬的代码

技术图片

  1 from datetime import datetime
  2 import math
  3 import time
  4 import tensorflow as tf
  5 import os
  6 #os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
  7 #os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
  8 batch_size = 32
  9 num_batches = 100
 10 # 该函数用来显示网络每一层的结构,展示tensor的尺寸
 11 
 12 def print_activations(t):
 13     print(t.op.name, ' ', t.get_shape().as_list())
 14 
 15 # with tf.name_scope('conv1') as scope  # 可以将scope之内的variable自动命名为conv1/xxx,便于区分不同组件
 16 
 17 def inference(images):
 18     parameters = []
 19     # 第一个卷积层
 20     with tf.name_scope('conv1') as scope:
 21         # 卷积核、截断正态分布
 22         kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64],
 23                                                  dtype=tf.float32, stddev=1e-1), name='weights')
 24         cOnv= tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='SAME')
 25         # 可训练
 26         biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name='biases')
 27         bias = tf.nn.bias_add(conv, biases)
 28         conv1 = tf.nn.relu(bias, name=scope)
 29         print_activations(conv1)
 30         parameters += [kernel, biases]
 31         # 再加LRN和最大池化层,除了AlexNet,基本放弃了LRN,说是效果不明显,还会减速?
 32         lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001 / 9, beta=0.75, name='lrn1')
 33         pool1 = tf.nn.max_pool(lrn1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool1')
 34         print_activations(pool1)
 35     # 第二个卷积层,只有部分参数不同
 36     with tf.name_scope('conv2') as scope:
 37         kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32, stddev=1e-1), name='weights')
 38         cOnv= tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding='SAME')
 39         biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32), trainable=True, name='biases')
 40         bias = tf.nn.bias_add(conv, biases)
 41         conv2 = tf.nn.relu(bias, name=scope)
 42         parameters += [kernel, biases]
 43         print_activations(conv2)
 44         # 稍微处理一下
 45         lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9, beta=0.75, name='lrn2')
 46         pool2 = tf.nn.max_pool(lrn2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool2')
 47         print_activations(pool2)
 48     # 第三个
 49     with tf.name_scope('conv3') as scope:
 50         kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384], dtype=tf.float32, stddev=1e-1), name='weights')
 51         cOnv= tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding='SAME')
 52         biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32), trainable=True, name='biases')
 53         bias = tf.nn.bias_add(conv, biases)
 54         conv3 = tf.nn.relu(bias, name=scope)
 55         parameters += [kernel, biases]
 56         print_activations(conv3)
 57     # 第四层
 58     with tf.name_scope('conv4') as scope:
 59         kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256], dtype=tf.float32, stddev=1e-1), name='weights')
 60         cOnv= tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding='SAME')
 61         biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
 62         bias = tf.nn.bias_add(conv, biases)
 63         conv4 = tf.nn.relu(bias, name=scope)
 64         parameters += [kernel, biases]
 65         print_activations(conv4)
 66     # 第五个
 67     with tf.name_scope('conv5') as scope:
 68         kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32, stddev=1e-1), name='weights')
 69         cOnv= tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding='SAME')
 70         biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases')
 71         bias = tf.nn.bias_add(conv, biases)
 72         conv5 = tf.nn.relu(bias, name=scope)
 73         parameters += [kernel, biases]
 74         print_activations(conv5)
 75         # 之后还有最大化池层
 76         pool5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool5')
 77         print_activations(pool5)
 78         return pool5, parameters
 79 # 全连接层
 80 # 评估每轮计算时间,第一个输入是tf得Session,第二个是运算算子,第三个是测试名称
 81 # 头几轮有显存加载,cache命中等问题,可以考虑只计算第10次以后的
 82 def time_tensorflow_run(session, target, info_string):
 83     num_steps_burn_in = 10
 84     total_duration = 0.0
 85     total_duration_squared = 0.0
 86     # 进行num_batches+num_steps_burn_in次迭代
 87     # 用time.time()记录时间,热身过后,开始显示时间
 88     for i in range(num_batches + num_steps_burn_in):
 89         start_time = time.time()
 90         _ = session.run(target)
 91         duration = time.time() - start_time
 92         if i >= num_steps_burn_in:
 93             if not i % 10:
 94                 print('%s:step %d, duration = %.3f' % (datetime.now(), i - num_steps_burn_in, duration))
 95             total_duration += duration
 96             total_duration_squared += duration * duration
 97         # 计算每轮迭代品均耗时和标准差sd
 98         mn = total_duration / num_batches
 99         vr = total_duration_squared / num_batches - mn * mn
100         sd = math.sqrt(vr)
101         print('%s: %s across %d steps, %.3f +/- %.3f sec / batch' % (datetime.now(), info_string, num_batches, mn, sd))
102 def run_benchmark():
103     # 首先定义默认的Graph
104     with tf.Graph().as_default():
105         # 并不实用ImageNet训练,知识随机计算耗时
106         image_size = 224
107         images = tf.Variable(tf.random_normal([batch_size, image_size, image_size, 3], dtype=tf.float32, stddev=1e-1))
108         pool5, parameters = inference(images)
109         init = tf.global_variables_initializer()
110         sess = tf.Session(cOnfig=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False))
111         sess.run(init)
112         # 下面直接用pool5传入训练(没有全连接层)
113         # 只是做做样子,并不是真的计算
114         time_tensorflow_run(sess, pool5, "Forward")
115         # 瞎弄的,伪装
116         objective = tf.nn.l2_loss(pool5)
117         grad = tf.gradients(objective, parameters)
118         time_tensorflow_run(sess, grad, "Forward-backward")
119 run_benchmark()

技术图片

如果使用TensorFlow-GPU的话这个默认是用GPU运行的

GPU运行结果:

技术图片

技术图片

GPU使用率:

技术图片

CPU使用率:

技术图片

可以看出较为占用显存

将上面代码的6到7行注释解除即为CPU运行

CPU运行结果:

技术图片

技术图片

CPU利用率:

技术图片

我2.8GHZ的CPU都跑到3.4GHZ了

这么对我的CPU真的好么


测试结果:

正向GPU运行时间效率是CPU运行效率的8.42倍

反向GPU运行时间效率是CPU运行效率的12.50倍

并且GPU运行模式下GPU占用率仅仅只有大约65%,CPU占用率仅仅只有45%左右

而CPU运行模式下CPU占用率长时间到达100%,且效率低下

看出GPU能够直接完爆CPU运行的


注意事项:

1.本次测试仅仅采用了卷积神经网络进行运行,不代表所有情况下GPU一定有优势;

2.鉴于CPU的瓶颈,可能CPU运行效率并不是非常理想,若采用更加高端的CPU运行效果可能会有大幅度提升;

anaconda 使用 及 tensorflow-gpu 安装


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
路纺雅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有