Imparate a scrivere una funzione Python e a memorizzarla come risorsa da utilizzare per distribuire i modelli.
Per un elenco dei requisiti generali per le funzioni distribuibili, consultare Requisiti generali per le funzioni distribuibili. Per informazioni su cosa accade durante la distribuzione di una funzione, fare riferimento a Processo di distribuzione della funzione
Requisiti generali per le funzioni distribuibili
Per essere distribuita correttamente, una funzione deve soddisfare i requisiti seguenti:
- Il file di funzione Python durante l'importazione deve avere l'oggetto funzione
score
come parte del suo ambito. Fare riferimento a Requisiti della funzione di punteggio - Il payload di input del calcolo del punteggio deve soddisfare i requisiti elencati in Requisiti di input del calcolo del punteggio
- Il payload di output previsto come output di
score
deve includere lo schema della variabilescore_response
per il codice di stato 200. Si noti che il parametroprediction
, con un array di oggetti JSON come valore, è obbligatorio nell'outputscore
. - Quando si utilizza il client Python per salvare una funzione Python che contiene un riferimento a una funzione esterna, viene salvato solo il codice nell'ambito della funzione esterna (incluse le relative funzioni nidificate). Pertanto, il codice al di fuori dell'ambito della funzione esterna non verrà salvato e quindi non sarà disponibile quando si distribuisce la funzione.
Requisiti della funzione di punteggio
- Esistono due modi per aggiungere l'oggetto funzione
score
:- esplicitamente, per utente
- implicitamente, dal metodo utilizzato per salvare la funzione Python come risorsa nel repository watsonx.ai Runtime
- La funzione "
score
può accettare un singolo parametro di ingresso JSON o due parametri: payload e token del portatore. - La funzione "
score
deve restituire un oggetto serializzabile JSON (ad esempio: dizionari o elenchi).
Requisiti di input per il calcolo del punteggio
Il payload di input del calcolo del punteggio deve includere un array con il nome
values
, come mostrato in questo schema di esempio. Il parametroinput_data
è obbligatorio nel payload. Il parametroinput_data
può includere anche ulteriori coppie nome - valore.{"input_data": [{ "values": [["Hello world!"]] }] }
Il payload di ingresso del punteggio deve essere passato come valore del parametro di ingresso per '
score
. In questo modo è possibile garantire che il valore del parametro di immissionescore
sia gestito di conseguenza all'interno discore
.Il payload di input del calcolo del punteggio deve soddisfare i requisiti di input per la relativa funzione Python .
Il payload di input del calcolo del punteggio deve includere un array corrispondente allo Schema dati di input di esempio.
Schema dei dati di input di esempio
{"input_data": [{
"values": [["Hello, world!"]]
}]
}
Esempio di codice Python (payload e token)
#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()
Testare la funzione Python
Ecco come testare la vostra funzione Python:
input_data = { "input_data": [{ "fields": [ "message" ],
"values": [[ "Hello, world!" ]]
}
]
}
function_result = score( input_data )
print( function_result )
Restituisce il messaggio "Hello, world!".
Processo di distribuzione della funzione
Il codice Python della risorsa Function viene caricato come modulo Python dal motore di runtime watsonx.ai utilizzando l'istruzione 'import
. Ciò significa che il codice verrà eseguito esattamente una volta (quando la funzione viene distribuita o ogni volta che il pod corrispondente viene riavviato). La funzione score
definita dall'asset Funzione viene quindi richiamata in ogni richiesta di previsione.
Gestione delle funzioni distribuibili
Utilizzare uno di questi metodi per creare una funzione Python distribuibile:
Prima di iniziare
È necessario impostare le credenziali dell'attività generando una chiave API. Per ulteriori informazioni, vedere Gestione delle credenziali delle attività.
Creazione di funzioni distribuibili tramite l'API REST
Per le API REST, poiché la funzione Python viene caricata direttamente tramite un file, il file deve contenere già la funzione score
. Qualsiasi importazione che deve essere eseguita una sola volta per essere utilizzata successivamente all'interno della funzione score
può essere eseguita all'interno dell'ambito globale del file. Quando questo file viene distribuito come funzione Python , le importazioni uniche disponibili nell'ambito globale vengono eseguite durante la distribuzione e successivamente semplicemente riutilizzate con ogni richiesta di previsione.
L'archivio funzioni deve essere un file .gz
.
File di funzione score
di esempio:
Score function.py
---------------------
def score(input_data):
return {'predictions': [{'values': [['Just a test']]}]}
Funzione score
di esempio con importazioni una sola volta:
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__]]}]}
Creazione di funzioni distribuibili mediante il client Python
Per rendere persistente una funzione Python come un asset, il client Python utilizza il metodo wml_client.repository.store_function
. È possibile persistere una funzione Python in due modi:
Persistenza di una funzione attraverso un file che contiene la funzione Python
Questo metodo è uguale alla persistenza del file di funzione Python tramite le API REST (score
deve essere definito nell'ambito del file origine Python ). Per i dettagli, fare riferimento a Creazione di funzioni distribuibili tramite l'API REST.
Quando si richiama il metodo wml_client.repository.store_function
, passare il nome file come primo argomento.
Persistenza di una funzione attraverso l'oggetto funzione
Puoi rendere persistenti gli oggetti della funzione Python creando Python Closures con una funzione nidificata denominata score
. La funzione score
viene restituita dalla funzione esterna memorizzata come oggetto della funzione, quando viene richiamata. Questa funzione score
deve soddisfare i requisiti elencati in Requisiti generali per le funzioni distribuibili. In questo caso, tutte le importazioni e la logica di impostazione iniziale devono essere aggiunte nella funzione nidificata esterna in modo che vengano eseguite durante la distribuzione e vengano utilizzate all'interno della funzione score
. Qualsiasi logica ricorrente necessaria durante la richiesta prediction
deve essere aggiunta all'interno della funzione score
nidificata.
Salva la funzione Python di esempio utilizzando il 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)
In questo scenario, la funzione Python si occupa di creare un file Python contenente la funzione 'score
e di conservare il file della funzione come risorsa nel repository watsonx.ai Runtime:
score = my_deployable_function()
Ulteriori informazioni
Argomento principale: Distribuzione delle funzioni Python