ファイルと Python ライブラリを Ray ジョブに提供する - AWS Glue

ファイルと Python ライブラリを Ray ジョブに提供する

このセクションでは、AWS Glue の Ray ジョブで Python ライブラリを使用するために必要な情報を提供します。すべての Ray ジョブにデフォルトで含まれている、特定の共通ライブラリを使用できます。また、Ray ジョブに独自の Python ライブラリを指定することもできます。

Ray ジョブで提供されるモジュール

次のパッケージを使用して、Ray ジョブでデータ統合ワークフローを実行できます。これらのパッケージは Ray ジョブで、デフォルトで使用できます。

AWS Glue version 4.0

AWS Glue 4.0 では、Ray (Ray2.4 ランタイム) 環境で次のパッケージが利用可能です。

  • boto3 == 1.26.133

  • ray == 2.4.0

  • pyarrow == 11.0.0

  • pandas == 1.5.3

  • numpy == 1.24.3

  • fsspec == 2023.4.0

このリストには、ray[data] == 2.4.0 でインストールされるすべてのパッケージが含まれます。Ray データは追加設定なしにサポートされます。

Ray ジョブへのファイルの提供

--working-dir パラメータを使用して Ray ジョブにファイルを提供できます。このパラメータには、Amazon S3 でホストされている .zip ファイルへのパスを指定します。.zip ファイル内では、ファイルは最上位の 1 つのディレクトリに含まれている必要があります。最上位には、他のファイルがないようにします。

ファイルは、スクリプトの実行を開始する前に各 Ray ノードに配布されます。それにより、各 Ray ノードが利用できるディスク容量にどのような影響が出るかを考えます。使用できるディスク容量は、ジョブ構成で設定された WorkerType により決まります。ジョブに大量のデータを提供したい場合、このメカニズムは適切なソリューションではありません。データをジョブに提供する方法の詳細については、「Ray ジョブのデータに接続する」を参照してください。

あたかもディレクトリが working_dir パラメータで Ray に提供されたかのように、ファイルにアクセスできるようになります。例えば、.zip ファイルの最上位ディレクトリにある sample.txt という名前のファイルを読み取るには、次のように呼び出すことができます。

@ray.remote def do_work(): f = open("sample.txt", "r") print(f.read())

working_dir の詳細については、Ray のドキュメントを参照してください。この機能は、Ray のネイティブの機能と同じように動作します。

Ray ジョブ用の Python モジュールを追加する

PyPI の追加モジュール

Ray ジョブでは、Python Package Installer (pip3) を使用して、Ray スクリプトで使用するモジュールを追加でインストールします。--pip-install パラメータでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。

例えば、更新や新しい scikit-learn モジュールの追加には、次のキー値ペアを使用します。

"--pip-install", "scikit-learn==0.21.3"

カスタムモジュールまたはカスタムパッチがある場合は、--s3-py-modules パラメータを使用して Amazon S3 から自分のライブラリをディストリビューションできます。ディストリビューションは、アップロード前に再パッケージ化と構築が必要になる場合があります。Ray ジョブに Python コードを含める のガイドラインに従います。

Amazon S3 のカスタムディストリビューション

カスタムディストリビューションは、依存関係に関する Ray パッケージのガイドラインに従う必要があります。これらのディストリビューションの構築方法については、次のセクションをご覧ください。Ray での依存関係の設定方法に関する詳細は、Ray のドキュメントの「Environment Dependencies」(環境の依存関係) を参照してください。

コンテンツを評価した後にカスタムディストリビューションを含めるには、ジョブの IAM ロールで利用できるバケットにディストリビューションをアップロードします。パラメータの設定で、Python zip アーカイブへの Amazon S3 パスを指定します。複数のディストリビューションを指定する場合は、カンマで区切ります。例:

"--s3-py-modules", "s3://s3bucket/pythonPackage.zip"

制約事項

Ray ジョブは、ジョブ環境でのネイティブコードのコンパイルをサポートしていません。Python の依存関係がネイティブのコンパイル済みコードに推移的に依存している場合、これにより制限される可能性があります。Ray ジョブは提供されたバイナリを実行できますが、Linux on ARM64 用にコンパイルする必要があります。つまり、aarch64manylinux wheel の内容を使用できる場合があるということです。Ray の基準に合わせて wheel を再パッケージ化することで、ネイティブの依存関係をコンパイルされた形式で提供できます。通常、これは dist-info フォルダを削除して、アーカイブのルートにあるフォルダが 1 つだけになるようにすることを意味します。

このパラメータを使用して ray または ray[data] のバージョンをアップグレードすることはできません。Ray の新しいバージョンを使用するには、ジョブのランタイムフィールドを、そのサポートをリリースした後に変更する必要があります。サポートされている Ray バージョンの詳細については、「AWS Glue バージョン」を参照してください。

Ray ジョブに Python コードを含める

Python Software Foundation は、さまざまなランタイムで使用できるよう、Python ファイルをパッケージ化するための標準化された機能を提供しています。Ray では、注意すべきパッケージ基準に制限が設けられています。AWS Glue が、Ray に指定された以外のパッケージ基準を指定することはありません。次の手順では、シンプルな Python パッケージのパッケージ化に関する標準的なガイダンスを提供します。

ファイルを .zip アーカイブにパッケージ化します。1 つのディレクトリがアーカイブのルートにある必要があります。アーカイブのルートレベルにその他のファイルがあると、予期しない動作が発生する可能性があります。ルートディレクトリはパッケージで、インポート時に Python コードを参照するためにその名前が使用されます。

--s3-py-modules を使用してこの形式のディストリビューションを Ray ジョブに提供すると、Ray スクリプト内のパッケージから Python コードをインポートできます。

パッケージは、単一の Python モジュールにいくつかの Python ファイルを提供することも、多数のモジュールを一緒にパッケージ化することもできます。PyPI のライブラリなどの依存関係を再パッケージ化するときは、それらのパッケージ内の隠しファイルやメタデータディレクトリを確認してください

警告

OS の動作によっては、これらのパッケージ化手順に正しく従うことが難しくなります。

  • OSX では、__MACOSX などの隠しファイルが zip ファイルの最上位に追加されることがあります。

  • Windows では、ファイルが zip 内のフォルダに自動的に追加され、意図せずにネストされたフォルダが作成されることがあります。

以下の手順は、Info-Zip zip および zipinfo ユーティリティのディストリビューションを提供する Amazon Linux 2 または類似の OS でファイルを操作していることを前提としています 予期しない動作を防ぐため、これらのツールを使用することをお勧めします。

Ray で使用する Python ファイルをパッケージ化するには

  1. パッケージ名で一時ディレクトリを作成し、作業ディレクトリが親ディレクトリであることを確認します。これを行うには、次のコマンドを使用します。

    cd parent_directory mkdir temp_dir
  2. ファイルを一時ディレクトリにコピーし、ディレクトリ構造を確認します。このディレクトリの内容は、Python モジュールとして直接アクセスされます。これを行うには、次の コマンドを使用します。

    ls -AR temp_dir # my_file_1.py # my_file_2.py
  3. zip を使用して一時フォルダを圧縮します。これを行うには、次のコマンドを使用します。

    zip -r zip_file.zip temp_dir
  4. ファイルが適切にパッケージ化されていることを確認します。zip_file.zip は作業ディレクトリにあるはずです。次のコマンドで検査できます。

    zipinfo -1 zip_file.zip # temp_dir/ # temp_dir/my_file_1.py # temp_dir/my_file_2.py

Python パッケージを Ray で使用できるように再パッケージ化するには。

  1. パッケージ名で一時ディレクトリを作成し、作業ディレクトリが親ディレクトリであることを確認します。これを行うには、次のコマンドを使用します。

    cd parent_directory mkdir temp_dir
  2. パッケージを解凍し、その内容を一時ディレクトリにコピーします。以前のパッケージング標準に関連するファイルを削除し、モジュールの内容のみを残します。以下のコマンドを実行して、ファイル構造が正しいことを確認します。

    ls -AR temp_dir # my_module # my_module/__init__.py # my_module/my_file_1.py # my_module/my_submodule/__init__.py # my_module/my_submodule/my_file_2.py # my_module/my_submodule/my_file_3.py
  3. zip を使用して一時フォルダを圧縮します。これを行うには、次のコマンドを使用します。

    zip -r zip_file.zip temp_dir
  4. ファイルが適切にパッケージ化されていることを確認します。zip_file.zip は作業ディレクトリにあるはずです。次のコマンドで検査できます。

    zipinfo -1 zip_file.zip # temp_dir/my_module/ # temp_dir/my_module/__init__.py # temp_dir/my_module/my_file_1.py # temp_dir/my_module/my_submodule/ # temp_dir/my_module/my_submodule/__init__.py # temp_dir/my_module/my_submodule/my_file_2.py # temp_dir/my_module/my_submodule/my_file_3.py