[譯] IBM 工程師的 TensorFlow 入門指北

JohnJiangLA發表於2019-03-04

IBM 工程師的 TensorFlow 入門指北

在機器學習的世界中, tensor 是指數學模型中用來描述神經網路的多維陣列。換句話說,一個 tensor 通常是一個廣義上的高維矩陣或者向量。

通過使用矩陣的秩來顯示維數的簡單方法,tensor 能夠將複雜的 n 維向量和超形狀表示成 n 維陣列。Tensor 有兩個屬性:資料型別和形狀。

關於 TensorFlow

TensorFlow 是一個開源的深度學習框架,它基於 Apache 2.0 許可釋出於 2015年底。從那時起,它就成為世界上最廣泛採用的深度學習框架之一(由 Github 上基於它的專案數量得出)。

TensorFlow 源自 Google DistBelief,它是由 Google Brain 專案組開發並所有的深度學習系統。Google 從零開始設計它,用於分散式處理,並在 Google 產品資料中心中以最佳模式執行在定製的應用專用積體電路(ASIC)上,這種積體電路通常也被叫做 Tensor Processing Unit(TPU)。這種設計能夠開發出有效的深度學習應用。

這個框架能夠執行在 CPU、 GPU 或者 TPU 上,可以在伺服器、桌上型電腦或者移動裝置上使用。開發者可以在不同的作業系統和平臺上部署 TensorFlow,而且不論是在本地環境還是雲上。許多開發者會認為,相比類似的深度學習框架(比如 Torch 和 Theano,它們也支援硬體加速技術並被學術界廣泛使用),TensorFlow 能夠更好地支援分散式處理,並且在商業應用中擁有更高靈活性和效能表現。

深度學習神經網路通常是由多個層組成。它們使用多維陣列在層之間傳遞資料或執行操作。一個 tensor 在神經網路的各層之間“流動”(Flow)。因此,命名為 TensorFlow。

TensorFlow 使用的主要程式語言是 Python。為 C++、 Java® 語言和 Go 提供了可用但不保證穩定性的的應用程式介面(API),同樣也有很多為 C#,Haskell, Julia,Rust,Ruby,Scala,R 甚至是 PHP 設計的第三方的繫結。Google 近來發布了一個為移動裝置優化的 TensorFlow-Lite 庫,以使 TensorFlow 應用程式能在 Android 上執行。

這個教程提供了 TensorFlow 系統的概述,包括框架的優點,支援的平臺,安裝的注意事項以及支援的語言和繫結。

TensorFlow 的優勢

TensorFlow 為開發者提供了很多的好處:

  • 計算流圖模型。TensorFlow使用名為有向圖的資料流圖來表示計算模型。這讓開發者能夠簡易直接的使用原生工具檢視神經網路層間發生了什麼,並能夠互動式地調整引數和配置來完善他們的神經網路結構。
  • 簡單易用的 API。Python 開發者既可以使用 TensorFlow 原生的底層 API 介面或者核心 API 來開發他們自己的模型,也可以使用高階 API 庫來構建內建模型。TensorFlow 有很多內建和社群的庫,它也可以覆蓋更高階的深度學習框架比如 Keras 上充當一個高階 API。
  • 靈活的架構。使用 TensorFlow 的一個主要有點是它具有模組化,可擴充套件和靈活的設計。開發者只需更改很少的一些程式碼,就可以輕鬆地 CPU, GPU 或 TPU 處理器之間轉換模型。儘管最初是為了大規模分散式訓練和推測而設計的,開發者也可以使用 TensorFlow 來嘗試其他機器學習模型和現有模型的系統優化。
  • 分散式處理。Google 從零設計了 TensorFlow,目的是讓它能在定製的 ASIC TPU 上分散式執行。另外,TensorFlow 可以在多種 NVIDIA GPU 核心上執行。開發人員能夠充分利用基於 Intel Xeon 和 Xeon Phi 的 X64 CPU 架構或者基於 ARM64 的CPU 架構的優勢。TensorFlow 可以在多架構和多核心繫統上像在分散式程式中一樣執行,它能將計算密集型程式當做生產任務移交。開發者能夠建立 TensorFlow 叢集。並將這些計算流圖分發到這些叢集中進行訓練。Tensor 可以同步或非同步執行分散式訓練,既可以在流圖內部,也可以跨流圖進行,並且可以在網路計算節點間共享記憶體中的公共資料。
  • 執行效能。效能通常是一個有爭議的話題,但是大部分開發者都明白,任何深度學習框架都依賴於底層硬體,才能達到最優化執行,以低能耗實現高效能。通常,任何框架在其原生開發平臺都應該實現最佳優化。TensorFlow 在 Google TPU 上表現良好,但更令人高興的是,不管是在伺服器和桌上型電腦上,還是在嵌入式系統和移動裝置上,它都能在各種平臺上達到高效能。該框架同樣還支援了各種程式語言,數量令人驚訝。儘管另一個框架在原生環境(比如 在 IBM 平臺上執行的 IBM Watson®)上執行有時可能會勝過 TensorFlow,但它仍然是開發人員的最愛,因為人工只能專案會跨越平臺和程式語言,並以多樣的終端應用為設計目標,並且所有這些都需要生成一致的結果。

TensorFlow 應用

本節將介紹 TensorFlow 擅長的應用程式。顯然,由於 Google 使用其專有版本的 TensorFlow 開發文字和語音搜尋,語言翻譯,和影象搜尋的應用程式,因此 TensorFlow 的的主要優勢在於分類和推測。例如,Google 在 TensorFlow 中應用 RankBrain(Google 的搜尋結果排名引擎)。

TensorFlow 可用於優化語音識別和語音合成,比如區分多重聲音或者在高噪背景下過濾噪聲提取語音,在文字生成語音過程中模擬語音模式以獲得更自然的語音。另外,它能夠處理不同語言中的句型結構以生成更好的翻譯效果。它也同樣能被用於影象和視訊識別以及物件、地標、人物、情緒、或活動的分類。這帶來了影象和視訊搜尋的重大改進。

因為其靈活,可擴充套件和模組化的設計,TensorFlow 不會限制開發人員使用特定的模型或者應用。開發者使用 TensorFlow 不僅實現了機器學習和深度學習演算法,還實現了統計和通用計算模型。有關應用程式和社群模型的更多資訊請檢視使用 TensorFlow

哪些平臺支援 TensorFlow?

各種只要支援 Python 開發環境的平臺就能支援 TensorFlow。但是,要接入一個受支援的 GPU,TensorFlow 需要依賴其他的軟體,比如 NVIDIA CUDA 工具包和 cuDNN。為 TensorFlow(1.3 版本)預構建的 Python 二進位制檔案(當前釋出)可用於下表中列出的作業系統。

支援 TensorFlow 的作業系統

注意: 在 Ubuntu 或 Windows 上獲得 GPU 加速支援需要 CUDA 工具包 8.0 和 cuDNN 6 或更高版本,以及一塊能夠相容這個版本的工具包和 CUDA Computer Capability 3.0 或更高版本的 GPU 卡。macOS 上 1.2 版本以上的 TensorFlow 不再支援 GPU 加速。

詳情請參考安裝 TensorFlow

從原始碼構建 TensorFlow

官方使用 Bazel 在 Ubuntu 和 macOS 構建 TensorFlow。在 Windows 系統下使用 Windows 版本 Bazel 或者 Windows 版 CMake 構建現在還在試驗過程中,檢視 從原始碼構建 TensorFlow

IBM 在 S822LC 高效能運算系統上使用 NVIDIA NVLink 連線線連線兩塊 POWER8 處理器和四塊 NVIDIA Tesla P100 GPU 以使 PowerAI 適合進行深度學習。開發者能夠在執行 OpenPOWER Linux 的 IBM Power System 上構建 TensorFlow。要了解更多資訊可以檢視深度學習在 OpenPOWER 上: 在 OpenPOWER Linux 系統上構建 TensorFlow

很多社群或供應商支援的構建程式也可用。

TensorFlow 怎樣使用硬體加速?

為了支援在更廣泛的處理器和非處理器架構上使用 TensorFlow,Google 為供應商提供了一個新的抽象介面,實現用於加速線性代數(XLA)的新硬體後端,XLA 是一個專為線性代數計算的特定領域編譯器,它可以用於優化 TensorFlow 計算過程。

CPU

當前,由於 XLA 還是實驗性的,TensorFlow 還是在 X64 和 ARM64 CPU 架構上受支援,被測試和構建。在 CPU 架構上,TensorFlow 通過使用向量處理擴充套件來實現加速線性代數計算。

以 Intel CPU 為中心的 HPC 體系結構(如 Intel Xeon 和 Xeon Phi 系列)通過使用 Intel 數學核心函式庫來實現深度神經網路基元,從而獲得加速線性代數計算。Intel 也提供了擁有優化線性代數庫的預構建的 Python 優化發行版。

其他供應商,例如 Synopsys 和 CEVA,使用對映和分析器程式轉換 TensorFlow 流圖和生成優化程式碼在他們的平臺上執行。開發者在使用這種途徑時需要移植,分析並調整結果程式碼。

GPU

TensorFlow 支援特定的 NVIDIA GPU ,這些 GPU 能夠相容相關版本的 CUDA 工具包並符合相關的效能標準。儘管一些社群努力在 OpenCL 1.2 相容的 GPU (比如 AMD 的)上執行 TensorFlow,OpenCL 支援仍是一個正在計劃建設的專案,

TPU

據 Google 稱,基於 TPU 的流圖比 CPU 或 GPU 上執行效能好 15-30 倍,並且非常節能。Google 將 TPU 設計成一個外部加速器,可以插入序列 ATA 硬碟插槽,並通過 PCI Express Gen3 x16 介面連線主機,從而實現高頻寬吞吐。

Google TPU 是矩陣處理器而不是向量處理器,並且神經網路不需要高精度的數學運算,而是使用大規模並行的低精度整數運算。毫不奇怪,矩陣處理器(MXU)結構具有 65,536 8-bit 乘法器,並通過脈動陣列結構波動推動資料,就像通過心臟的血液一樣。

這種設計是一種複雜的指令集計算(CISC)結構,雖然是單執行緒的,但允許單個高階指令觸發 MXU 上的多個低階操作,每次迴圈可能會執行 128,000 條指令,而不用訪問記憶體。

因此,與 GPU 陣列或者多指令集、多資料 CPU HPC 叢集相比,TPU 可以獲得巨大的效能提升和能效比率。通過評估每個週期中 TensorFlow 流圖中每個預備執行節點,TPU 相比其他架構,大大減少了深度學習神經網路訓練時間,

TensorFlow 安裝注意事項

一般來說,TensorFlow 可以在任何支援 64 位 Python 開發環境的平臺上執行。這個環境足以訓練和測試大多數簡單的例子和教程。然而,大多數專家認為,對於研究或專業開發,強烈推薦使用 HPC 平臺。

處理器和記憶體效能要求

由於深度學習計算量非常大,因此具有向量擴充套件的高速多核 CPU 以及一個或多個具有高階 CUDA 支援的 GPU 是深度學習的普通標準。大多數專家還建議要注意 CPU 和 GPU 快取,因為記憶體傳輸操作的能源消耗大,對效能不利。

深度學習的效能表現有兩種模式需要考慮:

  • 開發模式。通常情況下,在這種模式下,訓練時間、效能表現、樣本、資料集大小都會影響處理效能和記憶體要求。這些元素決定著神經網路計算效能和訓練時間的極限。
  • 應用模式。通常,在受訓過的神經網路處理過程中,處理效能和記憶體決定了分類或推測的實時效能。卷積神經網路需要更多的低精度計算能力,而全連線神經網路需要更多的記憶體。

虛擬機器選項

用於深度學習的虛擬機器(VMS)現在最適用於 CPU 為中心多核心可用的硬體體系。因為主機作業系統控制了 CPU, GPU 這些物理裝置,所以在虛擬機器上實現加速很複雜。有兩種已知方法:

  • GPU 掛載:    *   只能在 Type-1 管理程式上執行,例如 Citrix Xen, VMware ESXi, Kernel Virtual Machine, 和 IBM Power。    *   掛載的開銷會根據 CPU,晶片組,管理程式和作業系統的特定組合而變化。一般來說,最新一代硬體的開銷要小得多。    *   給定的管理程式-作業系統組合支援特定的NVIDIA GPU。
  • GPU 虛擬化:    *   支援所有的主流 GPU 供應商,比如 NVIDIA(GRID),AMD(MxGPU)和 Intel(GVT-G)。    *   在特定的新 GPU 上支援最新版本的 OpenCL(TensorFlow 沒有官方支援 OpenCL)。    *   在特定的新 GPU 上最新版本的 NVIDIA GRID 支援 CUDA 和 OpenCL。

Docker 安裝選項

在 Docker 容器或者 Kubernetes 容器叢集系統上執行 TensorFlow 有很多優勢。TensorFlow 可以將流圖作為執行任務分發給 TensorFlow 伺服器叢集,而這些服務叢集其實是對映到容器叢集的。使用 Docker 的附加優勢是 TensorFlow 伺服器可以訪問物理 GPU 核心(裝置)併為其分配特定的任務。

開發者還可以通過安裝社群構建的 Docker 映象,在 PowerAI OpenPOWER 伺服器上的 Kubernetes 容器叢集系統中部署 TensorFlow,如“在 OpenPOWER 伺服器上使用 PowerAI 的 Kubernetes 系統進行 TensorFlow 訓練 ”。

雲安裝選項

TensorFlow 雲安裝有幾種選項:

  • Google Cloud TPU。對於研究人員來說,Google 有一個Alpha 版本的 TensorFlow Research Cloud,可以提供線上的 TPU 例項。
  • Google Cloud。Google 在一些特定的區域提供了自定義的 TensorFlow 機器例項,可以訪問一個,四個或者八個 NVIDIA GPU 裝置。
  • IBM Cloud 資料科學與管理。IBM 提供了一個附帶 Jupyter Notebook 和 Spark 的 Python 環境。TensorFlow 已經預安裝了。
  • Amazon Web Services (AWS)。Amazon 提供 AWS Deep Learning Amazon 機器映象(AMIs),可選 NVIDIA GPU 支援,可在各種 Amazon Elastic Compute Cloud 例項上執行。TensorFlow, Keras 和其他的深度學習框架都已經預裝。AMI 可以支援多達 64 個 CPU 核心和 8 個 NVIDIA GPU(K80)。
  • Azure。可以在使用 Azure 容器服務的 Docker 例項上或者一個 Ubuntu 伺服器上設定 TensorFlow。Azure 機器例項可以支援 24 個 CPU核心和多達 4 個 NVIDIA GPU(M60 或 K80)。
  • IBM Cloud Kubernetes 叢集。IBM Clound 上的 Kubernetes 叢集 可以執行 TensorFlow。一個社群構建的 Docker 映象可用。POWERAI 伺服器提供 GPU 支援。

TensorFlow 支援那些程式語言?

儘管 Google 在 C++ 中實現了 TensorFlow 核心程式碼,但是它的主要程式語言是 Python,而且這個 API 是最完整的,最強大的,最易用的。更多有關資訊,請參閱 Python API 文件。Python API 還具有最廣泛的文件和可擴充套件性選項以及廣泛的社群支援。

除了 Python 之外,TensorFlow還支援以下語言的 API,但不保證穩定性:

  • C++。TensorFlow C++ API 是下一個最強大的 API,可用於構建和執行資料流圖以及 TensorFlow 服務。更多有關 C++ API 的資訊,請參閱C++ API。有關 C++ 服務 API 的更多資訊,請參閱 TensorFlow 服務 API 參考
  • Java 語言。儘管這個 API 是實驗性的,但最新發布的 Android Oreo 支援 TensorFlow 可能會使這個 API 更加突出。更多有關資訊,請參考tensorflow.org
  • Go。這個 API 是對 Google Go 語言高度實驗性的繫結。更多有關資訊,請參考 package tensorflow

第三方繫結

Google 已經定義了一個外部函式介面(FFI)來支援其他語言繫結。該介面使用 C API 暴露了 TensorFlow C++ 核心函式。FFI 是新的,可能不會被現有的第三方繫結使用。

一項對 GitHub 的調查顯示,有以下語言的社群或供應商開發的第三方 TensorFlow 繫結 C#,Haskell, Julia,Node.js,PHP,R,Ruby,Rust 和 Scala。

Android

現在有一個經過優化的新 TensorFlow-Lite Android 庫來執行 TensorFlow 應用程式。更多有關資訊,請參考 What's New in Android: O Developer Preview 2 & More

使用 Keras 簡化 TensorFlow

Keras 的層和模型完全相容純粹的 TensorFlow tensor。因此,Keras 為 TensorFlow 提供了一個很好的模型定義外掛。開發者甚至可以將 Keras 與 其他 TensorFlow 庫一起使用。有關詳細資訊,請參考 使用 Keras 作為 TensorFlow 的簡要介面: 教程

結論

TensorFlow 只是許多用於機器學習的開源軟體庫之一。但是,根據它的 GitHub 專案數量,它已經成為被最廣泛採用的深度學習框架之一。在本教程中,您瞭解了 TensorFlow 的概述,瞭解了哪些平臺支援它,並檢視了安裝注意事項。

如果你準備使用 TensorFlow 檢視一些示例,請檢視 機器學習演算法加快訓練過程使用 PowerAI notebooks 進行影象識別訓練中的開發者程式碼模式。


資源下載


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章