Conceitos de materialização do conjunto de recursos

A materialização calcula os valores dos recursos dos dados de origem. Os valores de hora de início e hora de término definem uma janela de recursos. Um trabalho de materialização computa recursos nesta janela de recursos. Os valores dos recursos materializados são armazenados em um repositório de materialização online ou offline. Após a materialização dos dados, todas as consultas de recursos podem usar esses valores do repositório de materialização.

Sem materialização, uma consulta offline de um conjunto de recursos aplica as transformações à fonte em tempo real, calculando os recursos antes que a consulta retorne os valores. Este processo funciona bem na fase de prototipagem. No entanto, para operações de treinamento e inferência, em um ambiente de produção, os recursos devem ser materializados antes do treinamento ou da inferência. A materialização nesse estágio fornece maior confiabilidade e disponibilidade.

Explorar a materialização de recursos

A interface do usuário dos Trabalhos de materialização mostra o status de materialização de dados em repositórios de materialização offline e online e uma lista de trabalhos de materialização.

Captura de tela mostrando a interface do usuário dos trabalhos de materialização do conjunto de recursos.

Em uma janela de recursos:

  • O gráfico de série temporal na parte superior mostra os intervalos de dados que se enquadram na janela de recursos, com o status de materialização, para repositórios offline e online.
  • A lista de trabalhos na parte inferior mostra todos os trabalhos de materialização com janelas de processamento que se sobrepõem à janela de recursos selecionada.

Status de materialização de dados e intervalo de dados

Um intervalo de dados é uma janela de tempo na qual o conjunto de recursos materializa seus valores de recurso para um destes status:

  • Concluído (verde) – materialização de dados bem-sucedida
  • Não concluído (vermelho) – um ou mais trabalhos de materialização cancelados ou com falha para esse intervalo de dados
  • Pendente (azul) – um ou mais trabalhos de materialização para esse intervalo de dados estão em andamento
  • Nenhum (cinza) – nenhum trabalho de materialização foi enviado para esse intervalo de dados

À medida que os trabalhos de materialização são executados para o conjunto de recursos, eles criam ou mesclam intervalos de dados:

  • Quando dois intervalos de dados são contínuos na linha do tempo e têm o mesmo status de materialização de dados, eles se tornam um único intervalo de dados
  • Em um intervalo de dados, quando uma parte dos dados do recurso é materializada novamente e essa parte obtém um status de materialização diferente, esse intervalo de dados é dividido em vários intervalos

Quando os usuários selecionam uma janela de recursos, eles podem ver vários intervalos de dados nessa janela com diferentes status de materialização de dados. Eles podem ver vários intervalos de dados que estão desconexos na linha do tempo. Por exemplo, o instantâneo anterior tem 16 intervalos de dados para a janela de recursos definida no repositório de materialização offline.

Em um determinado momento, um conjunto de recursos pode ter no máximo 2.000 intervalos de dados. Depois que um conjunto de recursos atingir esse limite, nenhum trabalho de materialização poderá ser executado. Então, os usuários devem criar uma nova versão do conjunto de recursos com a materialização habilitada. Para a nova versão do conjunto de recursos, materialize os recursos do zero nos repositórios offline e online.

Para evitar o limite, os usuários devem executar trabalhos de provisionamento com antecedência para preencher as lacunas nos intervalos de dados. Isso mescla os intervalos de dados e reduz a contagem total.

Trabalhos de materialização de dados

Antes de executar um trabalho de materialização de dados, habilite as materializações de dados offline e/ou online no nível do conjunto de recursos.

from azure.ai.ml.entities import (
    MaterializationSettings,
    MaterializationComputeResource,
)

# Turn on both offline and online materialization on the "accounts" featureset.

accounts_fset_config = fs_client._featuresets.get(name="accounts", version="1")

accounts_fset_config.materialization_settings = MaterializationSettings(
    offline_enabled=True,
    online_enabled=True,
    resource=MaterializationComputeResource(instance_type="standard_e8s_v3"),
    spark_configuration={
        "spark.driver.cores": 4,
        "spark.driver.memory": "36g",
        "spark.executor.cores": 4,
        "spark.executor.memory": "36g",
        "spark.executor.instances": 2,
    },
    schedule=None,
)

fs_poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
print(fs_poller.result())

Você pode enviar os trabalhos de materialização de dados como:

  • trabalho de provisionamento – um trabalho de materialização em lote enviado manualmente
  • trabalho de materialização recorrente – um trabalho de materialização automática disparado em um intervalo agendado.

Aviso

Os dados já materializados na materialização offline e/ou online não poderão mais ser utilizáveis se a materialização de dados offline e/ou online estiver desabilitada no nível do conjunto de recursos. O status de materialização de dados no repositório de materialização offline e/ou online será redefinido para None.

Você pode enviar trabalhos de provisionamento:

  • Status de materialização de dados
  • Pela ID de um trabalho de materialização cancelado ou com falha

Pelo provisionamento de dados com base no status de materialização de dados

O usuário pode enviar uma solicitação de provisionamento com:

  • Uma lista dos valores de status de materialização de dados – Não concluído, Concluído ou Nenhum
  • Uma janela de recurso (opcional)
from datetime import datetime
from azure.ai.ml.entities import DataAvailabilityStatus

st = datetime(2022, 1, 1, 0, 0, 0, 0)
et = datetime(2023, 6, 30, 0, 0, 0, 0)

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version="1",
    feature_window_start_time=st,
    feature_window_end_time=et,
    data_status=[DataAvailabilityStatus.NONE],
)
print(poller.result().job_ids)

Após o envio da solicitação de provisionamento, um novo trabalho de materialização é criado para cada intervalo de dados que tenha um status de materialização de dados correspondente (Não concluído, Concluído ou Nenhum). Além disso, os intervalos de dados relevantes devem estar dentro da janela de recursos definida. Se o status de materialização de dados for Pending para um intervalo de dados, nenhum trabalho de materialização será enviado para esse intervalo.

A hora de início e a hora de término da janela de recursos são opcionais na solicitação de provisionamento:

  • Se a hora de início da janela de recursos não for fornecida, ela será definida como a hora de início do primeiro intervalo de dados que não tenha um status de materialização de dados de None.
  • Se a hora de término da janela de recursos não for fornecida, ela será definida como a hora de término do último intervalo de dados que não tenha um status de materialização de dados de None.

Observação

Se nenhum trabalho de provisionamento ou recorrente tiver sido enviado para um conjunto de recursos, o primeiro trabalho de provisionamento deverá ser enviado com uma hora de início e de término da janela de recursos.

Este exemplo tem estes valores atuais de status de materialização e intervalo de dados:

Hora de início Hora de término Status de materialização de dados
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

Essa solicitação de provisionamento tem estes valores:

  • Materialização de dados data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete]
  • Início da janela do recurso = 2023-04-02T12:00:00.000
  • Fim da janela do recurso = 2023-04-04T12:00:00.000

Ela cria estes trabalhos de materialização:

  • Trabalho 1: processar janela de recursos [2023-04-02T12:00:00.000, 2023-04-03T04:00:00.000)
  • Trabalho 2: processar janela de recursos [2023-04-04T04:00:00.000, 2023-04-04T12:00:00.000)

Se ambos os trabalhos forem concluídos com êxito, os novos valores de status de materialização e intervalo de dados se tornarão:

Hora de início Hora de término Status de materialização de dados
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-02T12:00:00.000 Incomplete
2023-04-02T12:00:00.000 2023-04-03T04:00:00.000 Complete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

Um novo intervalo de dados é criado no dia 2023-04-02, porque metade desse dia agora tem um status de materialização diferente: Complete. Embora uma nova tarefa de materialização tenha sido executada durante metade do dia 2023-04-04, o intervalo de dados não foi alterado (dividido) porque o status de materialização não mudou.

Se o usuário fizer uma solicitação de provisionamento apenas com a materialização de dados data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete], sem definir a hora de início e término da janela de recursos, a solicitação usará o valor padrão desses parâmetros mencionados anteriormente nesta seção e criará estes trabalhos:

  • Trabalho 1: processar janela de recursos [2023-04-02T04:00:00.000, 2023-04-03T04:00:00.000)
  • Trabalho 2: processar janela de recursos [2023-04-04T04:00:00.000, 2023-04-05T04:00:00.000)

Compare a janela de recursos desses trabalhos de solicitação mais recentes e os trabalhos de solicitação mostrados no exemplo anterior.

Provisionamento de dados por ID de trabalho

Uma solicitação de provisionamento também pode ser criada com uma ID de trabalho. Esta é uma maneira conveniente de tentar novamente um trabalho de materialização que falhou ou foi cancelado. Primeiro, localize a ID do trabalho para o qual será feita nova tentativa:

  • Navegue até o conjunto de recursos da interface do usuário dos Trabalhos de materialização
  • Selecione o Nome de exibição de um trabalho específico que tenha um Falha Status valor
  • Na página Visão geral do trabalho, localize o valor da ID do trabalho relevante na propriedade Nome; ela começa com Featurestore-Materialization-.

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version=version,
    job_id="<JOB_ID_OF_FAILED_MATERIALIZATION_JOB>",
)
print(poller.result().job_ids)

Você pode enviar um trabalho de provisionamento com a ID de um trabalho de materialização com falha ou cancelado. Nesse caso, o status dos dados da janela de recursos para o trabalho de materialização original com falha ou cancelado deve ser Incomplete. Se essa condição não for atendida, o trabalho de provisionamento por ID resultará em um erro de usuário. Por exemplo, um trabalho de materialização com falha pode ter uma hora de início da janela de recursos com valor 2023-04-01T04:00:00.000 e uma hora de término com valor 2023-04-09T04:00:00.000. Um trabalho de provisionamento enviado usando a ID desse trabalho com falha só terá êxito se o status dos dados em todos os lugares no intervalo de tempo de 2023-04-01T04:00:00.000 para 2023-04-09T04:00:00.000 for Incomplete.

Diretrizes e melhores práticas

Definir o agendamento source_delay e recorrente adequado

A propriedade source_delay dos dados de origem indica o atraso entre o tempo de aquisição dos dados prontos para consumo, em comparação com o tempo do evento da geração de dados. Um evento que aconteceu no momento t chega à tabela de dados de origem no momento t + x, devido à latência do pipeline de dados upstream. O valor x é o atraso da origem.

Ilustração que mostra o conceito source_delay.

Para uma configuração adequada, o agendamento de trabalhos de materialização recorrentes leva em consideração a latência. O trabalho recorrente produz recursos para a janela de tempo [schedule_trigger_time - source_delay - schedule_interval, schedule_trigger_time - source_delay).

materialization_settings:
  schedule:
    type: recurrence
    interval: 1
    frequency: Day
    start_time: "2023-04-15T04:00:00.000"

Este exemplo define um trabalho diário que é disparado às 4h, começando em 15/04/2023. Dependendo da configuração source_delay, a execução do trabalho de 1/5/2023 produz recursos em janelas de tempo diferentes:

  • source_delay=0 produz valores de recurso na janela [2023-04-30T04:00:00.000, 2023-05-01T04:00:00.000)
  • source_delay=2hours produz valores de recurso na janela [2023-04-30T02:00:00.000, 2023-05-01T02:00:00.000)
  • source_delay=4hours produz valores de recurso na janela [2023-04-30T00:00:00.000, 2023-05-01T00:00:00.000)

Atualizar repositório de materialização

Antes de atualizar um repositório de materialização online ou offline de um conjunto de recursos, todos os conjuntos de recursos nesse repositório de recursos devem ter a materialização offline e/ou online correspondente desativada. A operação de atualização falhará como UserError se alguns conjuntos de recursos tiverem a materialização habilitada.

O status de materialização dos dados no repositório de materialização offline e/ou online será redefinido se a materialização offline e/ou online estiver desabilitada em um conjunto de recursos. A redefinição torna os dados materializados inutilizáveis. Se a materialização offline e/ou online no conjunto de recursos for habilitada posteriormente, os usuários deverão reenviar seus trabalhos de materialização.

Inicialização de dados online

A inicialização de dados online só será aplicável se os trabalhos de materialização offline enviados tiverem sido concluídos com êxito. Se apenas a materialização offline tiver sido habilitada inicialmente para um conjunto de recursos e a materialização online for habilitada posteriormente, então:

  • O status de materialização de dados padrão dos dados no repositório online será None

  • Quando um trabalho de materialização online é enviado, os dados com status de materialização Complete no repositório offline serão usados para calcular recursos online. Isso é chamado de inicialização de dados online. A inicialização de dados online economiza custo computacional porque reutiliza recursos já computados salvos no repositório de materialização offline. Esta tabela resume os valores de status de dados offline e online em intervalos de dados que resultariam em uma inicialização de dados online:

    Hora de início Hora de término Status de dados offline Status de dados online Inicialização de dados online
    2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None None Não
    2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete None Não
    2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 Pending None Nenhum trabalho de materialização enviado
    2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete None Sim

Abordar erros e modificações nos dados de origem

Alguns cenários modificam os dados de origem devido a um erro ou outros motivos, após a materialização dos dados. Nesses casos, uma atualização dos dados de recurso, para uma janela de recurso específica em vários intervalos de dados, pode resolver dados de recurso incorretos ou obsoletos. Envie a solicitação de materialização para resolução dos dados de recursos incorretos ou obsoletos na janela de recursos, para os status de dados None, Complete e Incomplete.

Você deve enviar uma solicitação de materialização para uma atualização dos dados de recurso somente quando a janela de recurso não contiver nenhum intervalo de dados com um status de dados Pending.

Preenchendo as lacunas

No repositório de materialização, os dados materializados podem ter lacunas porque:

  • um trabalho de materialização nunca foi enviado para a janela de recursos
  • os trabalhos de materialização enviados para a janela de recursos falharam ou foram cancelados

Nesse caso, envie uma solicitação de materialização na janela de recursos para data_status=[DataAvailabilityStatus.NONE,DataAvailabilityStatus.Incomplete] para preencher as lacunas. Uma única solicitação de materialização preenche todas as lacunas na janela de recursos.

Próximas etapas