

# ファイルと Python ライブラリを Ray ジョブに提供する
<a name="edit-script-ray-env-dependencies"></a>

**重要**  
AWS Glue for Ray は新規のお客様には公開されなくなりました。既存のお客様は、通常どおりサービスを引き続き使用できます。詳細については、「[AWS Glue for Ray のサポート終了](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)」を参照してください。

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

## Ray ジョブで提供されるモジュール
<a name="edit-script-ray-modules-provided"></a>

次のパッケージを使用して、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 ジョブへのファイルの提供
<a name="edit-script-ray-working-directory"></a>

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

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

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

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

`working_dir` の詳細については、[Ray のドキュメント](https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#remote-uris)を参照してください。この機能は、Ray のネイティブの機能と同じように動作します。

## Ray ジョブ用の Python モジュールを追加する
<a name="edit-script-ray-python-libraries-additional"></a>

**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 コードを含める](#edit-script-ray-packaging) のガイドラインに従います。

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

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

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

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

**制限事項**

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

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

## Ray ジョブに Python コードを含める
<a name="edit-script-ray-packaging"></a>

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}}
   ```

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

   ```
   ls -AR {{temp_dir}}
   # my_file_1.py
   # my_file_2.py
   ```

1. zip を使用して一時フォルダを圧縮します。これを行うには、次のコマンドを使用します。

   ```
   zip -r {{zip_file}}.zip {{temp_dir}}
   ```

1. ファイルが適切にパッケージ化されていることを確認します。`{{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}}
   ```

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

   ```
   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
   ```

1. zip を使用して一時フォルダを圧縮します。これを行うには、次のコマンドを使用します。

   ```
   zip -r {{zip_file}}.zip {{temp_dir}}
   ```

1. ファイルが適切にパッケージ化されていることを確認します。`{{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
   ```