Spuštění trénovací úlohy CNTK pomocí sady Azure Python SDK
V tomto článku si ukážeme jak používat sadu Azure Python SDK k trénování ukázkového modelu Microsoft Cognitive Toolkit (CNTK) ve službě Batch AI.
V tomto příkladu použijete databázi MNIST ručně zapsaných obrázků k trénování konvoluční neuronové sítě (CNN) na clusteru GPU s jedním uzlem.
Požadavky
Předplatné Azure – Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
Azure Python SDK – viz pokyny k instalaci. Tento článek vyžaduje alespoň balíček azure-mgmt-batchai verze 2.0.0.
Účet úložiště Azure – Viz Vytvoření účtu úložiště Azure.
Přihlašovací údaje instančního objektu Azure Active Directory – Viz Vytvoření instančního objektu pomocí rozhraní příkazového řádku.
Pomocí služby Azure Cloud Shell nebo Azure CLI zaregistrujte pro své předplatné poskytovatele prostředků služby Batch AI. Registrace poskytovatele může trvat až 15 minut.
az provider register -n Microsoft.BatchAI
Konfigurace přihlašovacích údajů
Přidejte do souboru skriptu následující kód a nahraďte FILL-IN-HERE
příslušnými hodnotami:
# credentials used for authentication
aad_client_id = 'FILL-IN-HERE'
aad_secret = 'FILL-IN-HERE'
aad_tenant = 'FILL-IN-HERE'
subscription_id = 'FILL-IN-HERE'
# credentials used for storage
storage_account_name = 'FILL-IN-HERE'
storage_account_key = 'FILL-IN-HERE'
# specify the credentials used to remote login your GPU node
admin_user_name = 'FILL-IN-HERE'
admin_user_password = 'FILL-IN-HERE'
# specify the location in which to create Batch AI resources
mylocation = 'eastus'
Mějte na paměti, že vložení přihlašovacích údajů do zdrojového kódu není vhodné a zde je použito, aby byl rychlý start jednodušší. Zvažte místo toho použití proměnných prostředí nebo samostatného konfiguračního souboru.
Vytvoření klienta Batch AI
Následující kód vytvoří objekt přihlašovacích údajů instančního objektu a klienta Batch AI:
from azure.common.credentials import ServicePrincipalCredentials
import azure.mgmt.batchai as batchai
import azure.mgmt.batchai.models as models
creds = ServicePrincipalCredentials(
client_id=aad_client_id, secret=aad_secret, tenant=aad_tenant)
batchai_client = batchai.BatchAIManagementClient(
credentials=creds, subscription_id=subscription_id)
Vytvoření skupiny prostředků
Clustery a úlohy služby Batch AI jsou prostředky Azure a musí být umístěné ve skupině prostředků Azure. Následující fragment kódu vytvoří skupinu prostředků:
from azure.mgmt.resource import ResourceManagementClient
resource_group_name = 'myresourcegroup'
resource_management_client = ResourceManagementClient(
credentials=creds, subscription_id=subscription_id)
resource = resource_management_client.resource_groups.create_or_update(
resource_group_name, {'location': mylocation})
Příprava sdílené složky Azure
Pro ilustraci se v tomto rychlém startu k hostování trénovacích dat a skriptů pro úlohu učení používá sdílená složka Azure File.
Vytvořte sdílenou složku batchaiquickstart
.
from azure.storage.file import FileService
azure_file_share_name = 'batchaiquickstart'
service = FileService(storage_account_name, storage_account_key)
service.create_share(azure_file_share_name, fail_on_exist=False)
Ve sdílené složce vytvořte adresář mnistcntksample
.
mnist_dataset_directory = 'mnistcntksample'
service.create_directory(azure_file_share_name, mnist_dataset_directory, fail_on_exist=False)
Stáhněte ukázkový balíček a rozbalte do aktuálního adresáře. Následujícím kódem nahrajete požadované soubory do sdílené složky Azure:
for f in ['Train-28x28_cntk_text.txt', 'Test-28x28_cntk_text.txt',
'ConvNet_MNIST.py']:
service.create_file_from_path(
azure_file_share_name, mnist_dataset_directory, f, f)
Vytvoření pracovního prostoru Batch AI
Pracovní prostor je kolekce nejvyšší úrovně všech typů prostředků Batch AI. V pracovním prostoru vytvoříte cluster a experimenty Batch AI.
workspace_name='myworkspace'
batchai_client.workspaces.create(resource_group_name, workspace_name, mylocation)
Vytvoření clusteru GPU
Vytvořte cluster Batch AI. V tomto příkladu se cluster skládá z jediného uzlu virtuálního počítače STANDARD_NC6. Tato velikost virtuálního počítače obsahuje jeden grafický procesor NVIDIA K80. Připojte sdílenou složku ke složce azurefileshare
. Úplná cesta této složky na výpočetním uzlu grafického procesoru je $AZ_BATCHAI_MOUNT_ROOT/azurefileshare
.
cluster_name = 'mycluster'
relative_mount_point = 'azurefileshare'
parameters = models.ClusterCreateParameters(
# VM size. Use N-series for GPU
vm_size='STANDARD_NC6',
# Configure the ssh users
user_account_settings=models.UserAccountSettings(
admin_user_name=admin_user_name,
admin_user_password=admin_user_password),
# Number of VMs in the cluster
scale_settings=models.ScaleSettings(
manual=models.ManualScaleSettings(target_node_count=1)
),
# Configure each node in the cluster
node_setup=models.NodeSetup(
# Mount shared volumes to the host
mount_volumes=models.MountVolumes(
azure_file_shares=[
models.AzureFileShareReference(
account_name=storage_account_name,
credentials=models.AzureStorageCredentialsInfo(
account_key=storage_account_key),
azure_file_url='https://{0}/{1}'.format(
service.primary_endpoint, azure_file_share_name),
relative_mount_path=relative_mount_point)],
),
),
)
batchai_client.clusters.create(resource_group_name, workspace_name, cluster_name,
parameters).result()
Získání stavu clusteru
Stav clusteru můžete monitorovat pomocí následujícího příkazu:
cluster = batchai_client.clusters.get(resource_group_name, workspace_name, cluster_name)
print('Cluster state: {0} Target: {1}; Allocated: {2}; Idle: {3}; '
'Unusable: {4}; Running: {5}; Preparing: {6}; Leaving: {7}'.format(
cluster.allocation_state,
cluster.scale_settings.manual.target_node_count,
cluster.current_node_count,
cluster.node_state_counts.idle_node_count,
cluster.node_state_counts.unusable_node_count,
cluster.node_state_counts.running_node_count,
cluster.node_state_counts.preparing_node_count,
cluster.node_state_counts.leaving_node_count))
Předchozí kód vypíše základní informace o přidělení clusteru, jako v následujícím příkladu:
Cluster state: AllocationState.steady Target: 1; Allocated: 1; Idle: 0; Unusable: 0; Running: 0; Preparing: 1; Leaving: 0
Cluster bude připravený po přidělení uzlů a dokončení jejich přípravy (viz atribut nodeStateCounts
). Pokud se něco nepovede, atribut errors
bude obsahovat popis chyby.
Vytvoření experimentu a trénovací úlohy
Po vytvoření clusteru vytvořte experiment (logický kontejner pro skupinu souvisejících úloh). Potom v experimentu nakonfigurujte a odešlete úlohu učení:
experiment_name='myexperiment'
batchai_client.experiments.create(resource_group_name, workspace_name, experiment_name)
job_name = 'myjob'
parameters = models.JobCreateParameters(
# The cluster this job will run on
cluster=models.ResourceId(id=cluster.id),
# The number of VMs in the cluster to use
node_count=1,
# Write job's standard output and execution log to Azure File Share
std_out_err_path_prefix='$AZ_BATCHAI_MOUNT_ROOT/{0}'.format(
relative_mount_point),
# Configure location of the training script and MNIST dataset
input_directories=[models.InputDirectory(
id='SAMPLE',
path='$AZ_BATCHAI_MOUNT_ROOT/{0}/{1}'.format(
relative_mount_point, mnist_dataset_directory))],
# Specify location where generated model will be stored
output_directories=[models.OutputDirectory(
id='MODEL',
path_prefix='$AZ_BATCHAI_MOUNT_ROOT/{0}'.format(relative_mount_point),
path_suffix="Models")],
# Container configuration
container_settings=models.ContainerSettings(
image_source_registry=models.ImageSourceRegistry(
image='microsoft/cntk:2.1-gpu-python3.5-cuda8.0-cudnn6.0')),
# Toolkit specific settings
cntk_settings=models.CNTKsettings(
python_script_file_path='$AZ_BATCHAI_INPUT_SAMPLE/ConvNet_MNIST.py',
command_line_args='$AZ_BATCHAI_INPUT_SAMPLE $AZ_BATCHAI_OUTPUT_MODEL')
)
# Create the job
batchai_client.jobs.create(resource_group_name, workspace_name, experiment_name, job_name, parameters).result()
Monitorování úlohy
Stav úlohy si můžete prohlédnout pomocí následujícího kódu:
job = batchai_client.jobs.get(resource_group_name, workspace_name, experiment_name, job_name)
print('Job state: {0} '.format(job.execution_state))
Výstup je podobný tomuto: Job state: running
.
executionState
obsahuje aktuální stav provádění úlohy:
queued
: Úloha čeká, až budou dostupné uzly clusteru.running
: Úloha běží.succeeded
(nebofailed
): Úloha je dokončená aexecutionInfo
obsahuje podrobnosti o výsledku.
Výpis výstupu stdout a stderr
Pomocí následujícího kódu vytvořte výpis vygenerovaných výstupů stdout a stderr a souborů protokolů:
files = batchai_client.jobs.list_output_files(
resource_group_name, workspace_name, experiment_name, job_name,
models.JobsListOutputFilesOptions(outputdirectoryid="stdouterr"))
for file in (f for f in files if f.download_url):
print('file: {0}, download url: {1}'.format(file.name, file.download_url))
Výpis vygenerovaných souborů modelů
Pomocí následujícího kódu vytvořte výpis vygenerovaných souborů modelů:
files = batchai_client.jobs.list_output_files(
resource_group_name, workspace_name, experiment_name,job_name,
models.JobsListOutputFilesOptions(outputdirectoryid="MODEL"))
for file in (f for f in files if f.download_url):
print('file: {0}, download url: {1}'.format(file.name, file.download_url))
Odstranění prostředků
Pomocí následujícího kódu odstraňte úlohu:
batchai_client.jobs.delete(resource_group_name, workspace_name, experiment_name, job_name)
Pomocí následujícího kódu odstraňte cluster:
batchai_client.clusters.delete(resource_group_name, workspace_name, cluster_name)
Pomocí následujícího kódu odstraňte všechny přidělené prostředky:
resource_management_client.resource_groups.delete('myresourcegroup')
Další kroky
Další informace o použití služby Batch AI na různých platformách najdete v článku s návody na trénování.