Day 1 ~ N日間Rayを学ぶ / Python で分散コンピューティング~
前書き
毎日Rayとその周りの知識について、少しでも学習した記録を残していこうと思います。
RayだけでなくOS周りの知識もつけていきたいなと思います。
みなさんは、Rayをご存知でしょうか?
英語でもRayのブログを書いているんですが、調べていて日本語の記事が少ないのかな?と思ったので、日本語でも書いてみようかなというモチベーションです。
※英語版も同じですが、学習過程の記録なので理解が誤ってる可能性もありますが、誤りに気づいたらできるだけ修正もしていきたいと思います。。
Rayについては、オライリーから書籍が出ています。英語版ですが。。
- Scaling Python With Ray: Adventures in Cloud and Serverless Patterns
https://www.amazon.co.jp/gp/product/1098118804/ - Learning Ray: Flexible Distributed Python for Machine Learning
https://www.amazon.co.jp/gp/product/1098117220/
私はLearning Rayや公式ページを参考にしながら学習をしています。
早速Day1の内容へ入っていきます。
Rayとは何か?
1. Rayとは?
Rayは、分散コンピューティングをAIおよびPythonアプリケーションに適用するために設計されたフレームワークです。今はAnyscaleなどがスポンサーとなって開発が進んでいるようです。
Rayは、UC BerkeleyのRISELabの研究者によって開発され、特にAIタスク向けの分散コンピューティングの課題に取り組むために作成されました。既存のフレームワークではカバーされていない領域に焦点を当て、柔軟なワークロードの効率的な分散を行うことを目指しました。
研究者たちに効率的なワークロードの動作環境を提供しつつ、彼らが分散処理の実装やクラスターの詳細を気にせず、本業に専念できるようにしたい!と言う目的のために開発されました。
2. なんでRayを使うのか?
2-1. 機械学習の文脈で分散コンピューティングへの需要が増している理由
現代において、機械学習やその他さまざまなアプリケーションは、複数のマシン上で実行されるようになったため、複数のマシンでのクラスターでの分散コンピューティングが不可欠です。
特に、機械学習における分散コンピューティングへの需要が増しています。
以下は機械学習に分散コンピューティングを導入するモチベーションです:
- 機械学習に必要な演算の数が指数関数的に急増しており、CPU性能の向上よりも速いペースで増加しています。
- 機械学習のタスクは並列に処理できるため、分散コンピューティングを導入するのは合理的です。
このような動機からRayは開発されました。
しかし分散コンピューティングは複雑で難解です。では、それを効果的に抽象化するメカニズムが必要であり、個々のマシンやマシン間の相互作用を考慮せずに分散処理を実行できたらいいと思いませんか?
※ 機械学習にフォーカスしましたが、Rayは他のPythonベースのアプリケーションにも適用することができる柔軟さを持っています。
2-2. Pythonは並行および分散処理に向いていない
-
Global Interpreter Lock(GIL)
Pythonは、Global Interpreter Lock(GIL)と言う制約を抱えているために、並行および分散処理に向いていないと考えられることがあります。GILはスレッドごとに個別にロックをかけて実行を制御し、Pythonスレッドは一度に1つのCPUコアで実行され、複数のスレッドを使用してもパフォーマンスが向上しないことがあります。GILは、Pythonの最も広く使われている実装であるCPythonに導入されています。 -
GIL導入の目的
GIL が導入される目的は、メモリ管理を簡素化し、インタプリタの内部データ構造を保護することです。複数のスレッドが同時にデータにアクセスすると、そのデータに変更を加える際に発生するデータの同時実行競合と不整合が発生することがあります。GILはこれを防ぐ目的で導入されています。
また、GILが導入されているCPythonはPythonの最も一般的な公式実装の1つです。 -
GILが適用されないケース
以下のフレームワークやライブラリは、GILの例外の一例です。これらで書かれたコードは、マルチスレッド/プロセスで実行できます。
- NumPy:GILに影響を受けない高速な並列計算が可能な数値計算ライブラリ。
- multiprocessingモジュール:プロセス間通信を利用してGILの影響を回避するPythonモジュール。
- Cython:C言語のコードをPythonから呼び出すことができるライブラリで、GILに関与せずに高速な処理が可能です。
- asyncio:非同期処理をサポートするライブラリで、GILの制約を回避しながら複数のタスクを同時に実行できます。
2-3. 上記のフレームワーク/ライブラリに対するRayの利点は?
上記のライブラリコレクションは限られた条件下で分散処理を提供しますが、Rayは分散処理をより広く適用可能かつ柔軟に行うことができます。
-
一般的なPythonコードへの分散コンピューティングの提供: Rayは通常のPythonコードに分散コンピューティングを適用できるようにし、既存のコードベースを大幅に変更せずに分散処理を導入できます。
-
複数のマシンを用いた分散コンピューティングのサポート: Rayは複数のマシンでの分散処理をサポートし、複数のノードやクラスタを利用して大規模な計算を実行できます。
-
タスクとアクターのオーケストレーション: Rayはタスクとアクターという抽象化を提供し、これらの依存関係を自動的に管理します。タスクは独立した計算単位であり、アクターは状態を持つオブジェクトです。Rayはこれらを効率的にスケジュールし、必要なデータを供給することで分散処理を容易にします。
-
ハードウェアの柔軟な利用: Rayは異なるハードウェアに対して柔軟なリソースの割り当てを容易に行えます。例えば、高パフォーマンスな計算を実行するために効果的にGPUやCPUコアを割り当てることができます。
-
Pythonと相性の良いAPI: RayのAPIデザインはPythonのスタイルに合致しつつ、分散コンピューティングを簡潔に実現します。これにより、開発者は、使い慣れたPythonプログラミングアプローチを使用して分散処理を行えます。
-
多くのデータサイエンスライブラリとの統合: RayはNumPyやPandasなどのデータサイエンスライブラリとシームレスに統合します。これにより、既存のデータ処理コードをそのまま分散処理のシナリオに適用できます。
-
スケーラビリティと耐障害性: Rayはスケーラビリティに優れており、クラスタリソースやタスクのリトライを自動的に管理して耐障害性を向上させます。
3. Rayの提供カテゴリー
https://www.ray.io/ のページを見ると、Rayが今や様々な機能を提供していることに驚きました。Rayは分散コンピューティングそのものだけでなく、それを基盤にした便利なAPIも提供しています。Rayは以下の3つのレイヤーから構成されています。
- Ray Core: Rayフレームワークの基盤であり、Python用のAPIが提供されています。これにより、分散実行エンジンの中核が提供されます。
- Ray Artificial Intelligence Runtime (AIR): Ray Coreで動作するライブラリのセットです。データ処理からモデルのサービングまで、一般的な機械学習ワークロードに役立つ機能を提供します。
- エコシステム: 学習、モデルのデプロイメント、データ処理などのタスクに対する拡張可能なライブラリやフレームワークのコレクションです。これらのライブラリには、Rayネイティブのものだけでなく、PyTorch、scikit-learn、XGBoost、LightGBMなどのサードパーティライブラリも含まれており、Rayとの統合レベルが異なります。
データサイエンティストは便利なAPIである、Ray AIRを使用することもありますし、Ray CoreのAPIを使用して独自のツールをカスタマイズすることもできます。
冒頭でも触れましたが、私のRayへエントリーポイントは、Federated Learningを実現する、flwr(https://github.com/adap/flower) を使用した実装をする中で、Rayが使用されていることに気付いたことです。同じように、Rayのエコシステムから興味を持つ人も多いのではないかと想像します。
Discussion