Linux遠程操控 | 機器學習 | 模擬雲計算 TensorFlow | 建構自己的雲計算平台

前言


現在網上有很多雲計算平台,你是不是也想擁有一個屬於自己的雲計算平台呢?
其實只要你手中有兩台電腦,你就能自己建構出一個雲計算平台,那其中的原理是什麽呢?
其實就是自己在一台電腦上做開發編程,然後將開發好的文件推送去雲端運算,就是就是基於遠程控制的原理



例如我有一部Mac,但我不想它進行AI模型訓練,因為需要消耗大量電腦資源。但Mac熒幕的確不錯,寫起代碼來眼睛舒服,可運算的時候肯定會有延遲,同時又想做其他東西,怎麼辦?此時,身邊若有一個計算能力強的 Linux,我們就可以把它變成一個雲計算平台!同時操作2部電腦!



如何建構Linux雲計算系統

首先需要強調一點,這套「遠程」操控的方法實際上並不是真正的遠程,只是在一個局域網內遠程操控電腦 (同一個路由器下)
如果你想是想人在家,卻要操控公司裡的 Linux,需要用到TeamViewer來簡單實現遠程操控
在家中或公司的同一個路由器下,我們則可以使用 VNC 或者 SSH 來實現遠程操控
想要把 Linux 建構成一個計算伺服器,我們要先學會如何遠程控制和連接Linux,可以選擇以下幾種方式:
底層 SSH遠程操控 (MacOS/Linux/Windows) 或者 桌面圖像化工具 VNC / TeamViewer 遠程操控



SSH遠程操控(MacOS/Linux)

使用SSH遠程能夠大大提升你的生產力,同時它也是一種加密的通信通道,可以保證你的電腦安全

給Linux安裝OpenSSH

首先需要確定你的 Linux 上有安裝了 SSH 服務,安裝這個開源的 SSH 工具:OpenSSH,可以把你的 Linux 變成一個伺服器

1
$ sudo apt-get install openssh-server

Mac或Linux SSH 連接去Linux

現在你的 Linux 已經是一個可以被 SSH 登入的狀態了,我們先從 MacOS 或者是你另一台 Linux 開始
因為 MacOS 和 Linux 是類似的系統,應用層面上相對比 Windows 簡單,具體操作也十分類似

1
$ ssh [被控制電腦的用戶名]@[被操控電腦的IP地址]

舉個例子,我要用 Mac 來操控的 Linux 的用戶名叫做 hkg,首先確保你操控和被操控的兩台電腦連接上了同一個路由器
然後在 被操控 電腦的 terminal 上輸入ifconfig獲取該電腦的 ip 地址

1
$ ifconfig

接著找到以 inet 開頭的字樣,這就是Linux在這個路由下的 ip 地址了,我現在的 ip 是 172.16.0.66

1
inet addr:172.16.0.66

找到 ip (172.16.0.66) 和用戶名 (hkg)後,回到主操控電腦的 terminal (Mac)。在 terminal 中輸入之前提到的 ssh 開頭的指令
然後它就會要求你輸入被操控的 Linux 的用戶密碼。當然,只有知道密碼的人才能登陸你的 Linux,否則就太容易被入侵了

1
2
$ ssh hkg@172.16.0.66
hkg@172.16.0.66's password:

確認密碼後,你在操控電腦(Mac)的 terminal 就會變成被操控電腦(Linux)的 terminal了
他會顯示以下信息證明你登入成功,現在你就能自由的運用之前所學的Linux指令 ,在你的電腦上遠程操控 Linux 電腦了

1
2
3
4
5
6
7
8
9
10
11
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.18.0-25-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

7 packages can be updated.
0 updates are security updates.

Last login: Tue Jul 30 10:31:10 2019 from 172.16.0.78
hkg@gt2080tiAI:~$

省略密碼直接登入

現在你每一次使用 SSH 登入 Linux,它都要求你輸入密碼,比較麻煩。我們可以使用public/private rsa key (公鑰和私鑰) 功能省略密碼

原理是在 Mac 或者 Linux (控制電腦) 上生成一個 public/private keypair,然後將公鑰(public key) 複製到要被遠程的 Linux 上
這樣當你有私鑰的控制電腦要遠程操控這台有公鑰的 Linux,他就能識別你的身份並且幫你配對,而無需輸入密碼了

打開Terminal輸入指令 ssh-keygen 創建公鑰和私鑰,它會提示你要保存的地方,使用默認的地點,按Enter確定就好

1
2
3
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/icthk/.ssh/id_rsa):

確定之後,它會問你是否想要一個保障密碼。如果你確定你的局域網是安全的,這個都可以不填,我也沒填,直接Enter

1
Enter passphrase (empty for no passphrase):

然後它會要求你再次確認,Enter。

1
Enter same passphrase again:

最後,它會顯示以下的畫面,代表著你的密鑰已經生成好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your identification has been saved in /Users/icthk/.ssh/id_rsa.
Your public key has been saved in /Users/icthk/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5Rs2ScEt3EZXyOx6MHtIvbjm+MPP6UsnDOaCHDSE9dg icthk@Kende-MacBook-Pro.local
The key's randomart image is:
+---[RSA 2048]----+
| ooo.+.o.o.|
| .. ++.+.+ |
| + Eo o |
| . = .+ o |
| S *.oB . |
| . + *=o+ |
| o o..++ .|
| o=o + |
| .+o+*. |
+----[SHA256]-----+

接著,我們把這個生成好的「公鑰」給複製去 被控制的 Linux,指令結構和上面一樣 $ ssh-copy-id [被控制的用户名]@[它的ip]

1
2
3
4
5
6
$ ssh-copy-id hkg@172.16.0.66

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/icthk/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hkg@172.16.0.66's password:

輸入正確密碼後,會出現以下會面,告訴如何用 SSH 登入被控制端的電腦。然後,你就可以直接無需密碼登入遠端Linux了

1
2
3
4
Number of key(s) added:        1

Now try logging into the machine, with: "ssh 'hkg@172.16.0.66'"
and check to make sure that only the key(s) you wanted were added.



SSH遠程操控(Windows)

下載PuTTY SSH軟件

在 Windows 上,SSH 不像 Linux 和 MacOS 那樣常用,而且 Windows 系統所使用內核也和 Linux 不太一樣
所以我們要通過軟件來實現 SSH (相對容易)。 PuTTY(按我下載)是一個開源、免費、而且常被使用的 SSH 軟件

根據電腦配置安裝好之後,並打開 PuTTY,你會看到下面的畫面,到「Host name (or IP address)」選項填上被控制的 Linux 的 IP
獲取被控制 Linux IP 的方法就是在這台 Linux 的 terminal 上輸入:

1
$ ifconfig

然後到找和 inet addr 有關的那一串 IP 地址,然後輸入 IP 地址到 PuTTY 的 「Host name (or IP address)」位置

點擊 Open 按鈕,它會讓你輸入 Linux 的用戶密碼作為確認,然後你就可以開始在 Windows 上操控 Linux了


桌面圖像化工具 遠程操控

VNC 或者 Teamviewer 工具則是提供一個可以圖像化桌面的方式來遠程操控電腦,你可以直接在Mac/Windows上操控著Linux的畫面

Teamviewer

Teamviewer 是通過互聯網(外網),將你的被控制電腦桌面投影到你的控制電腦上,畫面的流暢度和速度則取決於你的網速和電腦性能
如果你只需要控制局域網內的電腦,當然VNC 快一點,因為它不走外網。當然,最快的還是 SSH ,因為不用輸出圖像,用指令控制


VNC

其實VNC (Virtual Network Computing) 是一種應用的統稱,只要你的Linux架設好了一個伺服器的 VNC
再通過任何裝備的 VNC 客戶端軟件就能連上伺服器端的電腦了。接下來我們來設置一下吧,打開你的 Linux Terminal,輸入:

1
$ sudo apt-get install x11vnc

然後設置 x11vnc 密碼,因為我們需要用密碼登入 Linux 的 VNC server

1
2
3
4
5
6
$ x11vnc -storepasswd

Enter VNC password:
Verify password:
Write password to /home/icthk/.vnc/passwd? [y]/n y
Password written to: /home/icthk/.vnc/passwd

設置好之後,在你的 Linux terminal 中輸入以下指令,要求用密碼形式來開啟 VNC 的 server,然後我們就介紹如何接入VNC吧

1
$ x11vnc -usepw

最後如果出現頻繁中斷x11vnc的現象,你可以在開啟 x11vnc 的時候輸入這個參數,讓它永遠運行,方便外部連接

1
$ x11vnc -usepw -forever



Mac連接VNC

Mac用戶可以直接使用內置軟件 Screen Sharing 來連接VNC,輸入Linux的 IP地址,再輸入剛剛設置的 VNC 密碼就能連上,十分方便



Windows連接VNC

由於我們已經在Linux端設置好了一個 VNC 伺服器,在 Windows端,我們需要的只是一個 VNC 客戶端,推薦大家使用RealVNC
RealVNC則提供以上2種選擇,而我們現階段只需要客戶端VNC就好,所以下載VNC Viewer吧

客戶端的 VNC 操作流程都很簡單. 只要求要一個 server 端的 IP 和他的密碼就好,方法與Mac大同小異

Linux連接VNC

Linux也有一款自帶的VNC 軟件,只需要搜索 「VNC」就看到了,運行它,輸入 server 端的 IP 和密碼就可以連接了



使用自己的雲計算輔助機器學習

終於來到重點了,眾所周知,在實現機器學習時,我們需要電腦進行數據分析,在訓練模型時,往往都十分考驗機器的配置
我手上有一台Mac,還有一台性能較好的Linux,那麼我就可以把訓練模型的這一步推到雲端伺服器(就是我的Linux)上執行
這樣一來,就減輕了我的Mac負擔,因為我同時也能在Mac上進行代碼修改,甚至其他的活動,下面簡單展示一下

SSH連接Linux

來看看實際操作吧,首先利用SSH連接遠端,可以看到我的Mac已經連上了遠端的Linux主機
Terminal名字也變成了Linux機的名字(hkg@gt2080ti-AI),打開顯示卡配置可以看到是Linux配置,一張RTX 2080ti


scp 推送文件至Linux

現在我已經準備好訓練文件了,接下來,另開一個新的Terminal,便可以透過scp指令把資料夾全數推送至Linux
下面指令分別演示了如何把自己桌面上的 Object_detection.py 文件和 Tensorflow文件夾 推送到 遠端Linux的桌面上

1
$ scp ~/Desktop/Object_detection.py hkg@172.16.0.66:~/Desktop

推送文件夾則需要在scp後加上 -r 參數

1
$ scp -r ~/Desktop/Tensorflow hkg@172.16.0.66:~/Desktop

那麼就看看我的實際操作吧!注意!以上指令需要在本地電腦的Terminal上執行!而非連接遠程後的Terminal!
第一次推送TensorFlow文件因文件太大需時較久,之後我們可以推送個別文件或直接在Linux用nano指令編輯代碼,以提升效率



在伺服器上訓練模型(運行文件)

當資料夾都推送至伺服器時,我們便可以在伺服器(Linux)上運行文件,開始進行AI模型訓練了
一般有2種方法,第一種是直接在本地Terminal執行相應代碼,第二種是遠程操控Linux Terminal執行代碼(推薦)

第一種方法:無需先連接遠端電腦,但指令較複雜,且無法建構遠端環境(適用於較簡單的文件運行)

1
2
3
4
示範1:在Mac Terminal運行Linux桌面的a.py文件
$ ssh hkg@172.16.0.66 "python3 ~/Desktop/a.py"
示範2:正式訓練模型代碼:
$ ssh hkg@172.16.0.66 "python3 ~/Desktop/Tensorflow/workspace/training_demo/train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/ssd_inception_v2_coco.config"

第二種方法:簡單,先連接遠端電腦,然後執行相關指令,能有效監測運行環境(機器學習推薦使用)


模型開始在Linux伺服器上訓練了,而我的Mac也不用「發光發熱」了


還可以建立VNC連接,使用瀏覽器Tensorboard監測訓練進程


回傳模型至本機(文件回傳)

當AI模型訓練完成時,我們便可再次使用scp 指令, 把相應文件傳回本機Mac進行執行,因為需要可視化的物件識別功能
然後可以另開Mac的Terminal運行指令(利用已建立的Mac->Linux通訊,把整個training資料夾傳回來)

1
2
傳送文件夾需要加上 -r 參數,以下代碼是把Linux桌面的b文件夾 傳回Mac的桌面
$ scp -r hkg@172.16.0.66:~/Desktop/b ~/Desktop
實際情況展示,由於我太懶,所以直接把整個training文件夾回傳了

如果還在Linux的Terminal中,想直接從Linux回傳也是可以的,此方法需建立Linux->Mac的通訊)

1
scp -r training icthk@172.16.0.64:~/Desktop



在Mac上運行物件識別程式

接下來,我們就可以導入訓練後模型至Object Detection的文件夾內,以及設置進行配置(有興趣請到AI系列觀看)
然後就直接運行物件識別程式看看吧,結果就是利用我們Linux伺服器上訓練的模型所識別出的結果了!準確率表現不俗!

文章作者: icthk
文章鏈接: https://icthk.github.io/6_Linux_Remote_Control.html
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 ICTHK Blog