{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "3fdd7eec-a38a-4835-9fbc-9e15b09c17d2",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Uso de la carga de trabajo\"\n",
        "description: \"Explica qué es el uso y cómo estimar cuánto tiempo tardará en ejecutarse un trabajo que utiliza una primitiva\"\n",
        "---\n",
        "\n",
        "<span id=\"workload-usage\" />\n",
        "\n",
        "# Uso de la carga de trabajo\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",
        "El uso se refiere al consumo del servicio « Qiskit Runtime » y viene determinado por el tiempo durante el que una QPU está reservada para ejecutar cargas de trabajo.\n",
        "\n",
        "* El uso de la sesión se mide como el tiempo transcurrido mientras la sesión permanece activa, ya que la capacidad de la QPU se reserva durante toda la duración de la sesión, independientemente de si las cargas de trabajo se están ejecutando activamente. Consulte [«Duración de la sesión»](/docs/guides/run-jobs-session#session-length) para obtener más información sobre las transiciones de estado de la sesión.\n",
        "* El uso por lotes se mide como el tiempo acumulado durante el cual la QPU permanece bloqueada para ejecutar todos los trabajos del lote.\n",
        "* El uso de un solo trabajo se mide como el tiempo durante el cual la QPU permanece bloqueada para ejecutar dicho trabajo.\n",
        "\n",
        "Tenga en cuenta que los trabajos fallidos o cancelados cuentan para su uso en determinadas circunstancias. Consulte la sección [Trabajos fallidos y cancelados](#failed-job) para obtener más información.\n",
        "\n",
        "Si utilizas el plan de pago por uso, consulta [«Gestionar costes»](/docs/guides/manage-cost) para obtener más información sobre cómo establecer un límite de gastos.\n",
        "\n",
        "<span id=\"failed-job\" />\n",
        "\n",
        "<span id=\"usage-for-failed-and-canceled-jobs\" />\n",
        "\n",
        "## Uso para trabajos fallidos y cancelados\n",
        "\n",
        "Cuando un trabajo falla o se cancela, el uso reportado es el siguiente:\n",
        "\n",
        "* Modo de trabajo o por lotes: si el fallo o la cancelación se debieron a un error del sistema, el consumo registrado es cero. En el caso de los trabajos que hayan fallado debido a un error del usuario o que este haya cancelado, el uso registrado corresponde a todo el consumo que se haya producido hasta ese momento, incluida la sobrecarga generada al preparar la QPU para ejecutar el trabajo.\n",
        "\n",
        "* Modo de sesión: El uso informado es el tiempo real durante el cual la sesión está activa, independientemente del número de trabajos que fallen o se cancelen.\n",
        "\n",
        "<span id=\"view-usage\" />\n",
        "\n",
        "<span id=\"query-a-workloads-actual-usage\" />\n",
        "\n",
        "## Consultar el uso real de una carga de trabajo\n",
        "\n",
        "Una vez finalizada una carga de trabajo, hay varias formas de ver su uso real:\n",
        "\n",
        "* Ejecute [`batch.usage()`](/docs/api/qiskit-ibm-runtime/batch#usage) o [`session.usage()`](/docs/api/qiskit-ibm-runtime/session#usage) en `qiskit-ibm-runtime` 0.30 o posterior.  Si se utiliza una versión anterior de `qiskit-ibm-runtime` (>= 0.23 y \\< 0.30 ), el uso puede encontrarse aún en `session.details()[\"usage_time\"]` y `batch.details()[\"usage_time\"]`.\n",
        "* Utilice [`GET /sessions/{id}`](/docs/api/qiskit-ibm-runtime/tags/sessions#tags__sessions__operations__GetSessionDetailsExtendedController_getSessionDetails) para ver el uso de un lote o sesión específicos.\n",
        "* Utilice [`GET /jobs/{id}`](/docs/api/qiskit-ibm-runtime/tags/jobs#tags__jobs__operations__GetJobByIdController_getJobById) para ver el uso de un solo trabajo.\n",
        "\n",
        "<span id=\"instance-usage\" />\n",
        "\n",
        "<span id=\"view-instance-usage\" />\n",
        "\n",
        "## Ver uso de la instancia\n",
        "\n",
        "Puede ver el uso de una instancia en la página [Instancias](/instances) o, para aquellos con la autoridad adecuada, en la página [Análisis](/analytics).  Tenga en cuenta que las páginas pueden mostrar cifras de uso diferentes porque calculan el uso de forma distinta.\n",
        "\n",
        "La página Instancias muestra el uso en tiempo real de los últimos 28 días (sucesivos), hasta la hora actual del día en curso.  El uso de la página de Analytics se recalcula cada hora e incluye los últimos 28 días completos; es decir, muestra el uso desde las 00:00 de hace 28 días hasta hoy, al principio de la hora.\n",
        "\n",
        "<span id=\"estimate-usage-before-submitting-a-job\" />\n",
        "\n",
        "## Calcule el uso antes de enviar un trabajo\n",
        "\n",
        "Aunque obtener una estimación local precisa es complicado debido a las operaciones adicionales realizadas para la supresión y mitigación de errores, puede utilizar esta fórmula de referencia para obtener una aproximación del uso estimado:\n",
        "\n",
        "`<per sub-job overhead> + (rep_delay + <circuit length>) * <num executions>`\n",
        "\n",
        "* `<per sub-job overhead>` es una sobrecarga de aproximadamente 2s por subtrabajo. Esto incluye operaciones como la carga de la carga útil en la electrónica de control. Su trabajo primitivo puede dividirse en varios sub-trabajos si es demasiado grande para que el motor de ejecución lo procese todo a la vez.\n",
        "* `rep_delay` es una opción [personalizable por el usuario](/docs/api/qiskit-ibm-runtime/options-execution-options-v2#rep_delay), y el valor por defecto viene dado por `backend.default_rep_delay`, que es de 250 microsegundos en la mayoría de los backends de IBM Quantum. Tenga en cuenta que la reducción de `rep_delay` disminuye el tiempo total de ejecución de QPU, pero a expensas de un aumento de la tasa de error de preparación de estado; consulte la guía de [ejecución de la tasa de repetición](/docs/guides/repetition-rate-execution) dinámica para obtener más información.\n",
        "* `<circuit length>` es la longitud total de la instrucción. Cada instrucción requiere un tiempo diferente en la QPU, por lo que la duración total varía de un circuito a otro. Una medición, por ejemplo, puede tardar 56 veces más que una puerta `x` . `backend.target[<instruction>][<qubit>].duration` se puede utilizar para encontrar la duración exacta de cada instrucción. Un circuito típico puede durar entre 50 y 100 microsegundos. Si utilizas técnicas de supresión o mitigación de errores con las primitivas, es posible que se inserten instrucciones adicionales en tu circuito, lo que aumentaría la longitud total del circuito.\n",
        "  <Admonition type=\"note\">\n",
        "    La [opción experimental `scheduler_timing` ](/docs/guides/visualize-circuit-timing) devuelve el tiempo total del circuito, pero NO es el tiempo utilizado para la facturación.\n",
        "  </Admonition>\n",
        "* `<num executions>` es el número total de circuitos multiplicado por el número de disparos, donde los circuitos son los generados después de que se transmiten los elementos PUB.\n",
        "  * Si utiliza técnicas de mitigación de errores con las primitivas, es posible que se ejecuten circuitos adicionales como parte del proceso de mitigación, lo que aumentaría el número total de ejecuciones. Además, las técnicas avanzadas de mitigación de errores, como PEA y PEC, conllevan una sobrecarga mucho mayor, ya que requieren circuitos en funcionamiento para el aprendizaje del ruido.\n",
        "  * El estimador agrupa observables conmutables por qubit, lo que reduce el número de ejecuciones.\n",
        "\n",
        "Si no estás utilizando ninguna técnica avanzada de mitigación de errores ni personalizada `rep_delay`, puedes utilizar `2+0.00035*<num executions>` como fórmula rápida.\n",
        "\n",
        "<span id=\"estimate-usage-locally-with-qiskit\" />\n",
        "\n",
        "### Calcular el consumo a nivel local con Qiskit\n",
        "\n",
        "Este ejemplo de código muestra cómo utilizar Qiskit para calcular el tiempo 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óximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendaciones\">\n",
        "  * Revise estos consejos: [Minimiza el tiempo de ejecución del trabajo](minimize-time).\n",
        "  * Establezca el [Tiempo máximo de ejecución](max-execution-time).\n",
        "  * Descubre cómo realizar la transpilación de forma local en la sección «[Transpilación](/docs/guides/transpile/) ».\n",
        "  * Prueba la guía [de configuración del transpilador Compare](/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
}