クイック スタート: Python を使用して Batch プールを作成し、ジョブを実行する

このクイックスタートでは、Python 向け Azure Batch クライアント ライブラリを使用するアプリを実行して、Azure Batch の使用を開始する方法について説明します。 Python アプリの機能は以下のとおりです。

  • Batch タスク処理に使用するために、Azure Storage Blob コンテナーに複数の入力データ ファイルをアップロードします。
  • Ubuntu 20.04 LTS OS を実行する 2 つの仮想マシン (VM) またはコンピューティング ノードのプールを 1 つ作成します。
  • ノードで実行するジョブと 3 つのタスクを作成します。 各タスクは、Bash シェル コマンド ラインを使用して入力ファイルの 1 つを処理します。
  • タスクから返される出力ファイルを表示します。

このクイックスタートを完了すると、Batch サービスの主要な概念を理解し、より現実的でより大規模なワークロードで Batch を使用できるようになります。

前提条件

アプリを実行する

このクイックスタートを完了するには、Python アプリをダウンロードまたは複製し、アカウントの値を指定し、アプリを実行して出力を確認します。

アプリをダウンロードまたは複製する

  1. GitHub から Azure Batch Python クイック スタートのアプリをダウンロードまたは複製します。 次のコマンドを使用して、Git クライアントでサンプル アプリ リポジトリを複製します。

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. batch-python-quickstart/src フォルダーに切り替えて、pip を使用して必要なパッケージをインストールします。

    pip install -r requirements.txt
    

アカウント情報を指定する

Python アプリでは、Batch アカウントとストレージ アカウントの名前、アカウント キーの値、Batch アカウント エンドポイントを使用する必要があります。 この情報は、Azure portal、Azure API、またはコマンド ライン ツールから取得できます。

Azure portal からアカウント情報を取得するには:

  1. Azure の検索バーで、Batch アカウント名を検索して選択します。
  2. Batch アカウント ページで、左側のナビゲーションから [キー] を選択します。
  3. [キー] ページで、次の値をコピーします。
  • Batch アカウント
  • アカウント エンドポイント
  • プライマリ アクセス キー
  • Storage account name (ストレージ アカウント名)
  • Key1

ダウンロードした Python アプリで、config.py ファイル内の次の文字列を編集して、コピーした値を指定します。

BATCH_ACCOUNT_NAME = '<batch account>'
BATCH_ACCOUNT_KEY = '<primary access key>'
BATCH_ACCOUNT_URL = '<account endpoint>'
STORAGE_ACCOUNT_NAME = '<storage account name>'
STORAGE_ACCOUNT_KEY = '<key1>'

重要

運用環境で使用する場合は、アプリ ソースでアカウント キーを公開することはお勧めしません。 資格情報へのアクセスを制限し、コード内で変数または構成ファイルを使用して参照する必要があります。 Batch アカウントとストレージ アカウントのキーを Azure Key Vault に格納することをお勧めします。

アプリを実行して出力を表示する

アプリを実行して、Batch ワークフローの動作を確認します。

python python_quickstart_client.py

一般的な実行時間は約 3 分です。 最初のプール ノードの設定に最も時間がかかります。

次の例のような出力がアプリから返されます。

Sample start: 11/26/2012 4:02:54 PM

Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [PythonQuickstartPool]...
Creating job [PythonQuickstartJob]...
Adding 3 tasks to job [PythonQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

プールのコンピューティング ノードの起動中に、Monitoring all tasks for 'Completed' state, timeout in 00:30:00... で一時停止があります。 タスクが作成されると、Batch はそれらをキューに入れてプールで実行します。 最初のコンピューティング ノードが使用可能になるとすぐに、最初のタスクがノードで実行されます。 ノード、タスク、ジョブの状態は、Azure portal の Batch アカウント ページから監視できます。

各タスクが完了すると、次の例のような出力が表示されます。

Printing task output...
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard output:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...

コードの確認

コードを確認して、Azure Batch Python クイック スタートの手順を把握します。

サービス クライアントを作成してリソース ファイルをアップロードする

  1. アプリは、BlobServiceClient オブジェクトを作成して、ストレージ アカウントとやり取りします。

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. アプリでは、blob_service_client 参照を使用して、ストレージ アカウントにコンテナーを作成し、そのコンテナーにデータ ファイルをアップロードします。 ストレージ内のファイルは、Batch の ResourceFile オブジェクトとして定義されており、Batch が後でコンピューティング ノードにダウンロードできます。

    input_file_paths = [os.path.join(sys.path[0], 'taskdata0.txt'),
                        os.path.join(sys.path[0], 'taskdata1.txt'),
                        os.path.join(sys.path[0], 'taskdata2.txt')]
    
    input_files = [
        upload_file_to_container(blob_service_client, input_container_name, file_path)
        for file_path in input_file_paths]
    
  3. アプリは BatchServiceClient オブジェクトを作成して、Batch アカウントでプール、ジョブ、タスクを作成および管理します。 Batch クライアントでは共有キー認証を使用します。 Batch では Microsoft Entra 認証もサポートされています。

    credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
            config.BATCH_ACCOUNT_KEY)
    
        batch_client = BatchServiceClient(
            credentials,
            batch_url=config.BATCH_ACCOUNT_URL)
    

コンピューティング ノードのプールの作成

Batch プールを作成するために、このアプリでは PoolAddParameter クラスを使用して、ノードの数、VM のサイズ、プールの構成を設定します。 次の VirtualMachineConfiguration オブジェクトは、Ubuntu Server 20.04 LTS Azure Marketplace イメージに対する ImageReference を指定します。 Batch では、Linux および Windows Server のさまざまな Marketplace イメージと、カスタム VM イメージもサポートされています。

POOL_NODE_COUNTPOOL_VM_SIZE は定義済みの定数です。 アプリは、サイズ Standard_DS1_v2 の 2 つのノードで構成されるプールを作成します。 このクイックスタートにおいて、このサイズはパフォーマンスとコストのバランスが取れています。

pool.add メソッドは、プールを Batch サービスを送信します。

new_pool = batchmodels.PoolAddParameter(
        id=pool_id,
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="canonical",
                offer="0001-com-ubuntu-server-focal",
                sku="20_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 20.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

Batch ジョブの作成

Batch ジョブは、1 つ以上のタスクの論理グループです。 ジョブには、優先度やタスクの実行対象プールなど、タスクに共通する設定が含まれています。

アプリでは、JobAddParameter クラスを使用して、プールにジョブを作成します。 job.add メソッドにより、指定した Batch アカウントにジョブが追加されます。 最初、ジョブにはタスクがありません。

job = batchmodels.JobAddParameter(
    id=job_id,
    pool_info=batchmodels.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

タスクの作成

Batch には、アプリやスクリプトを計算ノードにデプロイする複数の方法が用意されています。 アプリは、TaskAddParameter クラスを使用して、タスク オブジェクトの一覧を作成します。 各タスクでは、command_line パラメーターを使ってアプリまたはスクリプトを指定し、入力ファイルを処理します。

次のスクリプトでは、Bash シェルの cat コマンドを実行してテキスト ファイルを表示して、入力 resource_files オブジェクトを処理します。 その後、アプリは task.add_collection メソッドを使用して各タスクをジョブに追加します。これにより、コンピューティング ノードで実行するタスクがキューに入れられます。

tasks = []

for idx, input_file in enumerate(resource_input_files):
    command = f"/bin/bash -c \"cat {input_file.file_path}\""
    tasks.append(batchmodels.TaskAddParameter(
        id=f'Task{idx}',
        command_line=command,
        resource_files=[input_file]
    )
    )

batch_service_client.task.add_collection(job_id, tasks)

タスク出力の表示

アプリは、タスクの状態を監視し、タスクが完了したことを確認します。 各タスクが正常に実行されると、タスク コマンドの出力が stdout.txt ファイルに書き込まれます。 その後、完了した各タスクの stdout.txt ファイルがアプリに表示されます。

tasks = batch_service_client.task.list(job_id)

for task in tasks:

    node_id = batch_service_client.task.get(job_id, task.id).node_info.node_id
    print(f"Task: {task.id}")
    print(f"Node: {node_id}")

    stream = batch_service_client.file.get_from_task(
        job_id, task.id, config.STANDARD_OUT_FILE_NAME)

    file_text = _read_stream_as_string(
        stream,
        text_encoding)

    if text_encoding is None:
        text_encoding = DEFAULT_ENCODING

    sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = text_encoding)
    sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = text_encoding)

    print("Standard output:")
    print(file_text)

リソースをクリーンアップする

アプリは自動的に、作成された入力用ストレージ コンテナーを削除し、Batch プールとジョブを削除するためのオプションを表示します。 プールとノードでは、ジョブが実行されていない場合でも、ノードの実行中は料金が発生します。 プールは不要になったら、削除してください。

Batch リソースが不要になったら、そのリソースを含むリソース グループを削除できます。 Azure portal のリソース グループ ページの上部で、[リソース グループの削除] を選択します。 [リソース グループの削除] 画面で、リソース グループ名を入力し、[削除] を選択します。

次のステップ

このクイックスタートでは、Batch Python API を使用して Batch プール、ノード、ジョブ、タスクを作成するアプリを実行しました。 ジョブによって、リソース ファイルがストレージ コンテナーにアップロードされ、ノードでタスクが実行され、ノードからの出力が表示されました。

Batch サービスの主要な概念を理解できたので、より現実的でより大規模なワークロードを使用して Batch を使用する準備が整いました。 Azure Batch の詳細を確認し、実際のアプリケーションで並列ワークロードを詳しく見てみるには、Batch Python のチュートリアルに進んでください。