配置雙系統深度學習環境(雙硬碟GPT+UEFI+GTX1070+Linux Mint18.3+CUDA9.0+cuDNN7.0+Tensorflow-gpu)
今天有空將電腦配置完成,這裡我稍微整理一下,為下一次配置留個記錄,順便分享一下成果。
目錄:
I. 開始前的電腦配置和環境
II. 雙系統安裝(win10+linux mint都裝在ssd,EFI引導)
III. GTX1070驅動
IV. CUDA9.0
V. cuDNN7.0
VI. Anaconda
VII. Tensorflow-GPU
VIII. Pycharm
VIIII. 測試
I. 開始前的電腦配置和環境
美行外星人,本身有出廠安裝的win10 64位家庭版正版,win10裝在了SSD上,配載了7代i7,GTX1070顯示卡,有一個128g的SSD和一個1T的機械硬碟,記憶體是16g的。
買時的目的就是為了在膝上型電腦中配置一個個人的深度學習工作站,同時閒暇時候也能兼顧玩一些大型的遊戲,雖然不是最貴的頂配,而且是8代u出了以後,打折促銷處理的7代u版,但價格非常美好,且配置已經能很好地完成我的目標了。
另外,電腦的硬碟是GPT格式的,啟動也是UEFI模式,這就給安裝雙系統增加了不少難度,easyBCD什麼的已經無法使用了,而且一定要用掉一個U盤作為啟動盤,至少我暫時沒有找到不需要報廢U盤的辦法。
另整個流程都是在實際電腦中完成,不是在虛擬機器中,請確認你是裝機老手,不然還是在虛擬機器裡練一下吧。
II. 雙系統安裝(win10+linux mint都裝在ssd)
- 準備工作:
- 一個空的U盤
(在不得不耗費一個U盤前,我嘗試了許多方法,試圖從硬碟安裝,還研究了下怎麼從network安裝,但無果,最後只能將一個8g的U盤作為啟動盤了。) - linux mint官網下載iso映象(https://linuxmint.com/download.php)
選擇紅框64位版,還有一步是選擇合適的映象,這個選恰當的就行了,我自己在美國,所以隨手選了個USA的,速度還是很快的5分鐘左右就下完了。 - linux mint官網推薦的映象製作軟體Etcher(https://etcher.io/)
- 一個空的U盤
接下來:
1.製作Linux Mint啟動盤
- 安裝Etcher後開啟,和官網給的步驟一樣,點選Select Image按鈕,選中下載下來的iso映象,插入空U盤,Etcher會自動檢測到U盤,然後點Flash!
- 輕鬆加愉快,啟動盤就製作完成了。Etcher製作完啟動盤後會自動彈出U盤,所以直接拔下就可以了。
調整硬碟分割槽
- 右鍵資源管理器中的This PC/此電腦-管理-磁碟管理,開啟windows裡的磁碟管理器.
- 發現原本的電腦SSD盤128G,出廠時劃分為了一個主分割槽裝了win10和N塊recovery的區域,機械硬碟作為資料盤,沒有分割槽。
- 我的目標是win10不變將linux mint的系統裝到SSD裡的空餘位置,其它的分割槽裝在機械硬碟上,同時Linux和Win10共用機械硬盤裡的資料,所以這裡要把SSD裡的隱藏恢復分割槽沒有用的給刪掉,只保留EFI分割槽和安裝了win10的C盤。
好吧,128g的SSD還是太小了,家境好的還是選大些的SSD~等我有空也要再換一塊。
開啟Terminal:
1.C:\Users\manim>diskpart
2.DISKPART> list disk
Disk ### Status Size Free Dyn Gpt
-------- ------------- ------- ------- --- ---
Disk 0 Online 119 GB 1024 KB *
Disk 1 Online 931 GB 0 B *
3.DISKPART> select disk 0(選中SSD盤)
Disk 0 is now the selected disk.
4.DISKPART> list partition(檢視分割槽)
5. DISKPART> select partition N(其中N是檢視的分割槽編號,這一步代表你選中了分割槽)
Partition N is now the selected partition.
6.DISKPART> delete partition override(做這一步之前請謹慎確認選中的分割槽是無用的,且裡面沒有重要資料,否則刪除後很難恢復)
DiskPart successfully deleted the selected partition.
接下來直接在windows的磁碟管理中,將ssd裡分出一個10g大小的freespace即未分配區,機械硬盤裡分出一個約400~500g大小的freespace即未分配區,保證主要進行深度學習工作的linux系統裡有足夠的空間。
將新卷變為未分配區的方法很簡單,刪除卷標就行了,最後將10G+450G的空間保持在‘未分配空間’的狀態,也就是黑色。
- 設定BIOS
- 重啟電腦,在啟動介面猛按或長按某一個神祕按鍵,進入BIOS。這個按鍵不同的廠不一樣,可能是F2,F10或DEL,一般都是這三個,不確定的話根據電腦自己google一下吧。
- 這裡有三件事要完成:
- 將security boot關閉,設定成disabled,False,off之類的。
- 保持UEFI不變,但將快速boot之類的關閉,切記,千萬不要弄巧成拙改成legacy。
將UEFI的USB啟動設定為自動啟動第一位序,如果沒有該選項的話,可以在開機時長按F12之類的按鍵,自選boot方式。
- 重新啟動電腦,選擇UEFI下的USB啟動選項,注意該選項會標註時UEFI模式。
繞開因顯示卡而宕機的危機
- 原本進行完第三步,理所應當從USB啟動,click,click,click下去,就能安裝好Linux了,然而這裡我卻遇到了個相當令人煩躁的bug——Ubuntu不支援Nvidia的主流顯示卡——所以會各種卡在安裝介面、logo介面、進度條介面……這也一度讓我對外星人燈廠表示失望,當然,最後發現是Ubuntu的問題,和外星人無關。
- 官方的解釋是,有一些顯示卡和主機板不能夠很好地在預設的Linux MInt環境的開源驅動下工作。
這裡參考了linux mint官方文件,完美解決了這個問題。
解決方案一(官方推薦):
- 在安裝時主動選擇boot的選項,長按F12就可以進入主動選擇boot選項的頁面,選擇usb boot,來到USB安裝介面
- 在USB安裝介面選擇compatibility mode
- 跑完流程後,系統會自動進入到安裝介面
解決方案二(如果方案一幫不了你的話):
- 同樣是在USB安裝介面
- 按e
修改boot選項
- 將其中quiet splash --
的文字,替換為nomodeset
- 最後按F10
就可以了
驗證:
- 成功標誌1:進入系統後會呈現很辣雞的顯示效果,一點和1080P及GTX高階卡不匹配,估計就是幾代前的舊電腦的顯示效果。
- 成功標誌2:在點選開始安裝系統後,能夠看到linux系統的介紹廣告,滑鼠可以移動,不會卡住,進度條也繼續往下走,還可以開火狐瀏覽器瀏覽網頁。
- ps:如果該成功的標誌沒有出現,強制關機,重新來一次吧!
安裝Linux Mint
終於,我們可以開始安裝Linux Mint了,這一步需要注意三點。如果你趕時間,記得不要聯網,也不要選擇
Install third-party software
那個選項,因為聯網後會自動安裝更新和驅動等,反之就自由選擇,如果不聯網,不選這個選項10分鐘能跑完系統安裝。
記得不要選擇清除windows!也不要選擇與什麼一起共存的選項!切記要選擇
Something else
。
Linux分割槽計劃
- 因為我的目的是主要用linux來執行深度學習的工作,所以一些基本的軟體譬如anaconda3,cuda9.0, cuDNN7.1, tensorflow-gpu, pandas, numpy ……等python的包,都要裝上。
- 其中anaconda3在安裝時預設裝在/home分割槽,cuda和cuDNN都是裝在/usr分割槽,python包是以anaconda3來管理,所以anaconda3裝在哪,包就會在哪。以後寫的程式和Project的臨時檔案一般都會存在/home裡,當然,可以用github來管理,但本地還是會佔用空間的。
- 另外雖然linux也可以呼叫SSD和機械硬盤裡的資料,但執行的時候資料放在相同目錄下還是會方便些,所以還要留出一定大小的空間直接放資料。
- 綜上,我的分割槽計劃如下:
/boot
不需要,我們把引導項和windows放在一起,因為是先有的win10再裝的linux,所以win10不會覆蓋掉,注意等會兒boot掛在時掛到SSD中的EFI分割槽上即可。
/
ext4格式,logical,這個是系統所在的根目錄,留下10g給linux系統以及一些雜七雜八的分割槽足矣。
swap area
交換空間,這個空間即你的虛擬記憶體,在實體記憶體用盡後,溢位的部分才回到虛擬記憶體中。該空間太大沒用,太小又不行,根據記憶體大小選擇,一般不要小於本身記憶體的一半,若是本身記憶體太小,可以設定大些。我的記憶體是16g,留下8g足夠了。
/usr
預設軟體安裝空間,軟體預設的安裝位置都在這個區,因為要裝pycharm和cuda、cuDNN,我留了60g。
/home
將餘下的freespace都給了Home空間,這個相當於是windows系統中的user區域,anaconda3,文件,日誌等預設的位置都在這裡,以後資料也都放這裡,留多些沒壞處。
- 當然,還有更多的譬如
/var
之類的區域,我沒有一一細分,這些都會掛在根目錄/
下面。 - 接下來,將
boot
掛到/dev/sda(x)
,這裡的x指windows系統放置了引導項的EFI分割槽編號一般應該不是0就是1,後面會有windows boot manager
的字尾,就可以點選開始安裝了。 - 如果不聯網的話安裝過程在10分鐘左右。
III. GTX1070驅動
- 用linux自帶的驅動管理安裝最新的驅動即可
選單
-設定
-驅動管理
-384版最新驅動
IV. CUDA9.0
1. sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
2. sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
3. sudo apt-get update
4. sudo apt-get install cuda
5. export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
6. export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64\ ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
7. export CUDA_HOME=/usr/local/cuda
8. sudo ln -s cuda-9.0 cuda
- 完成
V. cuDNN7.0
- 在官網下載cuDNN7.0,這裡注意,tensorflow暫時還未支援7.1,所以我下載的還是7.0版本,要下載cuDNN還需要用郵箱註冊一下,登入後才能下載,這個就註冊下好了。
- 下好後同樣在
Download
開啟terminal,逐一輸入以下程式碼:
ps: 同樣,參考官方指導
1. tar -xzvf cudnn-9.0-linux-x64-v7.tgz
2. sudo cp cuda/include/cudnn.h /usr/local/cuda/include
3. sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
4. sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
5. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64export
6. CUDA_HOME=/usr/local/cuda
- 完成了
VI. Anaconda
- 在Download目錄下開啟terminal,逐一輸入:
1. bash ~/Downloads/Anaconda3-5.1.0-Linux-x86_64.sh
2. 點選N次回車[Enter]
3. yes
4. 再點選一次回車[Enter]
5. yes
- 可以嘗試下能否開啟
1. source ~/.bashrc
2. anaconda-navigator
- 安裝完成
VII. Tensorflow-GPU
- 接下來我們開始安裝Tensorflow-gpu版本,這次安裝的是最新版tensorflow1.8
- 開啟anaconda的terminal,輸入:
1. sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
2. sudo apt-get install libcupti-dev
3. pip install --upgrade -I setuptools
4. conda create -n tensorflow python=3.6
5. conda activate tensorflow
6. pip install --ignore-installed --upgrade \
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.8.0-cp36-cp36m-linux_x86_64.whl
- 完成
隨手在terminal試驗下:
python
import tensorflow as tf
# Creates a graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))
VIII. Pycharm
- 接下來我們裝一個python的IDE,先去官網下個Pycharm
- 下載好以後,根據官網指導安裝一下。
- 先在
/usr
目錄,或其他你想要安裝的目錄下解壓下載的包,進入pycharm的bin目錄,開啟terminal,輸入sh pycharm.sh
就能進入pycharm - 如果要用github的話記得下載git:
1. sudo apt-get install git
VIIII. 測試
- 最後,測試一下整個環境是否配置完成,我們執行一個minisize的訓練計劃吧。
- minst的20000個epoches跑了86秒,可以說速度賊快了。
import tensorflow as tf
import datetime
#Start interactive session
sess = tf.InteractiveSession()
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
width = 28 # width of the image in pixels
height = 28 # height of the image in pixels
flat = width * height # number of pixels in one image
class_output = 10 # number of possible classifications for the problem
x = tf.placeholder(tf.float32, shape=[None, flat])
y_ = tf.placeholder(tf.float32, shape=[None, class_output])
x_image = tf.reshape(x, [-1,28,28,1])
W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
b_conv1 = tf.Variable(tf.constant(0.1, shape=[32])) # need 32 biases for 32 outputs
convolve1= tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding='SAME') + b_conv1
h_conv1 = tf.nn.relu(convolve1)
conv1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') #max_pool_2x2
W_conv2 = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1))
b_conv2 = tf.Variable(tf.constant(0.1, shape=[64])) #need 64 biases for 64 outputs
convolve2= tf.nn.conv2d(conv1, W_conv2, strides=[1, 1, 1, 1], padding='SAME')+ b_conv2
h_conv2 = tf.nn.relu(convolve2)
conv2 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') #max_pool_2x2
layer2_matrix = tf.reshape(conv2, [-1, 7*7*64])
W_fc1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1))
b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024])) # need 1024 biases for 1024 outputs
fcl=tf.matmul(layer2_matrix, W_fc1) + b_fc1
h_fc1 = tf.nn.relu(fcl)
keep_prob = tf.placeholder(tf.float32)
layer_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1)) #1024 neurons
b_fc2 = tf.Variable(tf.constant(0.1, shape=[10])) # 10 possibilities for digits [0,1,2,3,4,5,6,7,8,9]
fc=tf.matmul(layer_drop, W_fc2) + b_fc2
y_CNN= tf.nn.softmax(fc)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_CNN), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_CNN,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())
starttime = datetime.datetime.now()
for i in range(20000):
batch = mnist.train.next_batch(50)
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x:batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g"%(i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
endtime = datetime.datetime.now()
print('Time use:',(endtime - starttime).seconds, 's')