Lancer un Batch Azure ML en PowerShell

Dans Azure ML, lorsque l’on veut scorer un important jeu de données de façon automatisé, il est recommandé d’utiliser le web service en mode “Batch”, plutôt que le mode “Request” (qui engendre beaucoup trop d’appel). La documentation des web services propose des exemples de codes en C#, R et Python… ce qui est très bien. Cependant, il manque le langage le plus important lorsque l’on cherche à scripter une tâche dans un univers Windows : le PowerShell !!!!! 

Avec le PowerShell, plus besoin d’installer Python/R sur le serveur ou de développer une appli console en C#, il est nativement installé dans les OS Windows. Un petit script “.ps1”, une ligne de commande, et le tour est joué. Pratique si l’on souhaite utiliser l’Agent SQL Server comme ordonnanceur par exemple.

Je me suis donc fortement inspiré du script Python. En voici la version PowerShell :

#copier la clé de l'API
$key='…'

#copier l'uri du mode batch (qui se termine par ‘/jobs’) sans la partie '?api-version=2.0'
$uri = '…'

#Soumet le job
$url = $uri + '?api-version=2.0'

$headers = @{'Authorization'='Bearer ' + $key}

#Renseigner le body si besoin..
$json ='{}'

$out_submit = Invoke-WebRequest -Uri  $url -Headers $headers -Method POST -ContentType 'application/json' -Body $json -TimeoutSec 0


#Demarre le job
$url = $uri + "/" + $out_submit.Content.Replace('"','') + "/start?api-version=2.0" 

$url

$out_start = Invoke-WebRequest -Uri $url -Headers $headers -Method POST -ContentType 'application/json'  -TimeoutSec 0

$out_start

#Boucle qui verifie le statut du job
$url = $uri + "/" + $out_submit.Content.Replace('"','') + "?api-version=2.0" 

$url

$StatutCode = ""
while (1 -eq 1) {
	$out_status = Invoke-WebRequest -Uri $url -Headers $headers  -TimeoutSec 0

	$res = $out_status.Content | ConvertFrom-Json
	$StatutCode = $res.StatusCode

	if  ($res.StatusCode -eq 0 -or $res.StatusCode -eq "NotStarted"){
		write-host "Job " $out_submit.Content.Replace('"','') " not yet started..."
	} 
	if  ($res.StatusCode -eq 1 -or $res.StatusCode -eq "Running"){
		write-host "Job " $out_submit.Content.Replace('"','') " running..."
	} 
	if  ($res.StatusCode -eq 2 -or $res.StatusCode -eq "Failed"){
		write-host "Job " $out_submit.Content.Replace('"','') " failed!"
		write-host "Error details : " $res.Details
	break
	} 
	if  ($res.StatusCode -eq 3 -or $res.StatusCode -eq "Cancelled"){
		write-host "Job " $out_submit.Content.Replace('"','') " cancelled!"
		break
	} 
	if  ($res.StatusCode -eq 4 -or $res.StatusCode -eq "Finished"){
		write-host "Job " $out_submit.Content.Replace('"','') " finished!"
		write-host "Result : " $res
		break
	} 
	Start-Sleep -Seconds 2
}

Il est bien sur possible de créer le même type de script pour le mode “Request”, mais à part pour du debug, j’y vois beaucoup moins d’intérêt.

FADATA

Fabien Adato est Customer Engineer Data et AI chez Microsoft. Après avoir intégré la société CGI Business Consulting où il rejoint une équipe dédiée à la Business Intelligence, il fait ses premières armes sur la solution Microsoft SQL Server. Pendant plus de 4 ans, il acquiert des compétences techniques et fonctionnelles sur toute la chaîne de valeur de la BI (ETL, Base de Données, Cube Olap et Rapport). Il a pu se spécialiser également sur de nouvelles technologies de la Data et notamment Hadoop, Pig et Hive, ainsi que des technologies self-service BI, le No-SQL comme la base de données MongoDB et le moteur d’indexation ElasticSearch. Il entre chez AZEO en 2014 puis Avanade en 2021 puis Microsoft en 2021 pour y assurer le poste de CE DATA / AI, autour des technologies Microsoft SQL Server, Power BI et Azure Data.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.