分散機械学習フレームワーク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が女性の服を直接「脱がす」!

今朝、またひとつのAI奇抜なアプリケーションが公開されました!アルゴリズムを使って女性の服を直接「脱...

ChatGPTが企業の収益向上にどのように役立つか

ここ数か月、生成型人工知能(ChatGPT)に関するニュースがほぼ毎日のように報道されています。突然...

触覚を感知し、自己治癒するロボットが現実になりつつある

人間の皮膚は柔軟性があり、触り心地がよく、自己治癒力があるため、複製するのが難しいです。しかし、科学...

RPAにより業務効率が大幅に向上、40%の企業が効果を確認

効率性、俊敏性、生産性に対する需要が高まるにつれ、新しいテクノロジーとアプリケーションが、企業と企業...

...

ドーパミンが来る! Google が新しい強化学習フレームワーク Dopamine を発表

Google は、TensorFlow をベースとし、柔軟性、安定性、再現性、高速ベンチマークを提供...

...

2022 年の人工知能のトレンド: AI はあなたにどのような影響を与えるでしょうか?

ディアナ・リッチー翻訳者: ブガッティレビュアー: Qianshan 2022年以降、人工知能(AI...

研究により、脳外科手術の訓練においてAIが専門のインストラクターよりも優れていることが判明

COVID-19パンデミックは、医療研修に課題と機会をもたらしています。遠隔学習技術は、さまざまな分...

...

5G時代、移動ロボットは知能でどのように勝利できるのでしょうか?

移動ロボットは、環境認識、動的意思決定と計画、行動制御と実行などの複数の機能を統合した総合システムで...

人間の介入によってモデルのパフォーマンスをどのように向上できるでしょうか?この記事を読んでみてください

金融業界など、一部の業界は誤検知に非常に敏感です。クレジットカード詐欺を検出する際に、検出システムが...

AIビッグモデルにおける言語の不平等:英語は最も安価、他の言語ははるかに高価

7月31日、ユーザーが使用する言語が大規模言語モデル(LLM)のコストに大きな影響を与え、英語話者と...

機械学習のテストセットをスケールアップする方法

[[385223]]テスト セットのヒル クライミングは、トレーニング セットに影響を与えたり、予測...