深度学习装机总结

  这里的硬件是i7 4790的CPU,技嘉B85-HD3主板,长城电源,AMD入门独显刀卡,英伟达矿卡GP106-100。

win10系统

  这里装双系统,矿卡的魔改驱动要求win10在1803版本以上,CPU在4代以上,所以这里装的是win10的1809版本+ubuntu18.04。用win10装机U盘,打开电源按F12进入启动引导选项,选择装机U盘按Enter确定,在装机系统左面选择磁盘分区,对整个磁盘进行清理并预分好区,磁盘是1T的,win10分区是C盘80G+D盘60G+E盘400G,C盘是系统盘80G应该足够了,D盘是存放学习资料,E盘是装软件游戏,还预分了一个400G的分区用来装ubuntu。分区完成之后选择安装win10并等待进度达到100%,拿下装机U盘,等待重启,这时又会自动花几分钟准备好系统,并再次自动重启,这时就装好win10了。
  这时为了让win10能够使用没有视频输出的矿卡GP106-100,需要用到魔改驱动,GP106-100的核心相当于GTX1060-6G,黄仁勋为了推出专用矿卡,就把GTX1060-6G拿来屏蔽了视频输出功能成为GP06-100矿卡,这张卡没有接视频线的地方,所以不能拿来打游戏看视频,只能做挖矿或者深度学习,但是最近网上有款魔改驱动,能够破解这个问题,破解之后就能看视频打游戏了,据说是在win10的1803版本之后有个笔记本驱动,对视频输出功能的屏蔽不够彻底,利用这款驱动将矿卡的视频计算结果经过核显进行输出,所以这里存在一个数据流拥挤的带宽问题,使游戏能略微下降。
  下载安装DDU软件,打开并选择安全模式,点击重启,重启之后再打开DDU软件选择GPU,清理N卡驱动并重启,再打开DDU软件选择清理核显驱动病重启,在系统设置找到更新选项选择检查更新,让系统自动安装核显驱动。确认装上GP106-100之后,按住shift点击重启,出现新的界面,选择疑难解答,高级选项,查看更多恢复选项,启动设置,重启,这时出现启动设置,按F7重启开机,之后直接安装魔改驱动,选择同意并继续,精简,出现警告提示:windows无法验证此驱动程序软件的发布者,选择始终安装,之后就可以安装完成了。由于这款驱动的控制桌面是打不开的,所以运行一些程序或是软件时,有可能系统并不会调用GP106-100,而是使用性能更低的核显之类的,所以需要右键桌面点击显示设置再选择图形设置,点击浏览,把我们要用到的程序游戏等添加进去,并点击高性能,为了让这一步更加方便,还有一个软件是矿车助手,可以自动添加需要用到的程序。
  这样就安装完成了,可以使用这款独立显卡了,需要注意的是这时的显示器需要用VGA接到主板上调用核显输出,之后下载鲁大师进行显卡的跑分,帧数都在200多到300多之间,显卡可以达到15万分,最后运行steam吃鸡游戏,效果还可以,足够用了。

ubuntu18.04系统

  一般都是装完win10再装ubuntu18.04,这时的双系统会面临一个棘手的问题,就是开机启动的引导项,就是是装完ubuntu之后,开机时找不到ubuntu启动项或者是windows启动项,只能用到一个系统,不同的硬件不同的主板不同的安装方式(比如是UEFI还是传统leagcy安装),其中的问题和解决方法也可能各种各样。
  这里不是UEFI而是采用的传统leagcy的ubuntu安装方式,UEFI安装ubuntu的话,需要一个efi系统分区存放引导项,否则安装过程会报错grub无法写入,但是建立了efi分区的话开机时,笔者的的电脑就无法使用windows,开机只有ubuntu了,所以需要使用传统leagcy方式进行安装,这两者的安装方式的区分,就看开机按F12时,选择的U盘前面有没有带UEFI字段,不带这字段的就是传统leagcy安装方式。先在windows系统打开磁盘管理器,选择那个为ubuntu预分的盘,点击删除卸载,这时显示为闲置空盘,安装时的分区,分了一个2G的/boot分区,100G的/根分区,还有300G的/home分区,那些/swap、/tmp等各种分区不用单独分,安装时会自动在/根分区下分出来,不需要自己麻烦。这样安装完之后开机按F12时会发现只能用windows,没有ubuntu选项,不过没关系,在windows下载安装easyBCD软件,打开软件选择添加条目,linux,驱动器选择/boot分区,笔者刚开始在驱动器那里没看到linux分区,就随便选了C盘,重启之后再打开软件就可以看到linux分区了,选择完/boot添加之后,就有了ubuntu18.04的开机启动项,这样开机时就可以自由选择用哪个系统了。
  笔者当初不太懂其中的各种区别,随便找来网上教程就开始安装,后面发现各种各样的问题,比如UEFI的安装,leagcy的安装,还有grub引导放在C盘却覆盖了windows引导,都是按照各种教程里的方法都不行,因为不同的主板硬盘安装方式,那些过程细节都是不一样的,所以随便找来教程帖子很可能都会出问题,笔者也是按照各种教程帖子重装了近20遍系统才搞清楚其中各种区别,最后才发现应该这样装。

ubuntu18.04+tensorflow深度学习软件环境安装

  安装这个环境也是折腾了很久,按照好几种方法和教程帖子重装了十几遍,最后都重装了ubuntu系统,最后发现可能是那些教程帖子的系统还有软件的版本都有点落后,找了篇最新的软件版本的教程,一次就装好了。
Ubuntu18.04+RTX2080+cuda10+tensorflow深度学习软件环境安装
  由于GP106-100是GTX1060屏蔽视频而来的,所以核心什么没变,下载的官方驱动直接选择GTX1060就行,安装好N卡驱动之后可能会出现一个问题,就是开机时电脑直接黑屏什么都没有,笔者在这里差点又要重装系统推倒重来了,结果发现有的帖子里介绍到了这种情况,这种问题是可以解决的。
  开机时光标在第一项ubuntu时按e键,此时屏幕下方会有一行可编辑的文字,找到quite spalsh,在其后空一格输入nomodeset,注意与后面的文字也要空一格,按F10键就能正常开机了。之后打开终端,输入命令

sudo gedit /etc/default/grub #编辑启动引导文件

找到这行

GRUB_CMDLINE——lINUX——DEFAULT=“quiet splash"

改成

GRUB_CMDLINE——lINUX——DEFAULT=“quiet splash nomodeset"

保存文件,更新GRUB

sudo update-grub

不同的品牌卡,也不一样,对于英伟达显卡是nomodeset,对于Intel 82852/82855或8系列显示晶片是i915.modeset=1或i915.modeset=0,对于其它品牌如ATI是xforcevesa或radeon.modeset=0 xforcevesa。
但是这样虽然能够正常开机使用,却有另一个问题,就是画面刷新率很低,比如打开一个终端窗口界面,不是瞬间跳出来界面,而是从上到下缓缓的水平刷新出来这个界面,虽然能用但是感觉不流畅不方便。这里也不知道是什么原因,显示器是DP接到AMD独显上的,可能跟这个有关,但是用VGA接到主板上又无法显示,可能是因为GP106-100自身没有视频输出的原因,当初设为nomodeset时,表示用这张N卡输出画面,但是这张卡的输出数据不是PCIEX16而是PCIEX4,我当初担心运行深度学习程序时,数据带宽会是一个限制,所以把PCEIX16的AMD独显装在了PCIEX4上,所以画面数据从N卡经PCIEX4传到核显再经PCIEX4传到AMD显卡,这才导致刷新率很低。然后笔者又试着把nomodeset删去,结果又能正常开机了,画面还能正常刷新了,说面这时画面输出用的是AMD独显而不是N卡,但是为什么现在又行了,而之前确实黑屏,这里不太清楚为啥,可能哪里误打误撞了。但是这时又要注意了,可能在跑深度学习程序的时候,并不能调用N卡,所以还是应该改成nomodeset。
  最后,需要运行深度学习程序时,打开终端,运行

source activate TensorFlow
spyder

之后就可以在Spyder里面运行mnist程序了,运行之前需要先下载数据集mnist数据集。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Jan  9 04:52:01 2019

@author: wanchao
"""

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# number 1 to 10 data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

def compute_accuracy(v_xs, v_ys):
    global prediction
    y_pre = sess.run(prediction, feed_dict={xs: v_xs, keep_prob: 1})
    correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 1})
    return result

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, W):
    # stride [1, x_movement, y_movement, 1]
    # Must have strides[0] = strides[3] = 1
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    # stride [1, x_movement, y_movement, 1]
    #ksize  [1,pool_op_length,pool_op_width,1]
    # Must have ksize[0] = ksize[3] = 1
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

# define placeholder for inputs to network
xs = tf.placeholder(tf.float32, [None, 784])    # 28x28
ys = tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)
x_image = tf.reshape(xs, [-1, 28, 28, 1])
# print(x_image.shape)  # [n_samples, 28,28,1]

## conv1 layer ##
W_conv1 = weight_variable([5,5, 1,32]) # patch 5x5, in size 1, out size 32
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # output size 28x28x32
h_pool1 = max_pool_2x2(h_conv1)                          # output size 14x14x32

## conv2 layer ##
W_conv2 = weight_variable([5,5, 32, 64]) # patch 5x5, in size 32, out size 64
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # output size 14x14x64
h_pool2 = max_pool_2x2(h_conv2)                          # output size 7x7x64

##flat h_pool2##
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])  # [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]

## fc1 layer ##
W_fc1 = weight_variable([7*7*64, 1024])
b_fc1 = bias_variable([1024])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

## fc2 layer ##
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
                                              reduction_indices=[1]))       # loss
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

print('ufhdfgakl---------------------------------------------gykugklhiluyhi')
for i in range(10000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys, keep_prob: 0.5})
    if i % 1000 == 0:
        print(compute_accuracy(mnist.test.images, mnist.test.labels))

你可能感兴趣的:(深度学习装机总结)