python 分布式計算框架_漫談分布式計算框架

如果問 mapreduce 和 spark 什么關系,或者說有什么共同屬性,你可能會回答他們都是大數據處理引擎。如果問 spark 與 tensorflow 呢,就可能有點迷糊,這倆關注的領域不太一樣啊。但是再問 spark 與 MPI 呢?這個就更遠了。雖然這樣問多少有些不嚴謹,但是它們都有共同的一部分,這就是我們今天談論的一個話題,一個比較大的話題:分布式計算框架。

不管是 mapreduce,還是 spark 亦或 tensorflow,它們都是利用分布式的能力,運行某些計算,解決一些特定的問題。從這個 level 講,它們都定義了一種“分布式計算模型”,即提出了一種計算的方法,通過這種計算方法,就能夠解決大量數據的分布式計算問題。它們的區別在于提出的分布式計算模型不同。Mapreduce 正如其名,是一個很基本的 map-reduce 式的計算模型(好像沒說一樣)。Spark 定義了一套 RDD 模型,本質上是一系列的 map/reduce 組成的一個 DAG 圖。

Tensorflow 的計算模型也是一張圖,但是 tensorflow 的圖比起 spark 來,顯得更“復雜”一點。你需要為圖中的每個節點和邊作出定義。根據這些定義,可以指導 tensorflow 如何計算這張圖。Tensorflow 的這種具體化的定義使它比較適合處理特定類型的的計算,對 tensorflow 來講就是神經網絡。而 spark 的 RDD 模型使它比較適合那種沒有相互關聯的的數據并行任務。那么有沒有一種通用的、簡單的、性能還高的分布式計算模型?我覺著挺難。通用往往意味著性能不能針對具體情形作出優化。而為專門任務寫的分布式任務又做不到通用,當然也做不到簡單。

插一句題外話,分布式計算模型有一塊伴隨的內容,就是調度。雖然不怎么受關注,但這是分布式計算引擎必備的東西。mapreduce 的調度是 yarn,spark 的調度有自己內嵌的調度器,tensorflow 也一樣。MPI 呢?它的調度就是幾乎沒有調度,一切假設集群有資源,靠 ssh 把所有任務拉起來。調度實際上應當分為資源調度器和任務調度器。前者用于向一些資源管理者申請一些硬件資源,后者用于將計算圖中的任務下發到這些遠程資源進行計算,其實也就是所謂的兩階段調度。近年來有一些 TensorflowOnSpark 之類的項目。這類項目的本質實際上是用 spark 的資源調度,加上 tensorflow 的計算模型。

當我們寫完一個單機程序,而面臨數據量上的問題的時候,一個自然的想法就是,我能不能讓它運行在分布式的環境中?如果能夠不加改動或稍加改動就能讓它分布式化,那就太好了。當然現實是比較殘酷的。通常情況下,對于一個一般性的程序,用戶需要自己手動編寫它的分布式版本,利用比如 MPI 之類的框架,自己控制數據的分發、匯總,自己對任務的失敗做容災(通常沒有容災)。如果要處理的目標是恰好是對一批數據進行批量化處理,那么 可以用 mapreduce 或者 spark 預定義的 api。對于這一類任務,計算框架已經幫我們把業務之外的部分(腳手架代碼)做好了。同樣的,如果我們的任務是訓練一個神經網絡,那么用 tensorflow pytorch 之類的框架就好了。這段話的意思是,如果你要處理的問題已經有了對應框架,那么拿來用就好了。但是如果沒有呢?除了自己實現之外有沒有什么別的辦法呢?

今天注意到一個項目,Ray,聲稱你只需要稍微修改一下你的代碼,就能讓它變為分布式的(實際上這個項目早就發布了,只是一直沒有刻意關注它)。當然這個代碼僅局限于 python,比如下面這個例子,

這么簡單?這樣筆者想到了 openmp(注意不是 openmpi)。來看看,

把頭文件導入,添加一行預處理指令就可以了,這段代碼立馬變為并行執行。當然 openmp 不是分布式,只是借助編譯器將代碼中需要并行化的部分編譯為多線程運行,本身還是一個進程,因此其并行度收到 CPU 線程數量所限。如果 CPU 是雙線程,那只能 2 倍加速。在一些服務器上,CPU 可以是單核 32 線程,自然能夠享受到 32 倍加速(被并行化的部分)。不過這些都不重要,在用戶看來,Ray 的這個做法和 openmp 是不是有幾分相似之處?你不需要做過多的代碼改動,就能將代碼變為分布式執行(當然 openmp 要更絕一點,因為對于不支持 openmp 的編譯器它就是一行注釋而已)。

那么 Ray 是怎么做到這一點的呢?其實 Ray 的做法說起來也比較簡單,就是定義了一些 API,類似于 MPI 中的定義的通信原語。使用的時候,將這些 API “注入”到代碼合適的位置,那么代碼就變成了用戶代碼夾雜著一些 Ray 框架層的 API 調用,整個代碼實際上就形成了一張計算圖。接下來的事情就是等待 Ray 把這張計算圖完成返回就好了。Ray 的論文給了個例子:

生成的計算圖為

所以,用戶要做的事情,就是在自己的代碼里加入適當的 Ray API 調用,然后自己的代碼就實際上變成了一張分布式計算圖了。作為對比,我們再來看看 tensorflow 對圖的定義,

可以看出,tensorflow 中是自己需要自己顯式的、明確的定義出圖的節點,placeholder Variable 等等(這些都是圖節點的具體類型),而 Ray 中圖是以一種隱式的方式定義的。我認為后者是一種更自然的方式,站在開發者的角度看問題,而前者更像是為了使用 tensorflow 把自己代碼邏輯去適配這個輪子。

那么 ray 是不是就我們要尋找的那個即通用、又簡單、還靈活的分布式計算框架呢?由于筆者沒有太多的 ray 的使用經驗,這個問題不太好說。從官方介紹來看,有限的幾個 API 確實是足夠簡單的。僅靠這幾個 API 能不能達成通用且靈活的目的還不好講。本質上來說,Tensorflow 對圖的定義也足夠 General,但是它并不是一個通用的分布式計算框架。由于某些問題不在于框架,而在于問題本身的分布式化就存在困難,所以試圖尋求一種通用分布式計算框架解決單機問題可能是個偽命題。

話扯遠了。假設 ray 能夠讓我們以一種比較容易的方式分布式地執行程序,那么會怎么樣呢?前不久 Databricks 開源了一個新項目,Koalas,試圖以 RDD 的框架并行化 pandas。由于 pandas 的場景是數據分析,和 spark 面對的場景類似,兩者的底層存儲結構、概念也是很相似的,因此用 RDD 來分布式化 pandas 也是可行的。我想,如果 ray 足夠簡單好用,在 pandas 里加一些 ray 的 api 調用花費的時間精力可能會遠遠小于開發一套 koalas。但是在 pandas 里加 ray 就把 pandas 綁定到了 ray 上,即便單機也是這樣,因為 ray 做不到像 openmp 那樣如果支持,很好,不支持也不影響代碼運行。

啰嗦這么多,其實就想從這么多引擎的細節中跳出來,思考一下到底什么是分布式計算框架,每種框架又是設計的,解決什么問題,有什么優缺點。最后拿大佬的一個觀點結束本文。David Patterson 在演講 “New Golden Age For Computer Architecture” 中提到,通用硬件越來越逼近極限,要想要達到更高的效率,我們需要設計面向領域的架構(Domain Specific Architectures)。這是一個計算架構層出不窮的時代,每種架構都是為了解決其面對的領域問題出現的,必然包含對其問題的特殊優化。通用性不是用戶解決問題的出發點,而更多的是框架設計者的“一廂情愿”,用戶關注的永遠是領域問題。從這個意義上講,面向領域的計算架構應該才是正確的方向。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453868.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Codeforces 899D Shovel Sale

題目大意 給定正整數 $n$($2\le n\le 10^9$)。 考慮無序整數對 $(x, y)$($1\le x,y\le n, x\ne y$)。 求滿足 「$xy$ 結尾連續的 9 最多」的數對 $(x,y)$ 的個數。 例子: $n50$,$(49,50)$ 是一個滿足條件的…

Windows系統使用minGW+msys 編譯ffmpeg 0.5的全過程詳述

一.環境配置 1.下載并安裝 MinGW-5.1.4.exe (http://jaist.dl.sourceforge.net/sourcef … -5.1.4.exe),安裝時選中 g, mingw make。建議安裝到c:/mingw. 2.下載并安裝 MSYS-1.0.11-rc-1.exe (http://jaist.dl.sourceforge.net/sourcef … 1-rc-1.exe),安…

Liunx安裝gogs,mysql,jdk,tomcat等常用軟件

Liunx CentOS系統采用yum安裝Mysql 一.安裝mysql客戶端 yum -y install mysql 二.安裝mysql服務器端 [注意:由于CentOS7下的不自帶mysql-server,所以得先安裝資源包,步驟: 1.wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm (采用wget獲取必須有wge…

stm32單片機端口映射_STM32單片機的重映射與地址映射的使用方法及步驟

重映射STM32中對于一些端口的外設已經被其他引腳所使用,這是就需要用端口重映射來解決了,很方便。以USART1為例重映射的步驟為:打開重映射時鐘和USART重映射后的I/O口引腳時鐘,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_A…

python 第三方模塊 yaml - 處理 YAML (專門用來寫配置文件的語言)

markdown 的配置使用 Yaml —— Yet Another Markup Language :另一種標記語言。 簡介 YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便。 YAML在python語言中有PyYAML安裝包。 YAML 語言(發音 /?jm?l/ &…

程序員 賺錢

業余編程賺錢 程序員的好方法 現在的人生活水平高了,開銷也大了,同時對于一些技術性人員來說有很多種,有些程序員自己開公司,開發自己的產品,年賺百萬,有些程序員還在給別人打工,每天累死累活的…

java合并單元格的快捷鍵_java poi合并單元格問題

使用poi導出的execl合并單元格,會出現下圖問題整個單元格看似合并了,但是文字沒有垂直居中,而且execl中所有的合并都會在第三行開始出現灰色分層樣式合并單元格偽代碼String upCompareField ""; //上一行的對比值for(int i 0; i …

webpack自動化構建腳本指令npm run dev/build

指令 為不同環境配置可執行指令,我們使用npm scripts方式,在package.json文件中配置執行指令: {"scripts": {"start": "cross-env NODE_ENVdev webpack-dev-server","build": "cross-env NODE_…

前端之 form 詳解

認識表單 在一個頁面上可以有多個form表單,但是向web服務器提交表單的時候,一次只可以提交一個表單。要聲明一個表單,只需要使用 form 標記來標明表單的開始和結束,若需要向服務器提交數據,則在form標簽中需要設置act…

代碼 優化 指南 實踐

C代碼優化方案 華中科技大學計算機學院 姓名: 王全明 QQ: 375288012 Email: quanming1119163.com 目錄 目錄 C代碼優化方案 1、選擇合適的算法和數據結構 2、使用盡量小的數據類型 3、減少運算的強度 (1&…

.12-淺析webpack源碼之NodeWatchFileSystem模塊總覽

剩下一個watch模塊,這個模塊比較深,先大概過一下整體涉及內容再分部講解。 流程圖如下: NodeWatchFileSystem const Watchpack require("watchpack");class NodeWatchFileSystem {constructor(inputFileSystem) {this.inputFileSy…

Python 第三方模塊之 beautifulsoup(bs4)- 解析 HTML

簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取數據。官方解釋如下:官網文檔 Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。 它是一個工具箱,通過解析文檔為用戶提供…

modal vue 關閉_Vue彈出框的優雅實踐

引言頁面引用彈出框組件是經常碰見的需求,如果強行將彈出框組件放入到頁面中,雖然功能上奏效但沒有實現組件與頁面間的解耦,非常不利于后期的維護和功能的擴展.下面舉個例子來說明一下這種做法的弊端.click"openModal()">點擊 :is_open"is_open" close…

Python 第三方模塊之 lxml - 解析 HTML 和 XML 文件

lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,它最初是用來搜尋XML文…

(轉)Linux下PS1、PS2、PS3、PS4使用詳解

Linux下PS1、PS2、PS3、PS4使用詳解 原文:http://www.linuxidc.com/Linux/2016-10/136597.htm 1、PS1——默認提示符 如下所示,可以通過修改Linux下的默認提示符,使其更加實用。在下面的例子中,默認的PS1的值是“\s-\v\$”,顯示出…

開放平臺大抉擇

開放平臺大抉擇之新浪SAE:為個人應用開發帶來福音 導讀:繼上期淘寶網副總裁王文彬從平臺功能特色、運營狀況等多方面分享了淘寶開放平臺的歷程和挑戰之后。國內另一家云平臺服務方的典型代表——Sina App Engine(簡稱SAE),作為新浪研發中心于…

ip68級防水可以泡多久_iPhone8防水級別升級至IP68:能在1.5米深水中堅持30分鐘

1月15日,業界最新的泄密消息顯示,蘋果擬在今年推出的“iPhone 8”智能手機會是一款革命性的手機,功能和配置就不多說了。蘋果還將解決iPhone 7的一個重要缺陷,就是大大增強iPhone 8的防水性能,防水級別達IP68。《韓國先…

HTTP POST 發送數據的參數 application/x-www-form-urlencoded、multipart/form-data、text/plain

HTTP 簡介 HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。 其中 POST 一般用來向服務端提交數據,本文主要討論 POST 提交數據的幾種方式。 我們知道,HTTP 協議是以 ASCII 碼傳輸,建…

vue 二進制文件的下載(解決亂碼和解壓報錯)

問題描述:項目中使用的是vue框架進行開發,因為文件下載存在權限問題,所以并不能通過 a 鏈接的 href 屬性直接賦值 URL進行下載, (如果你的文件沒有下載權限,可以直接通過href屬性賦值URL的方法進行文件下載…

Python 第三方模塊之 psutil - 獲取系統運行的進程和系統利用率信息

一、psutil模塊: 官方網址:http://pythonhosted.org/psutil/ 1.psutil是一個跨平臺庫(http://pythonhosted.org/psutil/)能夠輕松實現獲取系統運行的進程和系統利用率(包括CPU、內存、磁盤、網絡等)信息。它主要用來做系統監控,…