普元雲計算-一塊兒來DIY一我的工智能實驗室吧

轉載本文需註明出處:微信公衆號EAWorld,違者必究。html

目錄:node

 

1、DIY一個AI實驗室:原材料的選擇python

2、搭建「單機版」的AI實驗室git

3、搭建「高階版」的AI實驗室github

 

1、DIY一個AI實驗室:原材料的選擇

 

咱們的AI入門課程已經講過兩篇了,前面咱們講了AI的概念、算法、工具等內容,第三篇咱們會介紹一些實際操做的內容。俗話說,工欲善其事,必先利其器,本文咱們將告訴你們如何搭建一個AI實驗室,並穿插一些小Demo,爲後面的AI學習實踐作好準備。算法

如今可供選擇的AI開發框架不少,推薦你們從Tensorflow開始上手,緣由後面會說。另外,在「高階版」的AI實驗室中,咱們使用了Kubernetes + Docker作分佈式訓練的運行環境,因此推薦各位同窗使用64位的Ubuntu 16.04或更高版本的操做系統。若是隻是想玩玩「單機版」,那也可使用Windows和Mac,操做過程和Ubuntu差異不大。docker

 

AI實踐確定要寫程序,各位同窗確定都有本身喜歡的IDE或者編輯器,可是編寫AI程序,和編寫其餘程序有個很大的區別,那就是這些程序都須要實時的輸出一些圖表以供調試或者查看運行結果,咱們以前用的大多數開發工具都沒有這個能力,因此如今你們都用Jupyter Notebook來作AI程序、尤爲是機器學習程序的開發。shell

 

綜上,咱們將使用Tensorflow、Kubernetes和Jupyter Notebook作AI實驗室的「原材料」,下面咱們分別說下選型依據。瀏覽器

 

1. 爲何使用Tensorflow作開發框架:安全

2. 爲何使用Kubernetes作AI實驗室的基礎運行環境:

 

3. 爲何使用Jupyter Notebook作開發工具:

2、搭建「單機版」的AI實驗室

 

搭建「單機版」的AI實驗室很是簡單,只要三步便可:

 

    • 安裝Python和Virtualenv,這裏咱們使用Python3:
      sudo apt-get install python3-pip python3-dev python-virtualenv

    • 建立並激活Virtualenv環境(工做目錄名爲AILab,也能夠換個本身喜歡的名字):
      virtualenv --system-site-packages -p python3 AILab
      source AILab/bin/activate

    • 安裝Tensorflow和Jupyter Notebook,以及用來調試Tensorflow程序的Tensorboard插件:
      pip3 install tensorflow
      pip3 install jupyter
      pip3 install jupyter-tensorboard

這裏咱們使用了Virtualenv,以避免搞亂潔癖碼農的Python環境。上述步驟完成後,在Virtualenv的提示符下執行:

 

(AILab)$ jupyter notebook

便可啓動Jupyter Notebook

 

若是有同窗須要使用GPU,那麼還須要安裝NVIDIA的CUDA工具包、cuDNN和分析工具接口,會比較麻煩。

 

有須要的同窗能夠參考連接:

https://www.tensorflow.org/install

 

須要在Mac和Windows上安裝Tensorflow或者安裝過程當中遇到疑難雜症的同窗也能夠查詢該連接。關於Jupyter Notebook和Tensorboard插件的問題。

 

能夠查詢連接:

http://jupyter.readthedocs.io/en/latest/install.html   

https://github.com/lspvic/jupyter_tensorboard

 

如今打開jupyter notebook命令輸出中的連接,就能夠瀏覽器裏編寫Tensorflow程序了。爲了儘快上手,咱們先跳過Tensorflow的基礎概念,直接運行一個來自  https://github.com/sankit1/cv-tricks.com  的小Demo。

 

首先咱們點擊Jupyter Notebook Files標籤頁右上角的New按鈕建立一個Python 3 記事本。Jupyter Notebook支持以「!」開頭運行本地命令,寫好命令,選中灰色的編輯框(Jupyter Notebook稱其爲Cell),點擊工具欄的Run按鈕便可執行。咱們首先取出cv-tricks的代碼,再安裝opencv、sklearn、scipy等三個數學工具包。

而後咱們再回到Files標籤頁,打開路徑爲cv-tricks.com/Tensorflow-tutorials/tutorial-2-image-classifier/train.py的Python文件。

 

因爲這種打開方式是不能運行代碼的,因此咱們再建立一個Python 3記事本,把train.py的文件內容複製過來,而後執行。

 

相信此時必定有好學的同窗到cv-tricks的GitHub裏去看了,可能有人會發現裏面有training_data和testing_data兩個目錄,裏面有不少貓貓狗狗的照片,實際上train.py在作的事情就是建立一個卷積神經網絡,而後讀入training_data目錄下的貓狗照片進行如何區分貓狗的訓練。

 

經過程序的輸出咱們能夠看到識別的準確度從最開始的50%逐步上升、直至收斂。50%的準確度即爲瞎猜,這個輸出很直觀的展示了機器學習的過程。

 

這個程序須要跑上一段時間,根據機器的性能不一樣和室內溫度,半小時到一小時都有可能,同窗們在本身進行實驗的時候請耐心等待。另外,GitHub上的代碼有個小bug,這裏故意不說,相信細心的同窗都能知道如何修改。

 

程序運行過程當中會生成幾個文件,就是Tensorflow的模型文件,裏面存儲的就是訓練好的神經網絡,後面就用這些文件去區分貓狗。

 

等訓練結束以後,咱們能夠用predict.py加載這個模型,用它識別一些網上找來的貓狗圖片。

識別效果還算能夠,若是有同窗在本身的測試裏發現識別出錯,那也很正常,畢竟這只是一個很簡單的Demo,訓練數據不多,訓練時間也很短,準確率作不到過高。

如今咱們的第一個AI程序就跑起來了,「單機版」的AI實驗室建設完畢。

 

3、搭建「高階版」的AI實驗室

接下來纔是本文的重頭戲——AI實驗室的「高階版」。

 

正如前文所述,AI實驗室的「高階版」是一個分佈式訓練環境,一來能夠進行多機並行訓練以提升訓練速度,二來能夠經過多租戶方式集約化的使用資源,適合學校、企業中的小團隊一塊兒使用。

 

「高階版」的AI實驗室底層使用了Kubernetes和Docker,咱們公衆號的老朋友應該對這兩個東西都比較瞭解,若是有同窗不瞭解那也不要緊,暫且把它們看成一個支撐Tensorflow分佈訓練的資源調度器就好。總體架構見下圖:

說到這裏,咱們須要介紹一下和Tensorflow分佈式訓練有關的一些概念,首先是兩種訓練方式——數據並行和模型並行:

 

其次數據並行又分爲同步數據並行和異步數據並行:

 

現階段咱們推薦使用同步數據並行方式,因此各位同窗暫且對其餘三個概念有些印象便可,之後碰到的時候再深刻研究也不遲。

 

接下來介紹搭建「高階版」AI實驗室的步驟,要比「單機版」複雜很多。首先須要準備幾臺服務器,並在各服務器上安裝64位的Ubuntu 16.04或更高版本。

 

若是隻有一臺服務器那也不要緊,本課程介紹的方法有一個很大的優點就是可擴展性,能夠先一臺服務器湊合用,等之後富裕了、服務器多了,再添加進來也很容易。可是安裝後必定要注意如下三點:

 

  • 各服務器的Hostname、MAC地址和product_uuid(/sys/class/dmi/id/product_uuid)要惟一。

  • 各服務都要關閉Swap,方法是在/etc/fstab中將Swap行註釋掉。

  • 各服務器都要關閉防火牆,方法是執行ufw disable命令。

 

而後各服務器重啓,使上述修改生效。

 

準備工做完成後便可開始安裝Docker和Kubernetes的集羣部署工具Kubeadm,每臺服務器上都要裝,分爲三步:

 

1. 添加來自Google的安裝源:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

 

2. 刷新安裝源並安裝必要工具:
apt-get update
apt-get install -y apt-transport-https curl

 

3. 安裝Docker和Kubeadm:
apt-get install -y docker.io kubeadm kubelet kubectl

 

接下來是初始化管理節點,選一臺你最喜歡的服務器完成如下步驟,若是你只有一臺服務器,那這臺就既作管理節點也作工做節點。

 

1. 執行命令kubeadm init --pod-network-cidr=10.244.0.0/16,該命令的執行過程當中會下載幾個Docker鏡像,時間可能會比較久,等看到「Your Kubernetes master has initialized successfully!」輸出後,就說明命令執行成功。執行過程當中可能會遇到「你懂的」問題,哎,沒辦法,作IT就是這樣舉步維艱,咱們後面看看能不能在國內作個鏡像庫,爲各位同窗提供便利。

 

2. 步驟1完成後,若是你使用的是非root用戶,那麼須要執行如下三行命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
若是你使用的是root用戶,則須要設置環境變量:
export KUBECONFIG=/etc/kubernetes/admin.conf
爲了往後方便,能夠將該環境變量添加到shell的profile中。

 

3. 接下來安裝Kubernetes的網絡虛擬化add-on,這裏咱們使用的是Flannel,安裝方法是:

 

a) 首先修改一個網絡參數,執行命令sysctl net.bridge.bridge-nf-call-iptables=1,並將其添加到/etc/sysctl.conf文件中。

b) 安裝Kubernetes的網絡虛擬化add-on,執行命令:
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml


過程當中仍是會遇到「你懂的」問題……

 

上述步驟完成以後,管理節點就初始化成功了,若是有同窗以爲單獨用一臺服務器作管理節點有點浪費,或者是有同窗只有一臺服務器,既要作管理節點又要作工做節點,那麼請執行命令:kubectl taint nodes --all node-role.kubernetes.io/master-。

 

接下來要作的就是添加工做節點了,剛纔執行kubeadm init命令的時候輸出裏有一行內容相似於:


kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>


把這行復制到其餘服務器上用root用戶執行,便可將這臺服務器做爲工做節點添加到集羣之中,只有一臺服務器的同窗能夠等富裕了以後再執行。

 

到此一個Kubernetes集羣就完成了,若是有同窗在操做過程當中遇到疑難雜症。

 

請查詢連接:

https://kubernetes.io/docs/tasks/tools/install-kubeadm/ 

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

 

接下來要作的就是安裝Kubeflow了,還記得這個是什麼嗎?前文提過,Kubeflow就是Google提供的整合Kubernetes和Tensorflow的一站式AI開源方案。因爲Kubeflow使用了ksonnet做爲部署工具,因此咱們首先要到https://ksonnet.io/#get-started下載ksonnet的命令行工具。這裏順便提一句,ksonnet是個很是強大的工具,也比較複雜,感興趣的同窗能夠查看他們的官網探明究竟,這裏咱們就不展開講解了。

 

如今咱們開始配置kubeflow,步驟比較多。

 

  • 初始化工做目錄,目錄名爲AILab_Advanced,執行命令:

         ks init AILab_Advanced

  • 建立配置文件模板,須要如下步驟:

  1. 切換工做目錄,執行命令:cd AILab_Advanced

  2. 下載基本配置文件,執行如下命令:
    VERSION=v0.1.2
    ks registry add kubeflow \
    github.com/kubeflow/kubeflow/tree/${VERSION}/kubeflow
    ks pkg install kubeflow/core@${VERSION}
    ks pkg install kubeflow/tf-serving@${VERSION}
    ks pkg install kubeflow/tf-job@${VERSION}
    這裏咱們使用的是0.1.2版本,過段時間會發布0.2版本,各位同窗能夠根據須要修改VERSION變量的值。

  3. 建立配置文件模板,執行命令:
    ks generate core kubeflow-core --name=kubeflow-core

  • 建立Kubeflow基礎服務,須要的步驟:

 

  1. 建立名爲AILab的運行環境,執行命令:

    ks env add AILab

  2. 建立名爲AILab的租戶,執行命令:

    kubectl create namespace AILab

  3. 建立kubeflow基礎服務,執行如下命令:

    ks env set AILab --namespace AILab

    ks apply AILab -c kubeflow-core

建立過程當中依然須要下載幾個Docker鏡像,各位同窗在操做過程當中請耐心等待。

 

上述步驟執行完畢後,AI實驗室的」高階版」就基本完工了,能夠經過瀏覽器使用,訪問前須要映射一下端口,執行下面兩條命令:

 

PODNAME=`kubectl get pods --namespace=AILab --selector="app=tf-hub" \

--output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`

kubectl port-forward --namespace=AILab $PODNAME 8000:8000

 

而後就能夠經過8000端口訪問了,首頁以下圖:

 

由於這裏沒有啓用安全模式,因此用戶名和密碼能夠隨便填。AI實驗室的「高階版」是支持多用戶的,會爲不一樣的用戶名啓動獨立的實驗環境,登陸後的效果以下圖:

 

點擊Start My Server按鈕便可啓動本身的Jupyter Notebook:

 

這裏能夠選擇你喜歡的Tensorflow版本,並填寫所需的資源參數。這些鏡像都比較大,下載的時間會比較久。

因爲首次啓動須要下載鏡像,若是網絡環境很差,這一步極可能會超時失敗,可是後臺的鏡像下載不會中斷,等下載完成,再去啓動Jupyter Notebook就很快了。此時會出現咱們熟悉的Jupyter Notebook首頁:

 

如今咱們就能夠像在「單機版」裏那樣編寫代碼了。每一個Jupyter Notebook都運行在一個獨立的Docker容器中,用戶之間不會互相干擾,還能夠經過New按鈕建立一個Terminal,登錄到容器內部操做。

前面稍微展現了一下如何使用這個「多租戶」的Jupyter Notebook,接下來開始介紹如何發起Tensorflow的分佈式訓練。Kubeflow提供了一個分佈式訓練的發起頁面,在該頁面填寫訓練名稱、鏡像地址、入口程序、所需資源和節點數等參數便可發起訓練,以下圖所示:

 

發起訓練以後還能夠經過Web頁面查看運行狀態,在這個頁面中能夠看到kubeflow經過鏡像建立了一系列的容器,每一個容器即爲訓練集羣的一個節點。

 

這裏使用了一個Google提供的測試鏡像,咱們也能夠本身製做鏡像,只須要在「多租戶」的Jupyter Notebook裏把程序調試好,而後把該Jupyter Notebook所在的容器保存成一個Docker鏡像便可。

 

另外須要注意的是,在編寫Tensorflow程序的時候,也須要爲分佈式環境作一些適配。Tensorflow使用一個名爲tf.train.ClusterSpec的constructor描述訓練集羣結構,因爲在「高階版」的AI實驗室中,集羣結構是在發起分佈式訓練的時候動態設置的,因此就不能像之前那也寫死在代碼裏,須要對代碼作一些修改,以下圖所示:

 

這裏的關鍵是名爲TF_CONFIG的環境變量,kubeflow裏有個有個名爲tf-operator的組件,能夠把它當成一個Tensorflow和Kubernetes之間的適配器,它的做用之一就是在發起分佈式訓練時將集羣結構寫到TF_CONFIG這個環境變量裏,訓練集羣的每一個節點裏都會寫,而後就能夠在程序中經過讀取這個變量來動態配置集羣結構了。

 

各位同窗能夠參考連接:

 

https://github.com/kubeflow/tf-operator/blob/master/examples/tf_sample/tf_sample/tf_smoke.py

 

中的實例代碼,試着把前面「單機版」的貓狗識別程序改爲分佈式,成功後必定會頗有成就感。

 

到此「高階版」的AI實驗室就介紹完畢了,必定有同窗會以爲這個實驗室比較簡陋。確實如此,一來是kubeflow還處於很是早期的開發階段,二來是一個完善的AI實驗室還須要在kubeflow之上作不少產品化工做。

 

我司目前也在作這方面的工做,計劃把AI實驗室和我司的雲平臺產品整合起來,造成一個AI實驗室雲服務,整體架構以下圖所示:

並在此之上構建AI生態:

 

 

 關於做者:宋瀟男,現任普元雲計算架構師,曾在華爲負責雲計算產品與解決方案的規劃和管理工做。曾負責國家電網第一代雲資源管理平臺以及中國銀聯基於OpenStack的金融雲的技術方案、架構設計和技術原型工做。

相關文章
相關標籤/搜索