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

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

[[422916]]

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

1. レイとは何か

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

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

  • レイプロジェクト

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 =ゼロ.リモート((100, 100))  
  13. y_id =ゼロ.リモート((100, 100))  
  14. # 3番目のタスクを開始します。これは最初の2つのタスクが終了するまでスケジュールされません。  
  15. # 個のタスクが完了しました。  
  16. z_id =乗算.リモート(x_id、y_id)  
  17. # 結果を取得します。3 番目のタスクが完了するまでブロックされます。  
  18. z = ray.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 が range(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 もバークレーが開発したものです。
  • Rayアーキテクチャの重要なポイント: 2つのスケジューラ、ヘッドノードとワーカーノード、コンピューティングのフォールトトレランスを確保するためのGCSグローバル状態制御
  • Rayアプリケーションはシンプルです: @ray.remoteがタスクを分散タスクに変換し、x.remoteがタスクを送信し、get/waitが結果を取得します
  • クラスターは存在しません: レイ開始
  • Rayは、依存型DAG、ステートフルアクター、ディープラーニングサポートなど、複数のタスクをサポートします。
  • 継続的に拡充されるライブラリ: RaySERVE、RaySGD、RayTune、Ray data、rllib

<<:  今日のアルゴリズム: 文字列内の単語を反転する

>>:  金融ビジネスイノベーションを実現する自社開発グラフデータベースに基づくナレッジグラフ実装

ブログ    
ブログ    
ブログ    

推薦する

最大の効率: AIがソースコードを読み取って教えてくれる

みなさんこんにちは、カソンです。テクノロジー系のブログをよく読む友人なら、 Webpilot [1]...

機械学習では自然言語理解を解決できない

経験とデータに基づく革命統計革命は 1990 年代初頭に人工知能 (AI) に広がり、2000 年代...

...

...

賈陽青の新たな起業:AIGCプロンプトツールのリリース、SDXLを詳細にプレイするのに役立ついくつかの言葉

プロンプトの単語の書き方がわからなくても問題ありません。AIがお手伝いします。 PromptLLM ...

Python に基づく簡単な自然言語処理の練習

Python によるシンプルな自然言語処理この記事は、Python をベースにした簡単な自然言語処理...

...

...

教科書では学べない機械学習に関する12の「民間伝承」

[[264978]]ビッグデータダイジェスト制作出典: towardml編纂者:劉嘉偉、王元元、ウ...

ディープラーニング Pytorch フレームワーク Tensor

[[433522]] 1 テンソル刈り込み操作テンソル内の要素を範囲でフィルタリングする勾配クリッ...

AIGCの第一波の人員削減が到来

著者: 徐潔成校正:Yun Zhao誰も予想していなかったのは、人工知能の火が世界中に広がっていた時...

メッシのサッカーの試合とリーグ・オブ・レジェンドについての解説:OpenAI GPT-4ビジュアルAPIは開発者が新しい方法を作成するために使用されています

記事の冒頭では、サッカーの試合解説ビデオを見てみましょう。それは正しいように聞こえませんか?あなたの...

グーグル元会長「人工知能だけでは市場を創出できない」

[[321190]]販売員からトラック運転手、医師に至るまで、経済全体の多くの仕事や役割が人工知能...

大規模言語モデルの新しいレビューが発表されました。51ページの論文では、LLM分野の専門技術について説明しています。

大規模言語モデル (LLM) は、自然言語処理 (NLP) の分野で目覚ましい進歩を可能にし、幅広い...

独占 | R で Keras と TensorFlow を使用してディープラーニング モデルを構築する方法を教えます

[[197801]]導入: R と Python のどちらを選択するかは、常に熱く議論されているトピ...