Install Tensorflow(gpu) บน Window 10 เบื้องต้น
บทความนี้จะแบ่งเป็น 2 part โดยจะสอนตั้งแต่ลงโปรแกรมพื้นฐานที่จำเป็น ไปจนถึงขั้นตอนที่เราสามารถทำ Object detection เบื้องต้นได้
- เตรียมโปรแกรมที่จำเป็นสำหรับการใช้ tensorflow + install tensorflow(gpu)
- การทำ object detection
ก่อนอื่นตรวจสอบรุ่น gpu ที่สามารถใช้กับ cuda ได้ที่นี่ ไม่งั้นจะไม่สามารถใช้ tensorflow(gpu) ได้ (รุ่นที่ผมใช้ เป็น NVIDIA GeForce GTX 1060)
เอาละมาเริ่มกันเลยย !
1.Install Visual Studio 2015 Community Edition Update 3
ในที่นี้จะใช้เป็น version 2015 เนื่องจากที่ไปอ่านมาส่วนใหญ่ version 2017 จะมีปัญหา (แต่ถ้าเพื่อนคนไหนอยากใช้ version 2017 ก็สามารถใช้ได้ครับ)
เลือกลงแบบ custom แล้วติดตั้งตามภาพ
เมื่อติดตั้งเรียบร้อยแล้วให้ทำการ add path ของ Visual Studio 2015 ด้วย
กด search ของ window แล้วพิมพ์ environment variables เพื่อทำการ add path
1.1 กด New สร้างตัวแปร INCLUDE และใส่ค่าเป็น C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
1.2 กด New สร้างตัวแปร LIB และใส่ค่าเป็น C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64
1.3 ไปที่ Path กด Edit แล้ว New เพื่อเพิ่ม C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
เข้าไป
2.Install Anaconda (64-bit) with Python 3.6 (Anaconda3–5.2.0)
เมื่อเปิดตัวติดตั้ง ให้กด Next ไปเรื่อยๆจนถึงหน้านี้ ให้เลือก add Anaconda PATH เพื่อที่เราจะได้ไม่ต้องไป add path เพิ่มทีหลัง
เมื่อลงเรียบร้อยเปิด command prompt หรือ anaconda prompt ก็ได้ แล้วทำการสร้าง environment ขึ้นมาใหม่เพื่อใช้งานกับ tensorflow
สร้าง environment ชื่อ myenv(ตั้งอะไรก็ได้) และลง packages ที่จำเป็น
พิมพ์คำสั่งสร้าง environment ไปที่ cmd
conda create -n myenv pip python=3.6.1 numpy scipy mkl pillow lxml cython jupyter matplotlib pandas
ทำการเรียกใช้ environment โดยใช้คำสั่ง activate ตามด้วยชื่อ environment
activate myenv
คำสั่งเมื่อต้องการออกจาก environment
deactivate
คำสั่งเมื่อต้องการลบ environment (ไม่ต้องการจะใช้แล้วหรือมี environment อื่น)
conda env remove -n myenv
3.Install CUDA 9.0 (64-bit)
ให้ลง CUDA version 9.0 เนื่องจาก tensorflow ยังไม่รองรับ 9.2
โหลดโปรแกรมสำหรับ window version ดังภาพ
เลือกลงแบบ custom ตามภาพ
หลังจากลงเรียบร้อยให้ทำการ add path ของ CUDA
3.1 เข้าไปที่ Path กด Edit แล้ว New เพื่อเพิ่ม C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
เข้าไป
3.2 เข้าไปที่ Path กด Edit แล้ว New เพื่อเพิ่ม C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\libnvvp
เข้าไป
#Common Errors
- สำหรับคนมี error ขั้น system check แล้วขึ้น “ This graphics driver could not find compatible graphics hardware” ให้ทำการลง CUDA version ที่สามารถหาการ์ดจอเจอก่อน ในที่นี้ใช้ version 9.2 แล้วลง CUDA version ที่ tensorflow รองรับ คือ version 9.0 ต่อ เนื่องจาก แต่ละ version สามารถทำงานร่วมกันได้ อ้างอิง
- สำหรับคนที่ cuda install failed ให้ทำการ uninstall โปรแกรมบนเครื่องที่ชื่อขึ้นต้นด้วย nvidia ทั้งหมดในเครื่อง ทำการ restart แล้วลง CUDA ใหม่อีกรอบ
4.Install cuDNN for CUDA 9.0
เลือก cuDNN ให้ตรงกับ CUDA ที่เราลงในครั้งนี้ใช้ cuDNN for CUDA 9.0
เมื่อโหลดเสร็จแล้วให้เราแตกไฟล์ zip ข้างในจะมี folder (bin
, include
, lib
) อยู่ นำ folder (bin
, include
, lib
) ไปใส่ใน folder ที่เราลง CUDA ไว้ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
5.Install Tensorflow-gpu
เปิด command prompt แล้วทำการเรียกใช้ environment ที่เราสร้างไว้
แล้วพิมพ์คำสั่งเพื่อลง tensorflow-gpu
pip install --upgrade tensorflow-gpu
เมื่อเสร็จแล้วทำการให้ลง keras ต่อ
pip install --upgrade keras
เสร็จเรียบร้อยแล้วสำหรับการลงโปรแกรมเพื่อเตรียมสำหรับทำ object detection
ขั้นตอนสุดท้าย test ว่า tensorflow gpu ของเราทำงานได้รึไม่ โดยเข้าพิมพ์ python ลงไปที่ command prompt แล้วใส่ code ตามนี้เลย
'''Trains a simple convnet on the MNIST dataset.
Gets to 99.25% test accuracy after 12 epochs
(there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
batch_size = 128
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
GPU ของเราทำงานแล้ว เย่ +++