playbooks/roles/ood-applications/files/bc_amlsdk/template/amlwrapperfunctions.py (109 lines of code) (raw):

import os import random import string from os.path import exists from azure.ai.ml import MLClient from azure.identity import AzureCliCredential from azure.ai.ml.entities import Workspace from azure.ai.ml.entities import AmlCompute from azure.ai.ml import command, MpiDistribution class EnvSetup: subscription_id = "" location = "" resource_group = "" workspace_name = "" amlenv = "" machine_type = "" max_instances = "" ml_client = None workspace = None envsetup = EnvSetup() def get_random_string(length): letters = string.ascii_lowercase return ''.join(random.choice(letters) for i in range(length)) def login(): print("Login into azure via browser") os.system("az login --output none") def setupenv_ws(): ml_client = MLClient(AzureCliCredential(), envsetup.subscription_id, envsetup.resource_group) ws = Workspace( name=envsetup.workspace_name, location=envsetup.location, display_name="azhop aml sdk integration", description="This example shows azhop aml sdk integration", hbi_workspace=False, tags=dict(purpose="demo") ) ws = ml_client.workspaces.begin_create(ws).result() # print(ws) return ws, ml_client def setupenv_cluster(): credential = AzureCliCredential() try: ml_client = MLClient.from_config(credential=credential) except Exception as ex: client_config = { "subscription_id": envsetup.subscription_id, "resource_group": envsetup.resource_group, "workspace_name": envsetup.workspace_name, } import json import os config_path = ".azureml/config.json" os.makedirs(os.path.dirname(config_path), exist_ok=True) with open(config_path, "w") as fo: fo.write(json.dumps(client_config)) ml_client = MLClient.from_config( credential=credential, path=config_path) gpu_compute_target = "gpu-cluster" try: ml_client.compute.get(gpu_compute_target) except Exception: print("Creating a new compute target...") compute = AmlCompute( name=gpu_compute_target, size=envsetup.machine_type, min_instances=0, max_instances=envsetup.max_instances ) ml_client.compute.begin_create_or_update(compute).result() return ml_client def setupenv(subscription_id, location, resource_group, workspace_name, amlenv, machine_type, max_instances): envsetup.subscription_id = subscription_id envsetup.location = location envsetup.resource_group = resource_group envsetup.workspace_name = workspace_name envsetup.amlenv = amlenv envsetup.machine_type = machine_type envsetup.max_instances = max_instances print("Setting up environment...") ws, ml_client = setupenv_ws() envsetup.workspace = ws envsetup.ml_client = ml_client ml_client = setupenv_cluster() envsetup.ml_client = ml_client print("Environment ready for job submission") def runjob(filename, job_inputs): print("Job submitted to AzureML...") codedir = "./src/" full_command = "python "+filename+" "+job_inputs filename = codedir+filename if not exists(filename): print("Provided file does not exist:", filename) return None, None job_display_name = "azhop-aml-" + get_random_string(6) job = command( code=codedir, command=full_command, environment=envsetup.amlenv, compute="gpu-cluster", instance_count=envsetup.max_instances, distribution=MpiDistribution(process_count_per_instance=1), display_name=job_display_name ) job_handler = envsetup.ml_client.create_or_update(job) if job_handler: print("Returning job handler to check its status. Job display name:", job_display_name) return job_handler, envsetup.ml_client