Introdução aos fluxos de trabalho gerenciados
Qiskit Functions e fluxos de trabalho gerenciados são recursos beta disponíveis apenas para usuários dos planos Premium, Flex e On-Prem (por meio da API do IBM Quantum® Platform).
Os fluxos de trabalho gerenciados executam seu código Python personalizado em computação clássica que o IBM Quantum Platform gerencia para você. Use fluxos de trabalho gerenciados para executar fluxos de trabalho híbridos quântico-clássicos, diagonalização em grande escala e tarefas paralelas de longa duração sem precisar gerenciar infraestrutura de computação ou armazenamento.
Quando usar um fluxo de trabalho gerenciado
Use um fluxo de trabalho gerenciado quando nenhuma Catalog Function pré-construída cobre a sua tarefa, ou quando você quer empacotar o seu próprio método como uma função reutilizável. Fluxos de trabalho gerenciados são uma boa opção quando você quer fazer o seguinte:
-
Executar jobs longos na nuvem. Um fluxo de trabalho gerenciado continua em execução quando você fecha o notebook, e você pode se reconectar ao job depois.
-
Usar nós com muita memória e GPU. Escolha os recursos de memória, CPU e GPU que a carga de trabalho precisa.
-
Executar tarefas em paralelo. Inicie muitos jobs de nó único ao mesmo tempo.
Você fornece o código do fluxo de trabalho, suas dependências e os tamanhos de computação que ele suporta. Os fluxos de trabalho gerenciados executam o fluxo de trabalho em computação gerenciada pela IBM® em um ambiente pré-construído com seus pacotes instalados, e fornecem armazenamento na nuvem para os arquivos que o fluxo de trabalho lê e grava.
Como os fluxos de trabalho gerenciados funcionam
Você envia um fluxo de trabalho uma única vez e executa quantos jobs precisar. Cada job funciona das seguintes maneiras:
-
O job começa em um ambiente novo com um disco local vazio. Os fluxos de trabalho gerenciados desligam o ambiente depois que o job termina.
-
O job é executado em um dos tamanhos de computação que você define ao enviar o fluxo de trabalho. Você pode escolher um tamanho diferente a cada execução.
-
O job pode ler e gravar no armazenamento de arquivos do fluxo de trabalho. Os arquivos no armazenamento de arquivos permanecem depois que o job termina.
Como cada job começa com um disco local vazio, um job posterior só encontra os arquivos que um job anterior salvou no armazenamento de arquivos.
Ciclo de vida de uma execução
Cada job é executado de forma assíncrona por até 24 horas. Você pode ter até 50 jobs ativos ao mesmo tempo se sua instância tiver alocação suficiente.
A tabela a seguir descreve cada etapa do diagrama e o status do job que você vê durante essa etapa:
| Etapa | O que acontece | Status do job |
|---|---|---|
| Envio | Você envia o código, as dependências e os tamanhos do fluxo de trabalho. O fluxo de trabalho rejeita um envio inválido antes de qualquer job ser executado. | Nenhum (ainda não há job) |
| Fila | Você chama run(). O fluxo de trabalho verifica se sua instância tem alocação suficiente e agenda o job quando houver computação disponível. | QUEUED |
| Início | O fluxo de trabalho cria um ambiente com o perfil de computação que você selecionou. | INITIALIZING |
| Execução | O entrypoint do seu fluxo de trabalho é executado. O entrypoint pode reportar seu progresso com update_status(), e você pode ler os logs dele com logs() enquanto ele é executado. | RUNNING, ou uma etapa que você definir, como RUNNING: WAITING_FOR_QPU |
| Resultado | O job termina, e o fluxo de trabalho desliga o ambiente, mantendo o resultado e os logs. | DONE, ERROR ou CANCELED |
O que um job em execução pode acessar
Cada job é executado em um ambiente isolado. O diagrama e a tabela a seguir mostram os recursos que um job em execução pode usar.
| Recurso | O que o job pode usar |
|---|---|
| Computação | A CPU, a memória e as GPUs do perfil de computação que você selecionou para o job. |
| Código e pacotes | Os arquivos que você enviou com o fluxo de trabalho e os pacotes suportados que estão instalados no ambiente. |
| Argumentos | Os argumentos que você passou para run(). Leia-os com get_arguments(). |
| Acesso à QPU | As credenciais e a instância que você usou para chamar run(). Os jobs de QPU que o fluxo de trabalho envia são executados na sua instância e contam para o seu uso. |
| Saídas | Um resultado que o job salva com save_result(), logs que o job imprime e atualizações de status que o job define com update_status(). |
| Armazenamento de arquivos | Arquivos que todas as suas execuções do fluxo de trabalho compartilham. Os arquivos permanecem no armazenamento depois que o job termina. |
| Internet | Sem acesso. Um job não pode fazer conexões de saída. Declare os pacotes ao enviar o fluxo de trabalho e forneça os dados como argumentos ou arquivos. |
Segurança e isolamento
Os fluxos de trabalho gerenciados isolam cada job dos outros jobs e limitam os privilégios do código que é executado nele. Os limites de acesso na tabela anterior fazem parte desse isolamento. Os fluxos de trabalho gerenciados também aplicam as seguintes proteções:
-
Isolamento de jobs. Nenhum outro job é executado no ambiente do seu job. Isso inclui jobs de outros usuários e seus próprios jobs que são executados ao mesmo tempo.
-
Resultados, logs e armazenamento. Somente o usuário que executou um job pode ler seus resultados e logs.
-
Credenciais. Os fluxos de trabalho gerenciados criptografam as credenciais que um job usa, incluindo seu token de API, quando as armazenam. O código do seu fluxo de trabalho pode ler essas credenciais enquanto o job é executado.
-
Privilégios. Os fluxos de trabalho gerenciados removem os privilégios de nível de administrador do ambiente antes de o seu entrypoint começar.
Comparação com HPC local
Os fluxos de trabalho gerenciados diferem de um cluster de HPC local na forma como você obtém tempo de computação, configura o software e envia jobs. A tabela a seguir compara tarefas comuns.
| Tarefa | Cluster de HPC local | Fluxos de trabalho gerenciados |
|---|---|---|
| Obter tempo de computação | Solicite uma alocação ou uma reserva ao administrador do cluster. | Use a alocação da sua instância do IBM Quantum. O fluxo de trabalho coloca cada job na fila quando você chama run(). |
| Acessar o sistema | Conecte-se a um nó de login com SSH. | Use o cliente Python no seu computador local. Os fluxos de trabalho gerenciados não fornecem um nó de login. |
| Instalar software | Compile software, carregue módulos ou peça a um administrador para instalar pacotes. | Use os pacotes suportados que estão instalados em todos os ambientes, ou envie wheels para outros pacotes. |
| Enviar um job | Escreva um script em lote e envie-o ao agendador. | Chame run() com os argumentos do job. |
| Solicitar recursos | Solicite nós, CPUs, memória e GPUs. | Selecione um dos tamanhos de computação definidos para o fluxo de trabalho. Cada job é executado em um único nó. |
| Executar uma varredura de parâmetros | Envie um job array. | Chame run() uma vez para cada conjunto de argumentos. |
| Armazenar arquivos compartilhados | Grave em um sistema de arquivos scratch compartilhado. | Grave no armazenamento de arquivos do fluxo de trabalho. |
| Limitar o tempo de execução | Defina um limite de tempo de relógio. | O fluxo de trabalho cancela um job após 24 horas. |
| Fazer checkpoint de jobs longos | Grave checkpoints no armazenamento scratch. | Salve resultados intermediários no armazenamento de arquivos. |
| Reexecutar um job com falha | Reenvie o job. | Chame run() novamente. O fluxo de trabalho não tenta executar novamente jobs com falha automaticamente. |
| Monitorar jobs | Verifique a fila e os arquivos de log a partir do nó de login. | Verifique o status, os logs e o resultado de cada job a partir da sua sessão Python local. |
Próximos passos
- Instale os pacotes do cliente e autentique-se.
- Implante seu primeiro fluxo de trabalho gerenciado para enviar um fluxo de trabalho, executá-lo e obter o resultado.