Github

簡單使用github.io與gh-pages分支功能來架設靜態網頁

本文紀錄架設靜態網站時遇到的種種問題,分成github.io跟gh-pages兩大部份

使用github.io架設靜態網站

1.github.io專案

在github建立github new repository,命名必為 [github帳號名].github.io,比如xxxxx.github.io(本文皆用此例說明)

分歧點:自己的網頁與Github Pages site theme

2.1自己的網頁

若是已經有自己寫好的靜態網頁(含html、css、js等檔案),可直接按照git的流程將其上傳至步驟1專案的github,上傳成功後到 https://xxxxx.github.io/ 查看網站,一個靜態網頁就架好了!

2.2 Github Pages theme

xxxxx.github.io 專案頁面下選擇Setting -> Github Pages -> Choose a theme ->Jekyll theme (見圖1),選好後就能到 https://xxxxx.github.io/ 查看網站,網站也架好了!此時index.md內容可以自己改成履歷或其他~

參考資料1有手把手圖文教學

基本上兩個步驟就能架設好一個非常簡單的網站了~完成後回到 xxxxx.github.io頁面,右欄最下面會出現Environments-> github-pages (Active)

Github Pages site 的Theme可以隨便選嗎?

可以,主題隨便選都是 Jekyll theme,但注意會覆蓋整個Github Pages site,如下圖介紹

因此在Setting -> Github Pages -> Theme Chooser 會顯示出選擇的主題是Jekyll theme

因此在網頁中css顯現不出來只有文字和連結Orz…在chrome按F12使用開發者工具查看,出現滿滿的failed to load resource the server responded with a status of 404 () ……

解決辦法是在自己寫的html資料夾中建立一個.nojekyll的空文件(參考資料4),然後一起push到xxxxx.github.io

使用gh-pages分支功能架設靜態網站

1.github一般專案

在github建立new repository,當一般專案命名(例如projectA),git clone到本地端後放入html檔,進行git add –all、git commit -m”message”

2. gh-pages branch

建立 gh-pages branch,輸入以下指令

git checkout -b gh-pages # 建立gh-pages branch並切換過去

上面的單行指令相當於

git branch gh-pages # 建立gh-pages branch
git checkout gh-pages # 切換到gh-pages branch

接下來輸入以下指令

git push --set-upstream origin gh-pages 

確認github上的projectA更新後,進入到https://xxxxx.github.io/projectA,這樣就透過gh-pages完成了一個與xxxxx.github.io專案分開的網站了~

這邊可以看參考資料2(簡單的gh-pages 使用流程)、參考資料3(詳細介紹gh-pages與實作)

–set-upstream 使用場景

projectA在建立時使用的通常是master branch,因此新建立的gh-pages branch 跟無法直接跟projectA產生對應關係,也就不能直接用git push推檔案上github,在git push後面才要加上–set-upstream 將gh-pages branch 註冊進 .git\config 設定檔,如此一來本次的變更會合併到gh-pages branch,推送到預設origin的github遠端資料庫。建立新分支時第一次推時使用–set-upstream 或 -u 就好,之後會跟原專案的master branch一樣可以使用git push。(參考資料5)

為何使用gh-pages?

xxxxx.github.io專案的index.html通常當主頁,但若日後放在其之下的網頁專案數量越來越多,會造成管理的麻煩,因此可利用gh-pages分支功能讓網頁專案能分開管理。

結語

github.io只能放靜態網頁,但拿來放履歷跟作品集綽綽有餘,Github本身又有強大的版控功能,果然是工程師的最佳夥伴~

參考資料

1.不用懂git也能用GitHub Pages架設靜態網站並綁定網域

2.從零開始: 用github pages 上傳靜態網站

3.善用gh-pages分支功能 無料架設靜態網站

4.Including node_modules And vendors Folders In Your GitHub Pages Site

5.30 天精通 Git 版本控管 (25):使用 GitHub 遠端儲存庫 – 觀念篇

LinuxPython未分類

使用Sphinx生成Python說明文件

本文介紹如何使用Sphinx,簡單將在套件裡辛辛苦苦寫的Python docstring轉換成HTML,直接變成漂亮的說明網站~

前置作業

  • 內含docstring的套件(可用參考網站的參考套件範例:python-dev-setup)
  • 建立虛擬環境(跟套件在同一個目錄底下比較方便,參考網站是將兩者都放在根目錄下)

按順序在終端機輸入以下指令

$ pip install vitualenv # download vitualenv
$ virtualenv venv # create virtual environment
$ . venv/bin/activate # activate virtual environment
$ pip3 install autopep8 
$ pip3 install pylint
$ pip3 install coverage
$  pip3 install -U sphinx
$ pip3 install sphinx_rtd_theme

以上的動作是因為,開發環境需要Python2.7版本,為了不與自己電腦的Python3.6版本混在一起,於是使用vitualenv建立一個名叫venv的虛擬環境(可自行命名),再下載所需套件與Sphinx,其中Sphinx_rtd_theme是一種Sphinx的主題風格

sphinx-quickstart

建立好虛擬環境後,可以開始使用sphinx-quickstart,輸入以下指令

$ . venv/bin/activate
$ mkdir docs
$ cd docs
$ sphinx-quickstart # queries on basic setup shall starts

欢迎使用 Sphinx 3.4.1 快速配置工具。 (最新版可接受python3.6.9的註解型態的版本,例如: log(listA) -> list:)

獨立的源文件和建構目錄(y/n) [n]: y

項目名稱:

作者名稱:

項目發行版本 []:

項目語種 [en]: en

設定autodoc路徑

上述跑完後會出現一些檔案,先修改docs/source/conf.py的內容,找到 Path setup ,修改成以下內容

import os
import sys
sys.path.insert(0, os.path.abspath('../../')) # 參考圖1檔案的位階
# this conf.py is in ./docs/source/conf.py
# therefore our source code is up 2 level then the directory of python source code is the i.e. ./python_dev_setup
圖1.資料階層

設定HTML主題

在./docs/source/conf.py

html_theme = 'sphinx_rtd_theme'

設定型態提示風格

同樣在./docs/source/conf.py

extensions = [ sphinx.ext.napoleon ]

設定index.rst

內容完全照搬就對了~頂多變更標題

Python Dev Environment in VSCode (標題)
====================================================================
.. toctree::
   :maxdepth: 2
   :caption: Readme
   readme
.. toctree::
   :maxdepth: 2
   :caption: Docstring
   docstring/modules
.. toctree::
   :maxdepth: 2
   :caption: Index
   indices

建立readme.rst

手動建立docs/source/readme.rst ,內容為

.. include:: ../../README.rst

如此一來readme.rst就會參考在根目錄下(跟套件同一位階)的README.rst全部內容

建立indices.rst

手動建立docs/source/indices.rst,內容為

Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

建立Python 說明文件

$ . venv/bin/activate
$ rm -Rf docs/build
$ rm -Rf docs/source/docstring
$ sphinx-apidoc -f -o docs/source/docstring/ python_dev_setup # this is the steps where the docstring/modules going to be filled with our code docstring

其中是指python_dev_setup 套件路徑,注意要與前面的路徑用空格分開

最後輸入

$ cd docs && make html && cd ..

看到下圖代表完成,可進入該路徑點進去看看網頁長怎樣(見證奇蹟的一刻!)

Project裡含多個套件的情況

在sphinx-quickstart的階段輸入正確的project名稱,或是選擇在docs/source/conf.py裡面找到Project information 修改project參數

先照著標題sphinx-quickstart做直到以下兩條指令前停

$ sphinx-apidoc -f -o docs/source/docstring/ package 
$ cd docs && make html && cd ..

只要將上述指令中的package換上自己的套件位置並執行到第二行,執行完後可再換同位址不同套件的位置再執行建立HTML,最後生成兩個套件都在同一個HTML裡

結語

使用Sphinx快速生成Python說明文件實在是太幸福了XD 非常值得花時間摸索

參考網站

Python

將自己的python package上傳到PyPI

跟著官方教學(以下稱作官網)與參考文章從不會到會花了我半天時間,但跟著做大致上不會出錯,此文章紀錄一些上傳到PyPI遇到的困難,大致上是在官網的文件上加上自己的理解與筆記。

建議順序

將package上傳至PyPI前的大致過程,因此以下幾點並非本文之後的大標題,建議按此順序上傳會比較順利

  • 上傳package到github
  • 撰寫README.md
  • 註冊TestPyPI
  • 跟著官網學習上傳package到TestPyPI
  • 註冊PyPI
  • 上傳到PyPI

—上傳前—

package檔案結構

以下是官網舉一個package上傳的範例,相當於自己寫好的python package原始狀態,但其實此專案底下有多個package也沒問題

packaging_tutorial (專案/資料夾)
└── example_pkg (package/資料夾)
  └── __init__.py (使example_pkg成為package/ py檔)
  └── modules.py (模組/ py檔)

接下來照著步驟開始建立setup.py、README.md、LICENSE三個檔案,其中tests是一個資料夾,完全照著官網做的話要留著,建立完後會如以下結構:

packaging_tutorial
├── LICENSE (授權文件/ txt檔)
├── README.md (package簡介/ md檔)
├── example_pkg
│  └── init.py
│  └── modules.py
├── setup.py (package基本資訊/ py檔)
└── tests (官網要求建立/資料夾)

setup.py

須注意官網中classifiers的部份,其中 “License :: OSI Approved :: MIT License",指的是package的授權,若是正式上傳到PyPI時要注意自己願意的授權方式 ; “Operating System :: OS Independent" 指的是此package在PyPI的分類類別,可於https://pypi.org/classifiers/挑選合適類別

README.md

若github有寫好便可直接使用,但注意不要放圖

LICENSE

package的授權文件,須注意要與setup.py中的授權方式一樣,可於https://choosealicense.com/挑授權方式,複製內容後存成txt檔

—上傳 TestPyPI—

更新setuptools和wheel

python3 -m pip install –user –upgrade setuptools wheel

再進入專案資料夾路徑,運行以下指令,會產生大量檔案

python3 setup.py sdist bdist_wheel

TestPyPI

登入TestPyPI並驗證信箱完畢後,先建立API tokens,路徑為右上角的帳號按鈕->Account settings ->API tokens。

API tokens

須注意tokens為提高安全性,當下建立的tokens只能使用這次,關掉網頁後就沒有了,因此先放在旁邊備用

上傳package

安裝Twine:

python3 -m pip install –user –upgrade twine

在同一專案資料夾路徑下運行以下程式碼,會上傳dist資料夾內所有檔案到TestPyPI上

python3 -m twine upload –repository testpypi dist/*

運行後會出現Enter your username,請輸入 __token__ ,password則使用剛剛放在旁邊備用的pypi- 開頭密碼,密碼複製貼上後不會顯示出來,貼一次就好(以為沒貼到貼了好幾次的我

成功的話會跑出Uploading 100%等字

下載package

查看package是否確實上傳到TestPyPI上,以及可否下載,路徑在右上角的帳號按鈕->Your projects->在自己的專案下點Manage->點入最上方含有簡短介紹的專案-> 複製 pip install -i https://test.pypi.org/simple/ example-pkg-YOUR-USERNAME-HERE->於終端機上運行下載

測試package

確認下載後自己的package是否能正常使用,或有缺漏等等。都確認正常後,就差最後一里路:正式上PyPI !

—正式上傳 PyPI—

註冊登入PyPI後,跟著本文標題的—上傳 TestPyPI— 的步驟全部再跑一次會比較順利,但在上傳package上傳dist資料夾內所有檔案的指令

python3 -m twine upload –repository testpypi dist/*

要換成

python3 -m twine upload dist/*

結語

最後可以直接用pip install來下載自己的package,超讚!

業配文:https://pypi.org/project/TimesML/

C++學習筆記

簡單初學Makefile

這篇文章可學到很簡單建立Makefile的方法

建立Makefile

在一個空的資料夾裡建立一個空檔案,名稱為makefile或Makefile,不用副檔名

在makefile檔內寫上

hello:
	@echo "hello world"

其中第一行的hello是任務名稱,第二行是Linux shell指令,@會在執行時將指令內容隱藏起來,存檔後直接在終端機執行make hello,就可以執行第二行的指令以輸出結果 hello world

執行一個檔案

建立一個helloworld.cpp檔

#include 
using namespace std;
int main(){
    printf("Hello World");
    return 0;
}

在makefile檔內寫上

main:
	@g++ helloworld.cpp -lstdc++ -o hw.out
	@./hw.out

在終端機執行make main,會依序執行指令,因此第二行會編譯與組譯出hw.out執行檔並出現在同資料夾內,第三行再執行hw.out,最後輸出結果Hello World

刪除out檔

在makefile檔內寫上

clear:
	@rm *.out

在終端機執行make clear會刪除所有out檔

Makefile內容

執行多個檔案

在makefile檔內寫上

main:
	gcc -c MatrixOpApi.cpp MatrixTest.cpp main.cpp
	gcc main.o MatrixOpApi.o MatrixTest.o -o Matrix -lm -lstdc++
	./Matrix

其中檔案名僅當範例,就不詳寫其內容

第二行會一次編譯(Compile)且組譯(assembly)多個cpp檔並輸出多個對應目的檔 (.o/.obj),第三行連結 (link)多個目的檔,成名為 Matrix的執行檔,第四行執行 Matrix

刪除多個目的檔

在makefile檔案寫上

clear:
	rm *.o

刪除多個目的檔

其他的說明可參考此網址

Linux

Linux常用指令

檔案或資料夾:A、B、C

檔案路徑

$ 指令功能
.當前資料夾
..當前資料夾的父目錄
cd進入檔案路徑
pwd查看當前路徑
/A/B檔案絕對路徑

查看檔案與資料夾

$ 指令功能
ls查看當前資料夾下的檔案和目錄
ls -F-F 可區分出檔案和資料夾
ls -F -R-R 加上資料夾底下的檔案
ls -a-a 顯示出隱藏與普通檔案
ls -l顯示詳細資訊,包含檔案的權限如:-rwxrw-r–
ls -l A查看特定檔案
file_na?e問號可代表一個字符
file_**可代表多個字符
cat查看檔案內容
cat A | grep “字元”“|”為管道,前後要空格; grep 可抓出包含字元的文字或檔案

檔案處理

$ 指令功能
touch建立檔案
cp A B複製命名為A來源檔案,成命名為B目標檔案
mv A B重新命名A檔案為B
mv A /B移動檔案到B路徑
rm移除檔案

-r 向下進入目錄

rm -r ==>向下進入目錄刪除檔案

目錄

$ 指令功能
mkdir Dir建立Dir目錄(資料夾)
mkdir -p A/B/C建立多個資料夾與子資料夾
rmdir刪除資料夾

極度危險指令

rm -rf == rm -RF // 循環刪除路徑下全部檔案

好用指令

| grep “字元” // “|”為管道,前後要空格; grep 可抓出包含字元的文字或檔案

Linux

Vim常用指令

檔案或資料夾:A、B、C

指令功能
vim A.txt編輯檔案

進入檔案後

不能編輯/ESC普通模式
i編輯模式

普通模式

移動游標

h
j
k
l
PageDown(Ctrl+F) 上一頁
PageUp(Ctrl+B) 下一頁
G最後一行
num G第num行
gg第一行

編輯內容

x刪除游標所在的字
dd刪除游標所在整行
dw刪除游標所在單字
d$刪除游標到行尾內容
u撤銷前一道編輯命令
a游標當前位置輸入
A游標所在的行尾輸入
p取回數據,像貼上
y複製
yw複製單字
y$複製到行尾
v游標所在位置可視化

查詢字串

/查詢字串

取代字串

:s/old/new/g游標所在行old字換成new字
:n,ms/old/new/gn、m行內old字換成new字
:%s/old/new/g全部old字換成new字
:%s/old/new/gc全部old字換成new字,每次都提示

命令模式

普通模式下輸入冒號+指令

q若未修改,退出
q!取消所有修改,退出
w A存到另一個檔案A
wq儲存並退出

C++學習筆記

C++指標與陣列

指標是用來指向記憶體位址的,可用*設指標變數跟取指向位址的值。&就是取變數記憶體位址。記著上述便可先初步理解指標作用與作法。

陣列位址

指標n跟陣列名稱v皆會指向陣列v的開頭位址,因此將指標指向陣列的開頭位址後,便可用*(n+i)、n[i]等跟矩陣v一樣的方式對陣列取值或設值(i為索引值)。

一維陣列

取值:*(v+i)=v[i]

陣列v圖示:

用法如下:

    int v[3]; // 設定陣列
    int *n=v; //設指標n指向陣列v的開頭v[0]位址
    // [] 為下標運算子
    n[2]=2; // 指標n指向的位址v[2]變數值設2
    printf("n[2]=%d\n", n[2]); // n[2]=2
    //可用a[b]=*(a+b)方式取用list
    *(n+1)=1; // *(n+1)會取出&v[1]位址,再用*取值
    *(v+0)=0; // 強制讓v轉形成&v[0]位址,再用*取值
    printf("v[0]=%d\n",v[0]); // v[0]=0
    printf("n[1]=%d\n", n[1]); // n[1]=1
    printf("v[1]=%d\n", v[1]); // v[1]=1

指標n指向陣列v的開頭位址,可直接用*取出n指向位址的值,n++會移動指標n指向的位址,用法如下:

    int v[5]={1,2,3,4,5}; // list
    int *n; // 宣告一個指標
    // 將指標指向list的開頭位址,n++會往下移動指標所指的位址
    for(n=v; n!=&v[5]; n++){ 
        printf("%d\n", *n); // 印出指標所指向的位址儲存的值
    }

二維陣列

指標指向位址:*(arr+i)+j

取值:*(*(arr+i)+j)=a[i][j]

二維陣列乘法(矩陣乘法)

程式碼:

    for (int i = 0; i < row; i++){
        for (int k = 0; k < col; k++){ // 先建立C矩陣
            C[i][k] = 0;
            for (int j = 0; j < mid; j++){ // A矩陣的直行、B矩陣的橫列
                C[i][k] = C[i][k] + A[i][j] * B[j][k];
            }
            printf("%d,    ", C[i][k]);
        }
        printf("\n");
    }

三維陣列

Machine learningPython

使用CNN對MNIST手寫數據集進行訓練(CPU或GPU運算)

電腦硬體

處理器(CPU):Intel® Core™ i5-10300H CPU @ 2.50GHz
顯示晶片(GPU):NVIDIA® GeForce GTX 1650 Ti

Python程式環境

  • Tensorflow-gpu-1.15.0
  • Keras 2.3.1

MNIST手寫數據集

mnist為手寫數字0-9的黑白圖片數據集。
圖片與對應標籤方面,數量為training data:55000筆,validation data:5000; 僅有圖片的test data:10000筆; 每張黑白圖片大小為[1,28,28,1](張,寬,長,通道),有784個像素(pixels),每個像素值都是數字0-255(0黑255白)。
標籤與圖片的手寫數字對應,如圖片內為手寫數字5,標籤就設5,0-9種手寫圖片就有10個標籤,可用list儲存,如圖片1,5,8,6,4對應標籤就是label=[1,5,8,6,4]

虛擬碼

  1. 下載mnist數據集,分成training data 跟test data
  2. 先處理圖片,將其轉換成列表形式,並透過標準化將所有像素值變成0-1之間
  3. 標籤處理成one hot encoding 形式
  4. 建立CNN網路
  5. 編譯模型
  6. 訓練模型
  7. 衡量模型訓練誤差

CNN網路架構

問題

因為下載的是Tensorflow-gpu-1.15.0,相對的版本使用Keras 2.3.1,若直接跑Keras寫的CNN程式碼,會產生以下錯誤(部份節錄)

Epoch 1/1
2020-08-14 18:01:49.576948: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2020-08-14 18:01:49.775817: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-08-14 18:01:50.056149: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
2020-08-14 18:01:50.062654: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
Traceback (most recent call last):
File “test.py", line 49, in
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1)
File “/home/leodflag5/.local/lib/python3.6/site-packages/keras/engine/training.py", line 1239, in fit
validation_freq=validation_freq)
File “/home/leodflag5/.local/lib/python3.6/site-packages/keras/engine/training_arrays.py", line 196, in fit_loop
outs = fit_function(ins_batch)
File “/home/leodflag5/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py", line 3476, in call
run_metadata=self.run_metadata)
File “/home/leodflag5/.local/lib/python3.6/site-packages/tensorflow_core/python/client/session.py", line 1472, in call
run_metadata_ptr)
tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
(0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
(1) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
[[{{node conv2d_1/convolution}}]]
[[metrics/accuracy/Identity/_91]]
0 successful operations.
0 derived errors ignored.

關閉GPU,使用CPU運算

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

使用GPU運算

import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
session=tf.InteractiveSession(config=config)

CPU運算時間

GPU 運算時間

大約差4倍,GPU還有使用CUDA加速運算

Ubuntu

Win10 灌 Ubuntu18.04 雙系統

電腦規格

  • 製造商:Acer
  • 型號:Nitro AN515-55
  • 處理器:Intel® Core™ i5-10300H CPU @ 2.50GHz
  • 顯示晶片:NVIDIA® GeForce GTX 1650 Ti
  • Windows 版本:Windows 10

一開始先灌Ubuntu20.04版本不成功,才改灌Ubuntu18.04,因此要注意電腦硬體跟軟體必須相互配合。(難怪5年以前的舊電腦灌Ubuntu16.04很合,升級成Ubuntu18.04很不合,用失敗經驗換成扎實的知識)

1.檢查BIOS

按Win+R跳出執行視窗,輸入msinfo32

系統摘要中的BIOS模式要是Ubuntu 18.04 支援的UEFI

在開始表單右鍵找到磁碟管理,點進去

雙系統的安裝方式有分在同硬碟和不同硬碟的,而我選擇後者。Windows 10 是放在C槽的256GB SSD,Ubuntu則灌在1TB HDD的D槽,因此按照表格從D槽切出4個不同的磁區,並進行格式化。這篇文章有提到在Windows 10 時切割磁區時的注意事項

Windows 磁碟名稱容量大小 (MB)
S:2048
E:500
R:116736
H:10240

切出來長這樣(但這是已經灌好Ubuntu 18.04的狀態,因此會跟剛切好的磁區狀態不一樣)

2.進入BIOS設定

按照此網站步驟

3.使用Rufus製作開機USB

參考此網站,USB容量大小32G就夠了

4.使用USB安裝Ubuntu 18.04

一路按到要灌的地方,選擇其他,之後按照下表設定並同時勾選格式化,這樣就不會把原本的windows 10 系統洗掉,而能在切好的磁碟上灌Ubuntu 18.04。(Ubuntu分割硬碟一般配置方式)

Windows 磁碟名稱分區容量大小 (MB)
分區類型
S:/swap2048交換空間主分區
E:EFI 500EFI系統分區邏輯分區
R:/116736Ext4日誌文件系統邏輯分區
H:/home10240Ext4日誌文件系統邏輯分區

整個灌好後就成功擁有雙系統電腦。重新開機時要在Logo出現前長按F12,就可以選擇要進入哪個系統

Ubuntu

Ubuntu 18.04+GPU驅動+CUDA10.0+cuDNN7.6.5+Tensorflow-gpu-1.15.0+Keras 2.3.1

1.安裝顯卡驅動程式

$ sudo add-apt-repository ppa:graphics-drivers
$ sudo apt update
$ ubuntu-drivers devices

通常選free recommended,但我選nvidia-driver-440下載

$ sudo apt-get install nvidia-driver-440
$ sudo reboot #重開機

查看是否有安裝成功

$ nvidia-smi
$ nvidia-settings

上述兩個皆顯示nvidia-driver-440安裝成功

2.安裝CUDA10.0

進入nvidia官網檢查可安裝的版本,這邊選擇CUDA10.0安裝

按照環境選
兩個都下載,執行下兩行指令

$ sudo sh cuda_10.0.130_410.48_linux.run # 下載時仔細看要求
$ sudo sh cuda_10.0.130.1_linux.run

安裝缺失的套件,若沒拍到就下載下列全部

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install –no-install-recommends libboost-all-dev
$ sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

設定CUDA10.0執行環境

$ sudo gedit ~/.bashrc # 會進入一個文件裡

在文件裡的最後複製貼上下面兩行,再用vim指令儲存文件

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

最後執行

$ source ~/.bashrc
$ sudo reboot #重開機

測試是否安裝成功,可進入CUDA Sample路徑執行 $ make命令

$ cd NVIDIA_CUDA-10.0_Samples/5_Simulations/fluidsGL
$ make clean && make
# 运行
$ ./fluidsGL
$ nvcc -V # 可看CUDA有無安裝成功

3.安裝cuDNN 7.6.5

進入cuDNN的下載頁面前,要先註冊,註冊完登入後就可進入此頁面

可看到跟CUDA 10.0配合的是cuDNN v7.6.5
選擇3個 Ubuntu18.04 (Deb) 檔案

$ sudo dpkg -i

測試 cuDNN 可否運行

$ cp -r /usr/src/cudnn_samples_v7/ $HOME # 複製測試檔到家目錄
$ cd $HOME/cudnn_samples_v7/mnistCUDNN # 進入路徑
$ make clean && make # 執行
$ ./mnistCUDNN # 執行後最後一行出現Test Passed表示cuDNN安裝成功

4.下載tensorflow_gpu-1.15.0

先到Tensorflow官網查看要下載的版本

查了CUDA 10.0+CUDNN 7.6+tensorflow_gpu的配置後看到這篇文章裡面的環境配置文章

$ pip install tensorflow-gpu==1.15.0 # 下載指定版本

在Python3.6環境下測試

from tensorflow.python.client import device_lib
import tensorflow as tf
print(device_lib.list_local_devices())
print(tf.test.is_built_with_cuda())

5.安裝Keras 2.3.1

pip install Keras==2.3.1