Argo Workflows は、定期タスク、機械学習、ETL に広く使用されていますが、YAML の定義は習得が難しい場合があります。Hera Python SDK を使用すると、Python でワークフローを構築でき、複雑なタスクのサポート、テストの簡素化、Python エコシステムとのシームレスな統合が可能になります。このトピックでは、Python SDK を使用して大規模な Argo Workflows を構築する方法について説明します。
背景情報
Argo Workflows は、オープンソースの Kubernetes ネイティブツールであり、柔軟なタスク依存関係を持つ複雑なワークフローをオーケストレーションします。
ユースケースには、定期タスク、機械学習、シミュレーション、科学計算、ETL、モデルトレーニング、CI/CD などが含まれます。Argo Workflows は YAML を使用してワークフローを定義しますが、YAML の厳密なインデントと階層構造は、複雑なワークフローを扱う際の習得を難しくしています。
Hera は、Argo Workflows を構築およびサブミットするための Python SDK であり、データサイエンティストは YAML の代わりに Python で作業できます。
作成方法の比較
|
|
YAML |
Hera |
|
シンプルさ |
高 |
高、コード行数が少ない |
|
複雑なワークフローの作成 |
困難 |
簡単。YAML の構文エラーを回避できます。 |
|
Python エコシステムとの統合 |
困難 |
簡単。Python ライブラリにアクセスできます。 |
|
テスト容易性 |
困難、構文エラーが発生しやすい |
簡単。テストフレームワークにより、コードの品質と保守性が向上します。 |
Hera は Python エコシステムと Argo Workflows の橋渡しをし、YAML の複雑さを伴わずに大規模なタスクのオーケストレーションを可能にします。以下の例では Hera を使用します。
クラスターの作成とトークンの取得
-
Argo ワークフロークラスターを作成し、次に Argo Server を有効にしてワークフローコンソールにアクセスします。
-
クラスタートークンを作成します。
kubectl create token default -n default
Hera を使用したワークフローのサブミット
-
Hera をインストールします。
pip install hera -
ワークフローを作成してサブミットします。
シンプルな DAG ダイヤモンド
DAG ダイヤモンドは、タスクが分岐し、再び合流する一般的なパターンです。この例では、タスク A が最初に実行され、次に B と C が並行して実行され、両方が完了した後にタスク D が実行されます。
-
simpleDAG.pyという名前のファイルを作成し、次の内容を記述します。# 必要なパッケージをインポートします。 from hera.workflows import DAG, Workflow, script from hera.shared import global_config import urllib3 urllib3.disable_warnings() # ホストアドレスとトークンを設定します。 global_config.host = "https://{{argo_server_IP}}:2746" global_config.token = "abcdefgxxxxxx" # 取得したトークンに置き換えます。 global_config.verify_ssl = False # @script デコレーターは Hera の重要な機能で、Python 関数をネイティブに近い形でオーケストレーションできます。 # これにより、Workflow や Steps のコンテキストマネージャーなど、Hera のコンテキスト内でデコレートされた関数を呼び出すことができます。 # この関数は、Hera のコンテキスト外でも通常通り実行されるため、ユニットテストを作成できます。 # この例では、入力メッセージを出力します。 @script(image="mirrors-ssl.aliyuncs.com/python:3.10") def echo(message: str): print(message) # Workflow は Argo の主要なリソースであり、Hera の主要なクラスです。テンプレートを保存し、エントリポイントを設定して実行します。 with Workflow( generate_name="dag-diamond-", entrypoint="diamond", namespace="default", ) as w: with DAG(name="diamond"): A = echo(name="A", arguments={"message": "A"}) # テンプレートを構築します。 B = echo(name="B", arguments={"message": "B"}) C = echo(name="C", arguments={"message": "C"}) D = echo(name="D", arguments={"message": "D"}) A >> [B, C] >> D # 依存関係を定義します:タスク B と C は A に依存し、タスク D は B と C に依存します。 # ワークフローを作成します。 w.create() -
ワークフローをサブミットします。
python simpleDAG.py -
[ワークフローコンソール] でタスクの DAG と結果を表示します。
ワークフロー
dag-diamond-g9v45は、ダイヤモンド型の DAG を示しています。ノード A が完了し、B と C が並行して実行され、D で合流します。すべてのノードが正常に実行されたことを示しています。
MapReduce
この例では、DAG テンプレートを使用して MapReduce を実装します。タスクを並列の map ステップに分割し、その結果を reduce ステップで集約します。各ステップは Python の関数です。
-
アーティファクトを設定します。
-
map-reduce.pyという名前のファイルを作成し、次の内容を記述します。 -
ワークフローをサブミットします。
python map-reduce.py -
[ワークフローコンソール] でタスクの DAG と結果を表示します。[WORKFLOW DETAILS] ページで、DAG には
splitノード、4 つの並列mapノード、およびreduceノードがすべて正常に実行されたこと (緑のチェックマーク) が示されています。
-
関連ドキュメント
-
Hera ドキュメント:
-
YAML デプロイメント例:
-
シンプルなダイヤモンド (YAML): dag-diamond.yaml
-
MapReduce (YAML): map-reduce.yaml
-