{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "3fdd7eec-a38a-4835-9fbc-9e15b09c17d2",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Utilização da carga de trabalho\"\n",
        "description: \"Explica o que é uso e como estimar quanto tempo levará para executar uma tarefa que utiliza um primitivo\"\n",
        "---\n",
        "\n",
        "<span id=\"workload-usage\" />\n",
        "\n",
        "# Utilização da carga de trabalho\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "720c96d9-4903-4eea-ae7a-19c34208150b",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "46a0a6e0-dee7-4ac9-91b2-399e7a51623f",
      "metadata": {},
      "source": [
        "<span id=\"usage\" />\n",
        "\n",
        "O uso representa o consumo do serviço de Unidade de Processamento de Carga ( Qiskit Runtime ) e é determinado pelo tempo durante o qual uma QPU fica reservada para executar cargas de trabalho.\n",
        "\n",
        "* O uso da sessão é medido como o tempo decorrido enquanto a sessão permanece ativa, pois a capacidade da QPU é reservada durante toda a duração da sessão, independentemente de as cargas de trabalho estarem em execução ativa. Consulte [“Duração da sessão”](/docs/guides/run-jobs-session#session-length) para obter mais informações sobre as transições de status da sessão.\n",
        "* O uso em lote é medido como o tempo acumulado durante o qual a QPU fica bloqueada para executar todas as tarefas do lote.\n",
        "* A utilização de uma única tarefa é medida como o tempo em que a QPU fica bloqueada para executar a tarefa.\n",
        "\n",
        "Observe que trabalhos com falha ou cancelados contam para o seu uso em determinadas circunstâncias. Consulte a seção [Trabalhos com falha e cancelados](#failed-job) para obter detalhes.\n",
        "\n",
        "Para usuários do plano Pay-As-You-Go, consulte [“Gerenciar custos”](/docs/guides/manage-cost) para obter detalhes sobre como definir um limite de custos.\n",
        "\n",
        "<span id=\"failed-job\" />\n",
        "\n",
        "<span id=\"usage-for-failed-and-canceled-jobs\" />\n",
        "\n",
        "## Utilização para trabalhos com falha e cancelados\n",
        "\n",
        "Quando um trabalho falha ou é cancelado, o uso relatado é o seguinte:\n",
        "\n",
        "* Modo de tarefa ou em lote: Se a falha ou o cancelamento ocorreu devido a um erro do sistema, o uso relatado é zero. Para tarefas que falharam devido a erro do usuário ou quando um usuário cancelou uma tarefa, o uso relatado corresponde a todo o consumo ocorrido até aquele momento, incluindo a sobrecarga incorrida para preparar a QPU para a execução da tarefa.\n",
        "\n",
        "* Modo de sessão: O uso relatado é o tempo real em que a sessão está ativa, independentemente do número de tarefas que falham ou são canceladas.\n",
        "\n",
        "<span id=\"view-usage\" />\n",
        "\n",
        "<span id=\"query-a-workloads-actual-usage\" />\n",
        "\n",
        "## Consultar o uso real de uma carga de trabalho\n",
        "\n",
        "Após a conclusão de uma carga de trabalho, há várias maneiras de visualizar seu uso real:\n",
        "\n",
        "* Executar [`batch.usage()`](/docs/api/qiskit-ibm-runtime/batch#usage) ou [`session.usage()`](/docs/api/qiskit-ibm-runtime/session#usage) em `qiskit-ibm-runtime` 0.30 ou posterior.  Se estiver usando uma versão mais antiga de `qiskit-ibm-runtime` (>= 0.23 e \\< 0.30 ), o uso ainda poderá ser encontrado em `session.details()[\"usage_time\"]` e `batch.details()[\"usage_time\"]`.\n",
        "* Uso [`GET /sessions/{id}`](/docs/api/qiskit-ibm-runtime/tags/sessions#tags__sessions__operations__GetSessionDetailsExtendedController_getSessionDetails) para ver o uso de um lote ou sessão específica.\n",
        "* Uso [`GET /jobs/{id}`](/docs/api/qiskit-ibm-runtime/tags/jobs#tags__jobs__operations__GetJobByIdController_getJobById) para ver o uso de um único trabalho.\n",
        "\n",
        "<span id=\"instance-usage\" />\n",
        "\n",
        "<span id=\"view-instance-usage\" />\n",
        "\n",
        "## Ver uso da instância\n",
        "\n",
        "Você pode visualizar o uso de uma instância na página [Instâncias](/instances) ou, para quem tiver a devida autoridade, na página [Analytics](/analytics).  Observe que as páginas podem mostrar números de uso diferentes porque calculam o uso de forma diferente.\n",
        "\n",
        "A página Instâncias mostra o uso em tempo real dos últimos 28 dias (contínuo), até a hora atual no dia atual.  O uso da página do Analytics é recalculado a cada hora e inclui os últimos 28 dias completos, ou seja, mostra o uso das 00:00 horas de 28 dias atrás até hoje, no topo da hora.\n",
        "\n",
        "<span id=\"estimate-usage-before-submitting-a-job\" />\n",
        "\n",
        "## Estime o uso antes de enviar um trabalho\n",
        "\n",
        "Embora a obtenção de uma estimativa local precisa seja complicada devido às operações extras realizadas para supressão e atenuação de erros, você pode usar essa fórmula de linha de base para obter uma aproximação do uso estimado:\n",
        "\n",
        "`<per sub-job overhead> + (rep_delay + <circuit length>) * <num executions>`\n",
        "\n",
        "* `<per sub-job overhead>` é uma sobrecarga de aproximadamente 2s por subtrabalho. Isso inclui operações como o carregamento da carga útil nos componentes eletrônicos de controle. Seu trabalho primitivo pode ser dividido em vários subtrabalhos se for muito grande para o mecanismo de execução processar tudo de uma vez.\n",
        "* `rep_delay` é uma opção [personalizável pelo usuário](/docs/api/qiskit-ibm-runtime/options-execution-options-v2#rep_delay), e o padrão é dado por `backend.default_rep_delay`, que é de 250 microssegundos na maioria dos back-ends do IBM Quantum. Observe que a redução de `rep_delay` diminui o tempo total de execução da QPU, mas às custas do aumento da taxa de erro de preparação do estado; consulte o guia de [execução da taxa de repetição dinâmica](/docs/guides/repetition-rate-execution) para obter mais informações.\n",
        "* `<circuit length>` é o comprimento total da instrução. Cada instrução leva um tempo diferente na QPU, portanto, o comprimento total varia de circuito para circuito. Uma medição, por exemplo, pode levar 56 vezes mais tempo do que uma porta `x` . `backend.target[<instruction>][<qubit>].duration` pode ser usado para encontrar a duração exata de cada instrução. O comprimento típico de um circuito está provavelmente entre 50 e 100 microssegundos. Se estiver usando técnicas de supressão ou atenuação de erros com os primitivos, instruções extras poderão ser inseridas no seu circuito, o que aumentaria o comprimento total do circuito.\n",
        "  <Admonition type=\"note\">\n",
        "    A [opção experimental `scheduler_timing` ](/docs/guides/visualize-circuit-timing) retorna o tempo total do circuito, mas esse NÃO é o tempo usado para faturamento.\n",
        "  </Admonition>\n",
        "* `<num executions>` é o número total de circuitos multiplicado pelo número de disparos, sendo que os circuitos são aqueles gerados após a transmissão dos elementos d PUB.\n",
        "  * Se você estiver usando técnicas de mitigação de erros com os primitivos, circuitos extras podem ser executados como parte do processo de mitigação, o que aumentaria o número total de execuções. Além disso, técnicas avançadas de mitigação de erros, como PEA e PEC, apresentam uma sobrecarga muito maior, pois exigem circuitos em funcionamento para o aprendizado de ruído.\n",
        "  * O estimador agrupa observáveis comutáveis por qubit, o que reduz o número de execuções.\n",
        "\n",
        "Se você não estiver usando nenhuma técnica avançada de mitigação de erros ou personalizada `rep_delay`, pode usar `2+0.00035*<num executions>` como uma fórmula rápida.\n",
        "\n",
        "<span id=\"estimate-usage-locally-with-qiskit\" />\n",
        "\n",
        "### Estimar o uso localmente com o Qiskit\n",
        "\n",
        "Este exemplo de código demonstra como usar o Qiskit para calcular o tempo de circuito:\n",
        "\n",
        "```python\n",
        "\n",
        "# Schedule the circuit to get more accurate timing\n",
        "pm = generate_preset_pass_manager(\n",
        "    target=backend.target,\n",
        "    optimization_level=0,\n",
        "    scheduling_method=\"alap\"\n",
        ")\n",
        "\n",
        "scheduled_circuits = pm.run(isa_circuits)\n",
        "\n",
        "init_duration = backend.target[\"reset\"][(0,)].duration\n",
        "rep_delay = sampler.options.execution.rep_delay or backend.default_rep_delay\n",
        "\n",
        "circuit_duration = 0\n",
        "\n",
        "for circuit in scheduled_circuits:\n",
        "    # Estimate circuit length\n",
        "    circuit_duration += circuit.estimate_duration(backend.target)\n",
        "\n",
        "    # Add INIT time\n",
        "    if sampler.options.execution.init_qubits:\n",
        "        circuit_duration += init_duration\n",
        "\n",
        "    # Add rep_delay\n",
        "    circuit_duration += rep_delay\n",
        "\n",
        "total_time = 2 + (circuit_duration*shots)\n",
        "print(f\"Total estimated usage is {math.ceil(total_time)} seconds\")\n",
        "```\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Analise estas dicas: [Minimizar o tempo de execução do trabalho](minimize-time).\n",
        "  * Defina o [tempo máximo de execução](max-execution-time).\n",
        "  * Saiba como fazer a transpilagem localmente na seção [Transpilagem](/docs/guides/transpile/).\n",
        "  * Experimente o guia [Comparar configurações do transpiler](/docs/guides/circuit-transpilation-settings).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}