日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Ray輕松進(jìn)行Python分布式計算

即使是具有多個CPU核心的單處理器計算機(jī)(處理器具有一個或多個核心,計算機(jī)具有一個或多個處理器),也會給人一種能夠同時運(yùn)行多個任務(wù)的錯覺。當(dāng)我們擁有多個處理器時,就可以真正以并行的方式執(zhí)行計算。

錦州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

一、并行計算與分布式計算的區(qū)別

并行計算在現(xiàn)代計算中非常有用,幾乎是必需的,目的是實現(xiàn)最大性能。開發(fā)者將運(yùn)行時間較長的計算任務(wù)分成較小的塊,并將其分配給不同的處理器。這種策略使開發(fā)者能夠在相同的時間內(nèi)進(jìn)行更多的計算。對于構(gòu)建基于GUI的應(yīng)用程序,總是需要對系統(tǒng)進(jìn)行并行設(shè)計,以便一個線程可以保持可用狀態(tài)以更新GUI并響應(yīng)用戶輸入。

并行計算和分布式計算的區(qū)別在于,對于并行計算,多個處理器位于同一主板上。分布式計算則使用多臺計算機(jī)同時解決問題?,F(xiàn)代分布式系統(tǒng)能夠在網(wǎng)絡(luò)(局域網(wǎng)/廣域網(wǎng))上進(jìn)行通信。分布式計算的優(yōu)點(diǎn)在于其價格和可擴(kuò)展性。如果開發(fā)者需要更多的計算能力,那么可以很輕松地添加更多的計算機(jī)。

從根本上講,并行計算和分布式計算的架構(gòu)非常相似。主要區(qū)別在于分布式計算使用的是分布式內(nèi)存空間,而不是共享內(nèi)存空間。它具有能夠為開發(fā)者的應(yīng)用程序提供統(tǒng)一邏輯(而不是物理)內(nèi)存空間的軟件層,可以幫助開發(fā)者將為并行計算編寫的代碼應(yīng)用于分布式計算。

在本文中將介紹如何使用開源Python庫Ray來幫助開發(fā)者進(jìn)行并行和分布式計算,Ray將Pythonic函數(shù)和類轉(zhuǎn)換為分布式設(shè)置中的任務(wù)和角色。本文將只介紹函數(shù)的示例,但是類的概念非常相似。

二、使用pip安裝Ray

這將安裝支持儀表板+集群啟動器的Ray。

pip install 'ray[default]'

如果只想進(jìn)行最小化安裝:

pip install -U ray

三、使用Ray進(jìn)行并行計算任務(wù)

接下來執(zhí)行一個示例,該示例使用concurrent.futures,并將其與使用ray執(zhí)行相同任務(wù)的運(yùn)行進(jìn)行比較。

import time
import concurrent.futures


Stime = time.perf_counter()
tasks = []
sleepTimes = [0.1, 0.2, 0.1, 0.5, 0.7, 0.9, 0.5,
              0.4, 1.5, 1.3, 1.0, 0.3, 0.7, 0.6, 0.3, 0.8]
print(f"Total time of sleep: {sum(sleepTimes)} for {len(sleepTimes)} tasks")

def my_awesome_function(sleepTime=0.1):
    time.sleep(sleepTime)
    return f"Sleep time {sleepTime}"

all_results = []
with concurrent.futures.ProcessPoolExecutor() as executor:
    tasks = [executor.submit(my_awesome_function, sleep)
             for sleep in sleepTimes]

    for ff in concurrent.futures.as_completed(tasks):
        all_results.append(ff.result())


print(f"Finished in {time.perf_counter()-Stime:.2f}")

這將返回:

$ python test_ray.py 
Total time of sleep: 9.9 for 16 tasks 
Finished in 1.65

這項工作在順序執(zhí)行時需要9.9秒完成。由于本文執(zhí)行的是并行執(zhí)行,因此在示例中只用了1.65秒就完成了這項工作。請注意,這個時間可能因為不同的計算機(jī)而有所不同。

現(xiàn)在使用Ray來完成同樣的工作。本文首先使用ray.init()初始化Ray。然后,裝飾器ray.remote將Python函數(shù)轉(zhuǎn)換為可以異步遠(yuǎn)程執(zhí)行的函數(shù)。它會立即返回N個可以并行執(zhí)行的函數(shù)副本。

import time
import ray

import concurrent.futures


Stime = time.perf_counter()
tasks = []
sleepTimes = [0.1, 0.2, 0.1, 0.5, 0.7, 0.9, 0.5,
              0.4, 1.5, 1.3, 1.0, 0.3, 0.7, 0.6, 0.3, 0.8]
print(f"Total time of sleep: {sum(sleepTimes)} for {len(sleepTimes)} tasks")

# 初始化Ray。
ray.init()

@ray.remote #convert to a function that can be executed remotely and asynchronously
def my_awesome_function(sleepTime=0.1):
    time.sleep(sleepTime)
    return f"Sleep time {sleepTime}"

tasks = []
for sleep in sleepTimes:
    tasks.append(my_awesome_function.remote(sleep))

all_results = ray.get(tasks)
print(f"Finished in {time.perf_counter()-Stime:.2f}")

這將返回:

Total time of sleep: 9.9 for 16 tasks 
Finished in 3.18

由于存在一些開銷,會有一些延遲,但對于大型計算來說,這種延遲可以忽略不計。

四、大規(guī)模計算的聚合值

Ray可以輕松地用于聚合多個值,這對于構(gòu)建需要跨多臺機(jī)器進(jìn)行計算的大型應(yīng)用程序非常重要。對于大規(guī)模計算,Ray可以將聚合的運(yùn)行時間從線性改為對數(shù)。

接下來看一個示例:

import time
import ray
import numpy as np

Stime = time.perf_counter()

@ray.remote
def create_matrix(size):
    return np.random.normal(size=size)

@ray.remote
def multiply_matrices(x, y):
    return np.dot(x, y)

@ray.remote
def sum_matrices(x, y):
    return np.add(x, y)

m1 = create_matrix.remote([1000, 1000])
m2 = create_matrix.remote([1000, 1000])
m3 = create_matrix.remote([1000, 1000])
m4 = create_matrix.remote([1000, 1000])

m12 = multiply_matrices.remote(m1, m2)
m34 = multiply_matrices.remote(m3, m4)

a12_34 =  sum_matrices.remote(m12, m34)

## 結(jié)果
MM = ray.get(a12_34)


print(f"Finished in {time.perf_counter()-Stime:.2f}")

在上面的示例中,本文首先創(chuàng)建了四個矩陣,將它們分為兩組,對每組中的矩陣進(jìn)行乘法運(yùn)算,然后對每組的乘法結(jié)果進(jìn)行求和。在這里,乘法運(yùn)算是并行進(jìn)行的,然后將結(jié)果聚合以獲得求和結(jié)果。

參考資料

  1. 【安裝Ray】:https://docs.ray.io/en/latest/ray-overview/installation.html
  2. Pierfederici, F. (2016). 《Distributed Computing with Python》. Journal of Physics A: Mathematical and Theoretical (Vol. 44, Issue 8). Packt Publishing Ltd.

文章名稱:使用Ray輕松進(jìn)行Python分布式計算
URL網(wǎng)址:http://m.5511xx.com/article/dppehcg.html