Chuyển đến nội dung chính

Cài đặt deep learning environment trong Ubuntu 14.04 với GPU support

Linux được biết như một hệ điều hành có ưu thế khi chạy computation như deep learning và mình chọn Ubuntu 14.04 vì nghe nói version Trusty Tah này ổn định và tương thích với các packages như Keras, Tensorflow, Theano khi chạy deep learning, và thực sự là mình không quen với linux nên mình chọn version đã có nhiều hướng dẫn chi tiết.
Tình hình là sau khi vật vã install/uninstall cả 2 tuần và thậm chí install lại Linux 2 lần (sau 2 lần vật vã tương tự với Win 10), mình tìm được link hướng dẫn  ở dưới và đi đến lịch trình cài như sau:

Disable SecureBoot trong UEFI BIOS

Secure Boot thường được mặc định enable trong ASUS motherboard với UEFI BIOS, tuy nhiên NVIDIA Driver không support khi Secure Boot enable nên cần phải disable nó thì NVIDIA Driver mới cài được mà không có lỗi gì .Các bước để disable SecureBoot như trong link này:
Mình tóm tắt lại như sau:
  • Cắm USB
  • Khởi động lại máy để vào BIOS bằng cách bấm nút DEL hoặc nút khác theo hướng dẫn trên màn hình khởi động.
  • Vào Advanced Mode -> Boot -> Secure Boot
  • Chọn đúng loại OS và vào Key Management
  • Chọn “Save Secure Boot Keys” và bấm Enter để save keys, sau đó màn hình hiện ra prompt hỏi lưu vào đâu thì chọn USB để lưu lại (mình nghĩ là lưu vào ổ cứng cũng được). Sau khi save thì trong USB sẽ có 4 keys là PK, KEK, DB, và DBX.
  • Bấm xuống PK key, Enter và chọn Delete PK (Platform Key) để disable Secure Boot (chú ý: không delete các keys khác). Sau khi delete PK, back ra ngoài màn hình Secure Boot sẽ thấy SB đã disabled.
  • Lưu và khởi động lại máy (F10).

-      Nếu lỡ chưa disable Secure Boot trước khi install thì có thể sẽ bị lỗi login loop (nhập password login nhưng không thể login mà lại bị quay trở lại màn hình login, cứ như vậy). Để login vào được, cần phải vào terminal mode (Ctrl+Alt+F1) để xóa nvidia và broadcom packages bằng lệnh sau:
sudo apt-get purge nvidia-*
sudo apt-get purge bcmwl-kernel-source
sau đó khởi động và login lại.

Install NVIDIA Driver and CUDA

Khi install NVIDIA Driver mình gặp vô số lỗi, k thể nhớ hết nổi, đặc biệt là khi install bằng apt-get, m nghĩ là vì các xung đột khi CUDA tạo các repository và vì install thiếu kernel nào đó. Mình làm theo rất nhiều link hướng dẫn nhưng đều fail trừ link mình post ở trên. Và đặc biệt là CUDA sẽ không install khi X server (giao diện GUI của linux) đang chạy. Nên trước khi install phải vào terminal mode (log out khỏi GUI và bấm Ctrl+Alt+F1), stop desktop manager service (lightdm), bước này cũng có trong hướng dẫn.
Các bước thực hiện như sau:
  1. Xóa những bản cài trước nếu có (nhất định phải xóa nếu đã từng cài):                                                                                           sudo apt-get purge nvidia*
    sudo apt-get autoremove
           sudo dpkg -P cuda-repo-ubuntu1404
  2. Download driver (NVIDIA kernel):                                                 cd ~
    wget http://us.download.nvidia.com/XFree86/Linux-x86_64/367.57/NVIDIA-Linux-x86_64-367.57.run
  3. Cài các gói liên quan (dependencies):                                               sudo apt-get install build-essential gcc-multilib dkms
  4. Disable Nouveau kernel driver:                                                       sudo nano /etc/modprobe.d/blacklist-nouveau.confblacklist-nouveau.conf/etc/modprobe.d/
    Thêm các dòng sau vào file:
    blacklist nouveau
    blacklist lbm-nouveau
    options nouveau modeset=0
    alias nouveau off
    alias lbm-nouveau off
    Save và exit nano (Ctrl+X, yes khi prompt có lưu file không). Sau đó update initial  RAM filesystem và reboot:
    $ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
    $ sudo update-initramfs -u
    $ sudo reboot
  5. Tắt X server: sudo service lightdm stop
  6. Chạy runfile: cd ~
    chmod +x NVIDIA-Linux-x86_64-367.57.run
    sudo ./NVIDIA-Linux-x86_64-367.57.run –dkms
    Sau khi install thành công, không có lỗi gì, nhập lệnh nvidia-smi để kiểm tra chắc chắn hê thống đã support CUDA.
  7. Install CUDA Driver: Install CUDA gồm có 3 files, 1 NVIDIA driver installer (bản cũ, theo mình hiểu là như kiểu bản gốc), 1 CUDA installer thiệt, và 1 CUDA samples installer. Lệnh cài như sau:
    cd ~
    wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run
    chmod +x cuda_7.5.18_linux.run
    ./cuda_7.5.18_linux.run --extract=$HOME
    sudo ./cuda-linux64-rel-7.5.18-19867135.run
    sudo bash -c "echo /usr/local/cuda/lib64/ > /etc/ld.so.conf.d/cuda.conf"
    sudo ldconfig
    Sau đó append đường dẫn /usr/local/cuda/bin vào system file /etc/environments
    sudo –i gedit /etc/environment
    Thay đổi đường dẫn PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 

    thành

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/cuda/bin"
    Lưu và thoát editor.
    Reload PATH
    source /etc/environment 
  8. Install cuDN:  Tải cuDNN về từ https://developer.nvidia.com/cudnn (phải tạo account trên nvidia). Chọn cuDNN v5.1 for CUDA 7.5 -> Chọn cuDNN v5.1 Library for Linux. Copy tgz file vào /usr/local, extract ra , xóa tgz file nếu muốn.
    $ tar -zxf cudnn-7.5-linux-x64-v5.0-ga.tgz
    Cuối cùng gõ sudo ldconfig
    Cài xong CUDA và cuDNN.

Install OpenCV với CUDA support

Mình muốn install một deep learning environment với CUDA support và có OpenCV, Keras với Theano backend (Keras là thư viện bậc cao hơn với ứng dụng xây dựng convolutional neural network (CNN) tiện hơn nhưng nó cần sự hỗ trợ từ Theano hoặc Tensorflow, thư viện bậc thấp hơn). Sau vài tuần install/uninstall thì mình đi đến kết luận là nên cài mọi thứ trong virtual environment của python. Nếu có bị lỗi j thì kill cái environement luôn cho khỏe, chứ install 1 hồi không nhớ là đã install cái gì để mà uninstall nữa. Mình đã  từng phải re-install cả OS chỉ vì lỗi package này đè lên package khác, k biết đường nào mà gỡ :P. Ngoài ra nếu muốn làm việc với nhiều projects vơi các yêu cầu version khác nhau của cùng một package thì virtual env là tiện nhất, vì nếu install package globally thì không thể nào install các version khác nhau của cùng một package được.
Installation procedure theo như link tham khảo mình đã post. Tóm tắt lại như sau:
Install các gói prerequisite cần thiết và python 2.7
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install libhdf5-serial-dev
$ sudo apt-get install python2.7-dev
Install pip và virtual env
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf get-pip.py ~/.cache/pip
Edit file bash để chạy virtualenvwrapper mỗi lần thực thi, nếu không thì mỗi lần làm bạn phải chạy lại lệnh để tạo virtual env
nano ~/.bashrc
Thêm dòng sau vào cuối file, exit and save file (Ctrl + X, sau đó chọn yes khi được hỏi để save)
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
Load lại file bash, tạo virtual env tên cv, và install numpy vô environment cv này
$ source ~/.bashrc
$ mkvirtualenv cv
$ pip install numpy

Tạo directory để chứa source của OpenCV.
$ sudo mkdir opencv_compile
$ sudo chown -R ubuntu opencv_compile
$ cd opencv_compile
Download và unzip
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
Dùng cmake để cấu hình build, enable CUDA và fast math
$ cd opencv-3.1.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D WITH_CUDA=ON \
    -D ENABLE_FAST_MATH=1 \
    -D CUDA_FAST_MATH=1 \
    -D WITH_CUBLAS=1 \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.1.0/modules \
    -D BUILD_EXAMPLES=ON ..
Sau khi chạy cmake, kiểm tra phần NVIDIA CUDA (xem hình trong link tham khảo), CUFFT, CUBLAS, fast math phải được enable rồi.
Compile và install OpenCV sau khi cmake chạy không có lỗi gì
$ make –j4    #4 là số core CPU, thay đổi nếu cần thiết
$ sudo make install
$ sudo ldconfig

Lưu ý install OpenCV khi vẫn đang ở trong virtual environment. Sau khi install xong không có lỗi gì thì kiểm tra trong ~/.virtualenvs/cv/lib/python2.7/site-packages/usr/local/lib/python2.7/site-packages
$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so
Để check cv2 thì vào python để import và check version của cv2 (nếu không đang ở trong virtial env cv thì gõ workon cv để chuyển vào cv)
$ python
>>> import cv2
>>> cv2.__version__
Cài xong OpenCV.

Install Keras

Lưu ý: vẫn đang ở trong virtual env cv khi install keras (nếu không đang ở trong cv thì “workon cv”  để chuyển vào cv).
Cài các gói mà keras phụ thuộc
$ pip install numpy scipy
$ pip install scikit-learn
$ pip install pillow
$ pip install h5py
Kể cả Theano. Theano thì cài bản bleeding-edge theo link hướng dẫn ở dới. Install Theano bằng pip khi sử dụng rất dễ bị lỗi
$ pip install --upgrade --no-deps git+git:github.com/Theano/Theano.git
Install Keras
$ pip install keras
Sau khi install xong import keras để keras tự tạo file keras.json (sẽ bị lỗi nếu chưa cài tensorflow trong cv)
$ python
>>> import keras
>>> quit()
Sửa file keras.json trong ~/.keras/để chuyển backend sang Theano nếu bị lỗi khi import.
{
    "image_dim_ordering": "tf",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}
Chuyển tensorflow thành theano cho “backend”, thông số "image_dim_ordering" thành “th”. Tuy nhiên Khi chạy Keras với Tensorflow backend, ở một số version của Tensorflow, thông số “image_dim_ordering” phải set là “th” chứ không phải là “tf” , mình chạy với Tf v0.12.0.ocr1, set “image_dim_ordering: tf” trong file ~/.keras/keras.json mà bị lỗi “Keras MaxPooling2D gives ValueError: Negative dimension size caused by subtracting 2 from 1 for 'MaxPool_x' “. (Link tham khảo: https://github.com/fchollet/keras/issues/3945)
Ngoài ra, một số version Keras khi chạy với Tensorflow (install Tensorflow rất đơn giản, chỉ bằng lệnh pip install tensorflow) còn bị lỗi ‘module’ object has no attribute ‘control_flow_ops’ khi running_model_from_json (chạy model từ file json). Lỗi này đã từng được raised bên Tensorflow nhưng Tf không fixed mà để để chờ Keras fix thì phải, túm lợi là không bên nào fix. Khi gặp lỗi này thì mình work around bằng cách set tf.python.control_flow_ops sau khi import tensorflow
import tensorflow as tf
tf.python.control_flow_ops = tf
Để chạy GPU support cho Keras với Theano backend thì cần set (hoặc tạo mới) file .theanorc ở home với nội dung:
Tensorflow thì không cần.
Xong xuôi, vô python, import keras không có lỗi gì là done, viết và chạy deep learning thôi ^^.

Monitoring GPU usage:

Sudo pip install glances[gpu]
Để lauch glances và check GPU:
Sudo glances
Terminal sẽ hiện ra như sau:

https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end(gpuarray)

Nhận xét

Bài đăng phổ biến từ blog này

Chạy bộ và viết blog

Nhìn lại những năm tháng tuổi trẻ của mình thấy chơi bời, điên khùng cũng nhiều, phá phách cũng nhiều, làm bố mẹ, bạn bè, thầy cô giận chắc cũng khá, cũng đủ để an ủi bản thân cho cái câu "học không chơi phí hoài tuổi trẻ"", túm lại là không có phí hoài mấy :))). Bị cái chơi hơi quá, học thì không được nhiều lắm. Bởi vậy 29 tuổi đầu còn mài đít trên ghế nhà trường, đi thi, tính tích phân, đạo hàm thấy miẹ. Túm lại giải thích nãy giờ là để bắt đầu cho cái challenge 30 ngày chạy bộ và viết lách (một ngày tiếng việt, một ngày tiếng anh), hôm nay là ngày đầu tiên (bingo). Trong cuốn What I wish I knew when I was 20-Tina Seelig, Tina có nói về quá trình phát triển, hoàn thiện cũng như khám phá bản thân. Phát triển, hoàn thiện thì nhiều blog, nhiều sách có nói tới, đại loại là đọc sách nhiều, tập thể thao, học ngoại ngữ, học giao tiếp. Cái này thì cứ phải học, phải đọc cả đời. Còn cái khó nhất mình nghĩ là khám phá bản thân. Khám thai, phá thai chắc cũng không khó lắm, chứ...

NEUROPLASTICITY (KHẢ BIẾN THẦN KINH) VÀ NHÂN SINH QUAN

Các vùng vỏ não đã từng được gán cố định cho một chức năng thần kinh nhất định (localization), ví dụ như fusiform face area, một vùng nhỏ bên não phía sau tai, là để nhận diện khuôn mặt, vùng thị giác visual area V4, V5 để xử lí tín hiệu đưa từ mắt. Tuy nhiên, cho đến những năm 1960, thiết bị để nhìn cho người mù bẩm sinh của Paul Bach-y-Rita đã thay đổi cách nhìn nhận của giới khoa học về bộ não, đồng thời khái niệm neuroplasticity dần dần được chấp nhận và đưa vào nghiên cứu rộng rãi. Bắt nguồn từ một thí nghiệm cho thấy vùng não xử lí hình ảnh của con mèo còn xử lí cả âm thanh và xúc giác, Bach-y-Rita đã chú ý đến neuroplasticity và thực hiện nhiều nghiên cứu liên quan. Bên cạnh thiết bị giúp cho người mù bẩm sinh có thể nhìn, Bach-y-Rita còn thiết kế nhiều thiết bị trợ giúp trong y tế khác như thiết bị đóng vai trò như một tuyến yên nhân tạo để giúp cho những người chức năng giữ cân bằng của tuyến yên không hoạt động, hay găng tay có thể cảm nhận được dành cho các phi hành gia.....