Conceitos de materialização de conjuntos de recursos

A materialização calcula valores de feição a partir de dados de origem. Os valores de hora de início e hora de término definem uma janela de recurso. Um trabalho de materialização calcula recursos nesta janela de recursos. Os valores de recursos materializados são então armazenados em uma loja 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 conjunto de recursos aplica as transformações à origem on-the-fly, para calcular 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, as características devem ser materializadas antes do treinamento ou inferência. A materialização nesta fase proporciona uma maior fiabilidade e disponibilidade.

Explorando a materialização de recursos

A interface do usuário de trabalhos de materialização mostra o status de materialização de dados em lojas de materialização offline e online e uma lista de trabalhos de materialização.

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

Em uma janela de recurso:

  • O gráfico de séries temporais na parte superior mostra os intervalos de dados que caem na janela de recursos, com o status de materialização, para lojas 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.

Estado e intervalo de materialização dos dados

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

  • Completo (verde) - materialização de dados bem-sucedida
  • Incompleto (vermelho) - um ou mais trabalhos de materialização cancelados ou com falha para este intervalo de dados
  • Pendente (azul) - um ou mais trabalhos de materialização para este intervalo de dados estão em andamento
  • Nenhum (cinza) - nenhum trabalho de materialização foi enviado para este 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 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 de dados diferente, esse intervalo de dados é dividido em vários intervalos de dados

Quando os usuários selecionam uma janela de recurso, 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 separados na linha do tempo. Por exemplo, o instantâneo anterior tem 16 intervalos de dados para a janela de recurso definida no repositório de materialização offline.

A qualquer momento, um conjunto de recursos pode ter no máximo 2.000 intervalos de dados. Quando um conjunto de recursos atinge esse limite, não é possível executar mais trabalhos de materialização. Os usuários devem então criar uma nova versão do conjunto de recursos com a materialização habilitada. Para a nova versão do conjunto de funcionalidades, materialize as funcionalidades nas lojas offline e online a partir do zero.

Para evitar o limite, os usuários devem executar trabalhos de preenchimento 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:

Aviso

Os dados já materializados na materialização offline e/ou online deixarão de ser utilizáveis se a materialização de dados offline e/ou online estiver desativada ao nível do conjunto de funcionalidades. O estado de materialização de dados na loja de materialização offline e/ou online será redefinido para None.

Você pode enviar trabalhos de backfill da seguinte forma:

  • Estado de materialização dos dados
  • A ID do trabalho de um trabalho de materialização cancelado ou com falha

Preenchimento de dados por status de materialização de dados

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

  • Uma lista de valores de status de materialização de dados - Incompleto, Completo 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 preenchimento, um novo trabalho de materialização é criado para cada intervalo de dados que tem um status de materialização de dados correspondente (Incompleto, Completo ou Nenhum). Além disso, os intervalos de dados relevantes devem estar dentro da janela de recurso 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 recurso são opcionais na solicitação de preenchimento:

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

Nota

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

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

Hora de início Hora de fim Estado de materialização dos 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

Esta solicitação de preenchimento tem estes valores:

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

Cria os seguintes postos de trabalho de materialização:

  • Tarefa 1: janela de recurso do processo [2023-04-02T12:00:00.000, 2023-04-03T04:00:00.000)
  • Trabalho 2: janela de recurso de processo [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 intervalo de dados e status de materialização se tornarão:

Hora de início Hora de fim Estado de materialização dos 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 um novo trabalho de materialização tenha sido executado durante metade do dia 2023-04-04, o intervalo de dados não é alterado (dividido) porque o status de materialização não mudou.

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

  • Tarefa 1: janela de recurso do processo [2023-04-02T04:00:00.000, 2023-04-03T04:00:00.000)
  • Trabalho 2: janela de recurso de processo [2023-04-04T04:00:00.000, 2023-04-05T04:00:00.000)

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

Preenchimento de dados por ID de trabalho

Uma solicitação de preenchimento também pode ser criada com uma ID de trabalho. Esta é uma maneira conveniente de tentar novamente um trabalho de materialização fracassado ou cancelado. Primeiro, encontre o ID do trabalho para tentar novamente:

  • Navegue até a interface do usuário de trabalhos de materialização do conjunto de recursos
  • Selecione o Nome para exibição de um trabalho específico que tenha um valor Status com falha
  • Na página Visão geral do trabalho, localize o valor de ID do trabalho relevante na propriedade Name 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 preenchimento com a ID do trabalho de um trabalho de materialização reprovado ou cancelado. Nesse caso, o status de 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 preenchimento por ID resultará em um erro do usuário. Por exemplo, um trabalho de materialização com falha pode ter um valor de hora de início da janela de recurso e um valor de hora 2023-04-09T04:00:00.000 de 2023-04-01T04:00:00.000 término. Um trabalho de preenchimento enviado usando a ID desse trabalho com falha só será bem-sucedido se o status dos dados em todos os lugares, no intervalo 2023-04-01T04:00:00.000 de tempo para 2023-04-09T04:00:00.000, for Incomplete.

Documentação de orientação e melhores práticas

Definir cronograma adequado source_delay e recorrente

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

Ilustração que mostra o conceito source_delay.

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

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 é acionado às 4 da manhã, começando em 15/04/2023. Dependendo da source_delay configuração, a execução do trabalho de 01/05/2023 produz recursos em diferentes janelas de tempo:

  • source_delay=0 Produz valores de feição na janela [2023-04-30T04:00:00.000, 2023-05-01T04:00:00.000)
  • source_delay=2hours Produz valores de feição na janela [2023-04-30T02:00:00.000, 2023-05-01T02:00:00.000)
  • source_delay=4hours Produz valores de feição na janela [2023-04-30T00:00:00.000, 2023-05-01T00:00:00.000)

Atualizar loja de materialização

Antes de atualizar uma loja de materialização online ou offline, todos os conjuntos de recursos nessa loja de recursos devem ter a materialização offline e/ou online correspondente desabilitada. A operação de atualização falhará como , se UserErroralguns conjuntos de recursos tiverem a materialização habilitada.

O estado de materialização dos dados na loja de materialização offline e/ou online é reposto se a materialização offline e/ou online estiver desativada num conjunto de funcionalidades. 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.

Bootstrap de dados online

O bootstrap de dados on-line só é aplicável se os trabalhos de materialização offline enviados tiverem sido concluídos com sucesso. Se apenas a materialização offline foi inicialmente habilitada para um conjunto de recursos e a materialização online é habilitada posteriormente, então:

  • O status padrão de materialização de dados dos dados na loja online é None

  • Quando um trabalho de materialização online é enviado, os dados com Complete status de materialização na loja offline são usados para calcular recursos online. Isso é chamado de inicialização de dados on-line. A inicialização de dados on-line economiza custos computacionais 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 na inicialização de dados online:

    Hora de início Hora de fim Estado dos dados offline Estado dos dados online Bootstrap de dados online
    2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None None No
    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 submetido
    2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete None Sim

Corrigir erros e modificações de 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 de dados de recurso, para uma janela de recurso específica em vários intervalos de dados, pode resolver dados de recurso errados ou obsoletos. Envie a solicitação de materialização para resolução de dados de recurso incorreta ou obsoleta na janela do recurso, para os status dos Nonedados , Completee Incomplete.

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

Preencher as lacunas

No armazenamento 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

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

Próximos passos