Gravando funções Python implementáveis

Saiba como escrever uma função Python e armazená-la como um ativo que você pode usar para implantar modelos.

Para uma lista de requisitos gerais para funções implementáveis consulte o Requisitos gerais para funções implementáveis. Para obter informações sobre o que acontece durante uma implementação de função, consulte o Processo de implementação de função

Requisitos gerais para funções implementáveis

Para ser implementado com sucesso, uma função deve atender a esses requisitos:

  • O arquivo de função Python na importação deve ter o objeto de função score como parte de seu escopo. Consulte a Requisitos de função de pontuação
  • A carga útil de entrada de pontuação deve atender aos requisitos listados em Requisitos de entrada Scoring
  • A carga útil de saída esperada como saída de score deve incluir o esquema da variável score_response para o código de status 200. Observe que o parâmetro prediction, com uma matriz de objetos JSON como seu valor, é obrigatório na saída score.
  • Quando você usa o cliente Python para salvar uma função Python que contém uma referência para uma função externa, apenas o código no escopo da função externa (incluindo suas funções aninhadas) será salvo. Portanto, o código fora do escopo da função externa não será salvo e, assim, não estará disponível quando você implementar a função.

Requisitos de função de pontuação

  • Duas maneiras de adicionar o objeto de função score existem:
    • explicitamente, pelo usuário
    • implicitamente, pelo método que é usado para salvar a função Python como um ativo no repositório de tempo de execução watsonx.ai
  • A função " score pode aceitar um único parâmetro de entrada JSON ou dois parâmetros: carga útil e token do portador.
  • A função score deve retornar um objeto serializável JSON (por exemplo: dicionários ou listas).

Requisitos de entrada de pontuação

  • A carga útil de entrada de pontuação deve incluir uma matriz com o nome values, como mostrado neste esquema de exemplo. O parâmetro input_data é obrigatório na carga útil.. O parâmetro input_data também pode incluir pares nome-valor adicionais.

    {"input_data": [{
       "values": [["Hello world!"]]
                   }]
    }
    
  • A carga útil de entrada de pontuação deve ser passada como um valor de parâmetro de entrada para ' score. Desta forma é possível garantir que o valor do parâmetro de entrada score seja tratado adequadamente dentro do score.

  • A carga útil de entrada de pontuação deve corresponder aos requisitos de entrada para a função de Python em questão.

  • A carga útil de entrada de pontuação deve incluir uma matriz que corresponde ao Esquema de dados de entrada de exemplo.

Esquema de dados de entrada de exemplo

 {"input_data": [{
    "values": [["Hello, world!"]]
                }]
 }

Exemplo de código Python (carga útil 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()

Testando sua função Python

Veja como você pode testar sua função Python:

input_data = { "input_data": [{ "fields": [ "message" ],
                                "values": [[ "Hello, world!" ]]
                               }
                              ]
             }
function_result = score( input_data )
print( function_result )

Ele retorna a mensagem "Hello, world!".

Processo de implementação de função

O código Python do seu ativo de função é carregado como um módulo Python pelo mecanismo de tempo de execução do watsonx.ai usando uma instrução ' import. Isso significa que o código será executado exatamente uma vez (quando a função for implementada ou cada vez quando o pod correspondente for reiniciado). A função score que é definida pelo ativo Function é então chamada em cada solicitação de predição.

Manipulação de funções implementáveis

Use um desses métodos para criar uma função Python implementável:

Antes de iniciar

Você deve configurar suas credenciais de tarefa gerando uma chave de API. Para obter mais informações, consulte Gerenciamento de credenciais de tarefas.

Criando funções implementáveis por meio da API de REST

Para APIs REST, porque a função Python é carregada diretamente por meio de um arquivo, o arquivo já deve conter a função score . Qualquer uma única vez de importação que precise ser feita para ser usada posteriormente dentro da função score pode ser feita dentro do escopo global do arquivo. Quando este arquivo é implementado como uma função Python, as importações pontuais disponíveis no escopo global sejam executadas durante a implementação e posteriormente simplesmente reutilizadas com cada solicitação de predição.

Importante:

O archive de função deve ser um arquivo .gz

Amostra do arquivo de função score:

Score function.py
---------------------
def score(input_data):
    return {'predictions': [{'values': [['Just a test']]}]}

Amostra score função com importações únicas:

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__]]}]}

Criando funções implementáveis por meio do cliente Python

Para persistir uma função Python como um ativo, o cliente Python usa o método wml_client.repository.store_function. Você pode manter uma função Python de duas maneiras:

Persistindo uma função através de um arquivo que contém a função Python

Este método é o mesmo que persistir o arquivo de funções Python por meio de APIs de REST (score deve ser definido no escopo do arquivo de origem Python ). Para obter detalhes, consulte o Criando funções implementáveis através da API de REST.

Importante:

Quando estiver chamando o método wml_client.repository.store_function , passe o nome do arquivo como o primeiro argumento.

Persistindo uma função por meio do objeto da função

É possível persistir objetos de função Python criando Python Closures com uma função aninhada denominada score. A função score é devolvida pela função externa que está sendo armazenada como um objeto de função, quando chamado. Esta função score deve atender aos requisitos que estão listados em Requisitos gerais para funções implementáveis. Nesse caso, qualquer uma vez importar e lógica de setup inicial deve ser adicionada na função aninhada externa para que eles sejam executados durante a implementação e sejam utilizados dentro da função score . Qualquer lógica recorrente que seja necessária durante a solicitação prediction deve ser incluída dentro da função score aninhada.

Amostra de função Python salvar usando o cliente 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)

Nesse cenário, a função Python assume o trabalho de criar um arquivo Python que contém a função ' score e persistir o arquivo de função como um ativo no repositório de tempo de execução watsonx.ai:

score = my_deployable_function()

Saiba Mais

Tópico pai: Implementação de funções Python