分散機械学習フレームワークRay

分散機械学習フレームワークRay

[[422916]]

Python 中国語コミュニティ (ID: python-china)

1. レイとは何か

オフライン コンピューティング用の Hadoop (マップ リデュース)、ストリーミング コンピューティング用の spark、strom、Flink などの分散コンピューティング フレームワークについては、誰もがよく知っている必要があります。比較的言えば、これらのコンピューティング フレームワークはすべて他のビッグ データ コンポーネントに依存しており、インストールと展開が比較的複雑です。

Pythonでは、以前から共有されているCeleryが分散コンピューティングを提供できます。今日は、もう 1 つのオープン ソース分散コンピューティング フレームワークである Ray についてお話ししたいと思います。 Ray は、カリフォルニア大学バークレー校 RISELab によって新たに立ち上げられた高性能分散実行フレームワークです。 Spark よりもコンピューティング パフォーマンスが優れており、導入と変換も簡単です。また、機械学習やディープラーニングの分散トレーニングもサポートしており、主流のディープラーニングフレームワーク(pytorch、tensorflow、kerasなど)もサポートしています。

  • https://github.com/ray-project/ray

2. レイアーキテクチャ

Rayのアーキテクチャは、最初に公開された論文「Ray: 新興AIアプリケーションのための分散フレームワーク」に記載されています。

上の図からわかるように、Ray には主に次のものが含まれます。

  • ノード: 主にヘッドとワーカーからなるノード。ヘッドはマスターと考えることができ、ワーカーはタスクを実行するユニットです。
    • 各ノードには独自のローカルスケジューラがある
    • オブジェクトストア: ノード間の通信を可能にするメモリ内オブジェクトストア
  • スケジューラ: スケジューラは 2 つあります。各ノードにはローカル スケジューラがあります。タスクを送信すると、ローカル スケジューラは、タスクを他のワーカーに配布して実行するためにグローバル スケジューラに送信する必要があるかどうかを判断します。
  • GCS: グローバル状態制御は、Ray 内のさまざまなオブジェクトの状態情報を記録し、メタデータとして考えることができ、Ray のフォールト トレランスの保証となります。

Ray は、分散トレーニングを含むあらゆる分散コンピューティング タスクに適しています。著者は最近、これを多数の時系列予測モデルのトレーニングとオンライン予測に使用しました。

Ray は現在、ハイパーパラメータ調整の Ray tune、勾配降下法の Ray SGD、推論サービス RaySERVE、分散データ Dataset、分散強化学習 RLlib をサポートしています。他にも次のようなサードパーティ ライブラリがあります。

3. 使いやすい

3.1 インストールと展開

  1. pip インストール --upgrade pip  
  2. # レイをインストール 
  3. pip インストールray ==1.6.0  
  4. # ImportError: 'attr.validators' から名前 'deep_mapping' をインポートできません 
  5. # pip インストールattr == 19.1.0

3.2 単一マシン使用

  • 簡単な例: Ray は @ray.remote デコレータを使用して、関数を分散呼び出し可能なタスクに変換します。関数名.remote メソッドを通じてタスクを送信し、ray.get メソッドを通じてタスクの戻り値を取得します。シングルクリックのケースは、マルチスレッドの非同期実行方法に似ています。
  1. インポート時間 
  2. レイをインポート 
  3. ray.init( num_cpus = 4 ) # このシステムに 4 つの CPU があることを指定します。  
  4. レイ・リモート 
  5. def do_some_work(x):  
  6. time.sleep(1) # これを実行する必要がある作業に置き換えます。  
  7. xを返す 
  8. 開始=時間.time()  
  9. 結果= ray .get([do_some_work.remote(x) の x が範囲(4)])  
  10. print(" duration =", time.time() - 開始)  
  11. print("結果= ", 結果)   
  12. #期間= 1 .0107324123382568  
  13. #結果= [0, 1, 2, 3]

リモートによって返されるオブジェクトの ID は、ObjectRef(7f10737098927148ffffffff0100000001000000) のようになります。実際の値を取得するには、ray.get を使用する必要があります。 ray.getはブロッキング呼び出しであり、使用できないことに注意してください[ray.get(do_some_work.remote(x)) for x in range(4)]

  • 小さなタスクの使用に注意してください。 Ray 分散コンピューティングでは、スケジュール設定、プロセス間通信、タスク ステータスの更新などのスケジュール設定時に余分な時間が必要になるため、小さすぎるタスクは避ける必要があることに注意してください。小さなタスクを組み合わせることができる
  1. レイ・リモート 
  2. tiny_work(x)を定義します。  
  3. time.sleep(0.0001) # これを実行する必要がある作業に置き換えます。  
  4. xを返す 
  5. 開始=時間.time()  
  6. result_ids = [tiny_work.remote(x) の場合、x は範囲(100000)]  
  7. 結果= ray .get(result_ids)  
  8. print(" duration =", time.time() - 開始)
  • ray.put ray.put() はオブジェクトをオブジェクト ストレージに格納し、分散マシンで呼び出すことができるオブジェクト ID を返します。操作は非同期です。 ray.get() を通じて取得できます。
  1. num =レイ.put(10)  
  2. ray.get(数値)
  • ray.wait タスクが複数の結果を返す場合、ray.get() はすべての結果が完了するまで待機してから、後続の操作を実行します。複数の結果の実行にかかる時間が異なる場合、最も時間のかかるタスクに欠点があります。

このとき、ray.wait() メソッドを使用できます。 ray.wait() は完了したタスクと未完了のタスクの結果を返します。完了した結果は後続の操作を続行できます。

  1. ランダムにインポート 
  2. レイ・リモート 
  3. def do_some_work(x):  
  4. time.sleep(random.uniform(0, 4)) # これを実行する必要がある作業に置き換えます。  
  5. 戻る 
  6. def process_incremental(合計、結果):  
  7. time.sleep(1) # これを何らかの処理コードに置き換えます。  
  8. 合計 + 結果を返す 
  9. 開始=時間.time()  
  10. result_ids = [do_some_work.remote(x) の範囲(4)]  
  11. 合計= 0    
  12. len(result_ids):の間 
  13. done_id、 result_ids = ray .wait(result_ids) です。  
  14. 合計= process_incremental (合計、ray.get(done_id[0]))
  15.   print(" duration = ", time.time() - start, " \ nresult = ", sum) 出力 
  16. #期間= 5 .270821809768677  
  17. #結果= 6  

2.3 クラスタの展開

Ray のアーキテクチャはマスター スレーブ モデルに従います。ヘッド ノードはマスターと見なすことができ、他のノードはワーカーです。クラスターをデプロイするときは、まず ray start --head を使用してヘッドノードを起動し、他のマシンが順番にワーカーを起動する必要があります。関係を決定するには、ヘッド ノードのアドレス (ray start --address 10.8.xx.3:6379) を指定する必要があることに注意してください。

サービスをシャットダウンするには、各マシンでray.stopを実行する必要があります。

  1. # ヘッドノードを起動します。  
  2. #ray start --head --num-cpus = < NUM_CPUS >   --num - gpus = <NUM_GPUS>    
  3. レイスタート --head --node-ip-address 10.8.xx.3 --port = 6379    
  4. # 非ヘッドノードを起動します。  
  5. #ray start --address = <アドレス>   --num - cpus = < CPUの数>   --num - gpus = <NUM_GPUS>    
  6. ray start --address 10.8.xx.3:6379 --node-ip-address 10.8.xx.3 --num-cpus 10 --temp-dir ={一時パス}

  • タスクの送信 どのワーカー マシンでもタスクを送信できます。まず、init を介してヘッドノードに接続し、リモート接続することができます。
  1. レイをインポート 
  2. レイ.init(10.8.xx.3:6379)

3. さまざまなタスクの例

  • タスクの依存関係 タスク間には依存関係があります。 Ray は Spark と同様に、DAG グラフを生成することで依存関係を決定し、並列実行できるタスクを決定します。下の図に示すように、ゼロは並列に実行できます。
  1. numpyをnpとしてインポートする 
  2. # 2 つのリモート関数を定義します。これらの関数を呼び出すとタスクが作成される 
  3. # リモートで実行されます。  
  4. レイ・リモート 
  5. def multiply(x, y):  
  6. np.dot(x, y) を返す 
  7. レイ・リモート 
  8. ゼロを定義します(サイズ):  
  9. np.zeros(サイズ)を返す 
  10. # 2 つのタスクを並行して開始します。これらはすぐに先物を返すので、  
  11. # タスクはバックグラウンドで実行されます。  
  12. x_id =ゼロ.remote((100, 100))  
  13. y_id =ゼロ.remote((100, 100))  
  14. # 3 番目のタスクを開始します。これは最初の2つまでは予定されていません 
  15. # 個のタスクが完了しました。  
  16. z_id = .remote(x_id, y_id)を掛け算する 
  17. # 結果を取得します。 3 番目のタスクが完了するまでブロックされます。  
  18. z =レイ.get(z_id)  
  19. 印刷(z)

  • 上記のタスクはすべてステートレスです (依存関係を除く)。つまり、タスク間に関係はありません。 Ray は、Actor としてステートフル タスクもサポートします。通常、Python クラスに @ray.remote を追加すると、ray は各クラスの内部状態のさまざまな状態を追跡します。
  1. レイ・リモート 
  2. クラス Counter(オブジェクト):  
  3. __init__(self)を定義します。  
  4. 自分.n = 0    
  5. def増分(自己):  
  6. 自己.n += 1  
  7. def read(self):  
  8. 自己.nを返す 
  9. カウンター= [Counter.remote() の i が範囲(4)]  
  10. # 連続実行により各カウンターのカウントが増加する可能性があります 
  11. [カウンター内の c の c.increment.remote()]  
  12. futures = [c.read.remote() はカウンター内の c に対して]  
  13. 印刷(ray.get(futures))  
  14. # [1, 1, 1, 1]  
  15. # [11、11、11、11]
  • Map-Reduce タスクは、実際には他の分散タスクと同じです。主に各種集計操作。 Map-Reduceの一般的な操作は次のとおりです。

  • - 単語数カウントの例については、https://github.com/ray-project/ray/blob/master/doc/examples/streaming/streaming.py を参照してください。

以下に簡単な例を示します。

  1. レイ・リモート 
  2. 定義マップ(obj, f):  
  3. f(obj) を返す 
  4. レイ・リモート 
  5. def sum_results(*要素):  
  6. np.sum(要素)を返す 
  7. 項目=リスト(範囲(100))  
  8. map_func =ラムダi: i*2  
  9. remote_elements = [map.remote(i, map_func) アイテム内の i の場合]  
  10. #シンプルリデュース 
  11. remote_final_sum = sum_results .remote(*remote_elements)  
  12. 結果= ray .get(remote_final_sum)
  13. #ツリーを減らす 
  14. 中間結果= [sum_results.remote(  
  15. *remote_elements[i * 20: (i + 1) * 20]) iが範囲内(5)]  
  16. remote_final_sum = sum_results .remote(*intermediate_results)  
  17. 結果= ray .get(remote_final_sum)

  • モデルのトレーニングについては、pytorch の公式サイトで「Best Practices: Ray with PyTorch」が提供されています。これは主にトレーニング/テスト データをダウンロードし、複数のモデルをトレーニングするものです (あまり実用的ではないようです)。複数のモデルをトレーニングすることで、パラメータの融合を実行できます。

https://docs.ray.io/en/latest/using-ray-with-pytorch.html を参照してください。

4. 結論

この記事では、効率的な Python 分散コンピューティング フレームワーク Ray を紹介します。お役に立てば幸いです。要約すると:

  • Ray は、カリフォルニア大学バークレー校 RISELab によって新たに立ち上げられた高性能分散実行フレームワークです。 Spark も Berkeley によって生産されています。
  • Rayアーキテクチャの重要なポイント: 2つのスケジューラ、ヘッドノードとワーカーノード、コンピューティングのフォールトトレランスを確保するためのGCSグローバル状態制御
  • Rayアプリケーションはシンプルです: @ray.remoteがタスクを分散タスクに変換し、x.remoteがタスクを送信し、get/waitが結果を取得します
  • クラスターは存在しません: レイ開始
  • Rayは、依存型DAG、ステートフルアクター、ディープラーニングサポートなど、複数のタスクをサポートします。
  • 継続的に拡充されるライブラリ: RaySERVE、RaySGD、RayTune、Ray data、rllib

<<:  クラウドネイティブ時代の自動かつインテリジェントな可観測性の構築をリードする Dynatrace が、Amazon Web Services China Online Summit でデビュー

>>:  便利な車充電の時代が到来しました。 Huawei CloudがJiediantongに「スマート」充電を提供

推薦する

プロメテウス - 特別プロモーションの新波/50% オフ/OVZ/XEN/KVM/ダラス/ミラノ

プロメテウスは再び取り組みを始めました。今回は、openvz、KVM、XEN、ダラス、ミラノのデータ...

九合クラウド:国際アリババクラウドアカウントのセルフサービス登録、再チャージ、管理。手作業を待つ必要がなく、すべてセルフサービス。

クラウドに移行する企業であれ、サーバーを購入する個人であれ、アリババクラウドの国際版はますます多くの...

Weiboマーケティングの時代に、役立つWeiboマーケティング手法はあるのでしょうか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeibo は、企業のニ...

マーケティングテクニック - 「バンドル販売」についての簡単な説明

最近、「No Man's Land」という映画が公開されました。皆さんはご覧になったかどうか...

Baiduウェブマスタープラットフォームからの最新の発表:リンクの販売も影響を受ける

admin5.com が11月5日に報じたところによると、百度ウェブマスタープラットフォームは10月...

ハイブリッド クラウドの 4 つのハイブリッド モードの特徴は何ですか?

ハイブリッドクラウドとは何ですか? [[434436]]ハイブリッド クラウドとは、パブリック クラ...

データベースをAmazon Web Servicesに簡単に移行

今日では、企業はデータベースなしではクラウドに移行できません。ただし、クラウド上にはさまざまな種類の...

ウェブサイト分析レポートで適切な統計チャートを選択する方法

さまざまなウェブサイト分析ツールによって収集されるデータは大きく異なるため、これらのデータに基づいて...

SEO に関するジョーク: Discuz フォーラムのカスタマイズに関する開発の考え方

みなさんこんにちは、私は朱偉坤です。まずは、私の近況を心配してくださる多くの友人に感謝したいと思いま...

広州でウェブサイトを構築するにはどれくらいの費用がかかりますか?サーバーの選択方法は?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています普通の顧客...

実用記事 | 「知乎チャンネル配信戦略」を徹底分析!

私が Zhihu に対して抱いた第一印象は、ずっと前に尋ねた質問から生まれました。 「あなたにとって...

動的 URL と SEO ランキング

動的 URL とは、疑問符を含む URL を指します。特にルールはなく、見た目も非常に乱雑です。もち...

高品質な外部リンク構築:Baiduの経験と外部リンクスキル

ウェブマスターがウェブサイトを最適化するときは、高品質の外部リンクを探す必要があります。外部リンクの...