Apprenez à écrire une fonction Python et à la stocker en tant qu'actif que vous pouvez utiliser pour déployer des modèles.
Pour obtenir une liste des exigences générales relatives aux fonctions déployables, voir Exigences générales relatives aux fonctions déployables. Pour plus d'informations sur ce qui se passe lors d'un déploiement de fonction, voir Processus de déploiement de fonction
Exigences générales relatives aux fonctions déployables
Pour être déployée avec succès, une fonction doit répondre à ces exigences :
- Le fichier de fonction Python à l'importation doit avoir l'objet de fonction
score
dans sa portée. Voir Exigences de la fonction de score - Le contenu d'entrée d'évaluation doit répondre aux exigences répertoriées dans Exigences d'entrée d'évaluation
- Le contenu de sortie attendu comme sortie de
score
doit inclure le schéma de la variablescore_response
pour le code d'état 200. Notez que le paramètreprediction
, avec un tableau d'objets JSON comme valeur, est obligatoire dans la sortiescore
. - Lorsque vous utilisez le client Python pour enregistrer une fonction Python qui contient une référence à une fonction externe, seul le code dans la portée de la fonction externe (y compris ses fonctions imbriquées) est sauvegardé. Par conséquent, le code en dehors de la portée de la fonction externe ne sera pas sauvegardé et ne sera donc pas disponible lorsque vous déployez la fonction.
Exigences de la fonction de score
- Il existe deux façons d'ajouter l'objet de fonction
score
:- Explicitement, par l'utilisateur
- implicitement, par la méthode utilisée pour sauvegarder la fonction Python en tant qu'actif dans le référentiel watsonx.ai Runtime
- La fonction "
score
peut accepter un seul paramètre d'entrée JSON ou deux paramètres : la charge utile et le jeton du porteur. - La fonction
score
doit renvoyer un objet sérialisable JSON (par exemple, des dictionnaires ou des listes).
Évaluation des entrées d'évaluation
Le contenu d'entrée de score doit inclure un tableau portant le nom
values
, comme indiqué dans cet exemple de schéma. Le paramètreinput_data
est obligatoire dans le contenu. Le paramètreinput_data
peut également inclure des paires nom-valeur supplémentaires.{"input_data": [{ "values": [["Hello world!"]] }] }
La charge utile d'entrée de notation doit être transmise en tant que valeur de paramètre d'entrée pour "
score
. Ainsi, vous pouvez vous assurer que la valeur du paramètre d'entréescore
est traitée en conséquence dansscore
.La charge d'entrée d'évaluation doit satisfaire les exigences d'entrée de la fonction Python concernée.
La charge d'entrée de score doit inclure un tableau qui correspond à l'exemple de schéma de données d'entrée.
Exemple de schéma de données d'entrée
{"input_data": [{
"values": [["Hello, world!"]]
}]
}
Exemple de code Python (charge utile et jeton)
#wml_python_function
def my_deployable_function():
def score(payload, token):
message_from_input_payload = payload.get("input_data")[0].get("values")[0][0]
response_message = "Received message - {0}".format(message_from_input_payload)
# Score using the pre-defined model
score_response = {
'predictions': [{'fields': ['Response_message_field'],
'values': [[response_message]]
}]
}
return score_response
return score
score = my_deployable_function()
Tester votre fonction Python
Voici comment vous pouvez tester votre fonction Python:
input_data = { "input_data": [{ "fields": [ "message" ],
"values": [[ "Hello, world!" ]]
}
]
}
function_result = score( input_data )
print( function_result )
Il renvoie le message "Hello, world !".
Processus de déploiement de fonction
Le code Python de votre ressource Function est chargé en tant que module Python par le moteur d'exécution watsonx.ai à l'aide d'une instruction " import
. Cela signifie que le code sera exécuté exactement une fois (lorsque la fonction sera déployée ou à chaque fois que le pod correspondant sera redémarré). La fonction score
définie par l'actif Fonction est ensuite appelée dans chaque demande de prévision.
Traitement des fonctions déployables
Utilisez l'une de ces méthodes pour créer une fonction Python déployable :
Avant de commencer
Vous devez définir les informations d'identification de votre tâche en générant une clé API. Pour plus d'informations, voir Gestion des informations d'identification des tâches.
Création de fonctions déployables via l'API REST
Pour les API REST, la fonction Python étant téléchargée directement via un fichier, ce dernier doit déjà contenir la fonction score
. Toute importation unique qui doit être effectuée pour être utilisée ultérieurement dans la fonction score
peut être effectuée dans la portée globale du fichier. Lorsque ce fichier est déployé en tant que fonction Python, les importations uniques disponibles dans la portée globale sont exécutées au cours du déploiement et sont simplement réutilisées avec chaque demande de prévision.
L'archive de fonction doit être un fichier .gz
.
Exemple de fichier de fonctionscore
:
Score function.py
---------------------
def score(input_data):
return {'predictions': [{'values': [['Just a test']]}]}
Exemple de fonction score
avec d'importation unique :
import subprocess
subprocess.check_output('pip install gensim --user', shell=True)
import gensim
def score(input_data):
return {'predictions': [{'fields': ['gensim_version'], 'values': [[gensim.__version__]]}]}
Création de fonctions déployables via le client Python
Pour conserver une fonction Python en tant qu'actif, le client Python utilise la méthode wml_client.repository.store_function
. Vous pouvez persister une fonction Python de deux manières :
Conservation d'une fonction via un fichier contenant la fonction Python
Cette méthode est identique à la persistance du fichier de fonctions Python via les API REST (score
doit être défini dans la portée du fichier source Python ). Pour plus de détails, voir Création de fonctions déployables via l'API REST.
Lorsque vous appelez la méthode wml_client.repository.store_function
, transmettez le nom de fichier comme premier argument.
Persistance d'une fonction via l'objet de fonction
Vous pouvez conserver des objets de fonction Python en créant Python Closures avec une fonction imbriquée nommée score
. La fonction score
est renvoyée par la fonction externe qui est stockée en tant qu'objet de fonction, lorsqu'elle est appelée. Cette fonction score
doit répondre aux exigences répertoriées dans Exigences générales pour les fonctions déployables. Dans ce cas, les importations à usage unique et la logique de configuration initiale doivent être ajoutées dans la fonction imbriquée externe afin qu'elles soient exécutées lors du déploiement et utilisées dans la fonction score
. Toute logique récurrente nécessaire lors de la demande prediction
doit être ajoutée dans la fonction score
imbriquée.
Exemple de sauvegarde de fonction Python à l'aide du client Python :
def my_deployable_function():
import subprocess
subprocess.check_output('pip install gensim', shell=True)
import gensim
def score(input_data):
import
message_from_input_payload = payload.get("input_data")[0].get("values")[0][0]
response_message = "Received message - {0}".format(message_from_input_payload)
# Score using the pre-defined model
score_response = {
'predictions': [{'fields': ['Response_message_field', 'installed_lib_version'],
'values': [[response_message, gensim.__version__]]
}]
}
return score_response
return score
function_meta = {
client.repository.FunctionMetaNames.NAME:"test_function",
client.repository.FunctionMetaNames.SOFTWARE_SPEC_ID: sw_spec_id
}
func_details = client.repository.store_function(my_deployable_function, function_meta)
Dans ce scénario, la fonction Python se charge de créer un fichier Python qui contient la fonction " score
et de persister le fichier de fonction en tant qu'actif dans le référentiel Runtime de watsonx.ai
score = my_deployable_function()
En savoir plus
- Fermetures (closures) Python
- Fermetures
- Fonction imbriquée, portée de la variable et fermetures en Python
Rubrique parent : Déploiement de fonctions Python