分散型 MaxFrame ジョブにおけるサードパーティ Python 依存関係の管理では、通常、各実行前に手動でパッケージを MaxCompute にアップロードする必要があります。自動パッケージングサービスはこの手順を不要にします:コード内で with_python_requirements を使用して依存関係を宣言すると、MaxFrame がランタイム時に自動的に依存関係を解決・バンドルします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
MaxCompute に接続された MaxFrame セッション
(オンプレミス版 MaxFrame クライアントを使用する場合)MaxFrame SDK バージョン V0.1.0b5 以降。設定手順については、「事前準備」をご参照ください。
仕組み
UDF に
@with_python_requirementsデコレータを適用し、関数が必要とするパッケージをリスト形式で指定します。ジョブ実行時、MaxFrame が PyPI から指定されたパッケージを解決し、ジョブ環境にバンドルします。
後続の実行では、パッケージ化済みの結果が既にキャッシュされている場合、MaxFrame は再パッケージングをスキップします。
パッケージングは初回実行時にトリガーされます。force_rebuild=False の場合、一時リソースとして保存されたキャッシュは毎日削除されます。このキャッシュがクリアされた場合、MaxFrame は次回実行時に自動的に再パッケージングを実行しますが、その分実行遅延が発生します。with_python_requirements を使用した依存関係の宣言
with_python_requirements デコレータは、自動パッケージングサービスを利用するためのエントリポイントです。
def with_python_requirements(
*requirements: str,
force_rebuild: bool = False,
prefer_binary: bool = False,
pre_release: bool = False,
): ...パラメーター
`requirements`(必須)
1つ以上の依存関係パッケージ指定子で、PEP 508 構文に従います — pip が使用するのと同じフォーマットです。
@with_python_requirements("scikit_learn>1.0", "xgboost>1.0")`force_rebuild`(任意、デフォルト値:False)
キャッシュ済みの依存関係を再パッケージングするかどうかを制御します。
| 値 | 動作 |
|---|---|
False(デフォルト) | キャッシュ済みの結果が存在する場合は再パッケージングをスキップします。キャッシュされたパッケージは 一時リソース として保存され、毎日削除されます。 |
True | 最新の PyPI イメージバージョンを使用して常に再パッケージングを行います。結果は 長期リソース として保存され、自動的に削除されません。 |
開発および反復的なテストでは、デフォルトの False を維持してください。force_rebuild=True を指定すると、最新のパッケージバージョンへの強制アップグレードが実行され、結果が長期リソースとして保存されます。
force_rebuild=False の場合、一時リソースは毎日削除されます。実行間でキャッシュがクリアされた場合、MaxFrame は自動的に再パッケージングを実行しますが、その分次の実行に遅延が発生します。`prefer_binary`(任意、デフォルト値:False)
ソースディストリビューションではなく、事前にビルド済みのバイナリホイールファイルを優先するかどうかを制御します。
| 値 | 動作 |
|---|---|
False(デフォルト) | 優先度なし。pip が通常通り最適なマッチを解決します。 |
True | バイナリホイールを優先します。これは pip に --prefer-binary オプションを渡すのと同等です。 |
バイナリホイールを優先するとパッケージングが高速化されますが、選択されるバージョンが最新リリースとは限らない場合があります。
`pre_release`(任意、デフォルト値:False)
Alpha や Beta などのプレリリース版パッケージバージョンをパッケージング対象とするかどうかを制御します。
| 値 | 動作 |
|---|---|
False(デフォルト) | 安定版リリースのみをパッケージング対象とします。 |
True | Alpha および Beta リリースも含めます。 |
例
以下の例では、with_python_requirements を使用して、DataFrame の apply ジョブに jieba、cloudpickle、pandas を注入しています。
import os
import maxframe.dataframe as md
from maxframe import new_session
from maxframe.udf import with_python_requirements
from odps import ODPS
# ODPS クライアントを初期化します。
# 認証情報を環境変数から読み込みます — コード内に AccessKey ID および
# AccessKey Secret をハードコーディングしないでください。
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='your-default-project',
endpoint='your-end-point',
)
session = new_session(o)
data = [["abcd"], ["efgh"], ["ijkl"], ["mno"]]
md_df = md.DataFrame(data, columns=["col1"])
# 依存関係を宣言します。MaxFrame がランタイム時に自動的にパッケージ化します。
@with_python_requirements("jieba==0.40 cloudpickle pandas")
def process(row):
import jieba
row["col1"] = row["col1"] + "_" + jieba.__version__
return row
md_result = (
md_df.apply(
process,
axis=1,
result_type="expand",
output_type="dataframe",
dtypes=md_df.dtypes.copy(),
)
.execute()
.fetch()
)以下のプレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 |
|---|---|
your-default-project | ご利用の MaxCompute プロジェクト名 |
your-end-point | ご利用の MaxCompute エンドポイント |
よくある質問
パッケージングはいつ実行されますか?
パッケージングは初回ジョブ実行の開始時にトリガーされます。パッケージ化済みの結果が既にキャッシュされている場合、MaxFrame は再パッケージングをスキップし、ジョブは即座に開始されます。
次の実行前にキャッシュされたパッケージが削除された場合はどうなりますか?
force_rebuild=False の場合、キャッシュされたパッケージは一時リソースとして保存され、毎日削除されます。次の実行前に削除された場合、MaxFrame は自動的に再パッケージングを実行します。これによりその実行に遅延が発生しますが、ジョブが失敗することはありません。
複数回の実行で最新のパッケージバージョンを確実に使用するにはどうすればよいですか?
force_rebuild=True を設定してください。MaxFrame は最新の PyPI イメージバージョンを使用して再パッケージングを行い、結果を自動的に削除されない長期リソースとして保存します。