{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "810fe365-8557-46b0-97e7-324b08a1c6e2",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"작업 모니터링 또는 취소\"\n",
        "description: \"IBM Quantum Platform 에 제출된 작업을 모니터링하거나 취소하는 방법\"\n",
        "---\n",
        "\n",
        "<span id=\"monitor-or-cancel-a-job\" />\n",
        "\n",
        "# 작업 모니터링 또는 취소\n",
        "\n",
        "이 가이드에서는 작업 상태를 확인하는 방법, 사용량 정보를 조회하는 방법, 그리고 작업을 취소하는 방법에 대해 설명합니다. 이 정보는 IBM Quantum® Platform 을 통해서도 확인할 수 있으며, Qiskit을 사용하여 프로그래밍 방식으로 접근할 수도 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "866ed6ab-a597-402e-876a-8315ac5ed9e6",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb84ab8e-6db9-45d6-bb59-2f06f38d9965",
      "metadata": {},
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"패키지 버전\">\n",
        "    이 페이지의 코드는 다음 요구 사항을 바탕으로 개발되었습니다.\n",
        "    이 버전이나 그 이후 버전을 사용하시기를 권장합니다.\n",
        "\n",
        "    ```\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-status",
      "metadata": {},
      "source": [
        "<span id=\"monitor-a-job\" />\n",
        "\n",
        "## 작업 모니터\n",
        "\n",
        "이 메서드들을 사용하여 제출한 작업의 상태를 확인하고, 결과를 가져오며, 작업 및 그 실행과 관련된 세부 정보를 확인할 수 있습니다.\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Monitor a job with Qiskit\">\n",
        "    작업 인스턴스는 모니터링을 위한 여러 가지 메서드를 제공합니다:\n",
        "\n",
        "    | 방법                           | 설명                           |\n",
        "    | ---------------------------- | ---------------------------- |\n",
        "    | `job.status()`               | 현재 작업 상태 확인                  |\n",
        "    | `job.job_id()`               | 고유한 작업 식별자 가져오기              |\n",
        "    | `job.result()`               | 작업 결과 가져오기 (완료될 때까지 호출을 차단함) |\n",
        "    | `job.wait_for_final_state()` | 작업이 종료 상태에 도달할 때까지 차단        |\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-status\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Monitor a job on IBM Quantum Platform\">\n",
        "    ['워크로드' 페이지](/workloads) 로 이동하여 '상태' 열을 확인하십시오. 귀하의 근무 상태는 다음 중 하나로 표시됩니다:\n",
        "\n",
        "    * **대기 중** : 작업이 QPU에서 실행되기를 기다리고 있습니다\n",
        "    * **진행 중** : 작업이 현재 실행 중입니다\n",
        "    * **완료** : 작업이 성공적으로 완료되었습니다\n",
        "    * **실패** : 작업 중 오류가 발생했습니다\n",
        "    * **취소됨** : 사용자가 작업을 취소했습니다\n",
        "\n",
        "    작업 이름이나 행을 클릭하면 상세 보기가 열리며, 여기에서 결과 및 오류 메시지 등의 정보를 확인할 수 있습니다.\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n",
        "<span id=\"why-a-job-stays-in-progress\" />\n",
        "\n",
        "### 직무 상태가 왜 “진행 중”으로 남아 있는지\n",
        "\n",
        "예상보다 훨씬 더 오랜 시간 동안 **‘진행 중’** 상태(Qiskit에서는 `RUNNING` 라고 함)에 머무르는 작업을 발견할 수도 있습니다. 이 작업은 (작업 모드나 배치 모드를 사용하든 상관없이) 단 몇 초밖에 걸리지 않을 것으로 예상했던 것입니다. 이는 정상적인 현상이며, 해당 작업이 그 시간 전체를 사용량으로 소모하고 있다는 의미는 아닙니다. 이는 QPU에 작업이 스케줄링되는 방식 때문에 발생합니다:\n",
        "\n",
        "* 모든 작업은 QPU에서 실행되기 전에 반드시 표준 전처리 과정을 거쳐야 합니다. 이 일반적인 처리가 시작되는 즉시 작업은 ‘ **진행 중** (In progress)`RUNNING`’ 상태로 전환되며, QPU에서 실행이 시작될 때가 아닙니다.\n",
        "* 이러한 일반적인 처리 과정의 대부분은 병렬로 실행되므로, 여러 작업이 동시에 **진행 중** 일 수 있습니다.\n",
        "* 그러나 QPU에서는 한 번에 하나의 작업만 실행될 수 있습니다. 여러 작업이 일반적인 처리를 마치고 실행 준비가 되면, QPU를 사용할 차례가 올 때까지 기다려야 합니다. 이를 *QPU 경합* 이라고 합니다. 경합이 심할 경우, 작업이 실제로 필요한 QPU 시간인 몇 초보다 눈에 띄게 더 오랫동안 **‘진행 중’ 상태로** 남아 있을 수 있습니다.\n",
        "* 또한 QPU에서 보정과 같은 시스템 유지보수 작업이 실행 중일 때도 경합이 발생할 수 있습니다. 유지보수 작업이 완료되고 QPU를 사용할 수 있게 될 때까지 해당 작업은 **‘진행 중’ 상태로** 유지됩니다.\n",
        "\n",
        "이 때문에, 작업이 **‘진행 중’ 상태에** 머무는 실제 경과 시간은 해당 작업의 사용 시간과 동일하지 않습니다. [예상 사용](/docs/guides/estimate-job-run-time) 시간과 [최대 실행](/docs/guides/max-execution-time) 시간은 모두 해당 작업을 실행하기 위해 QPU가 할당된 시간만을 기준으로 산정되므로, 앞서 설명한 멀티스레드 방식의 기존 처리 과정은 제외됩니다. **‘진행 중’** 상태가 오래 지속된다고 해서 보고된 사용량이나 비용이 증가하지는 않습니다.\n",
        "\n",
        "<span id=\"session-mode-is-different\" />\n",
        "\n",
        "#### 세션 모드가 다릅니다\n",
        "\n",
        "앞서 설명한 동작은 [작업 모드와](/docs/guides/execution-modes#job-mode) [일괄 처리 모드](/docs/guides/execution-modes#batch-mode) 모두에 적용됩니다. [세션](/docs/guides/execution-modes#session-mode) 모드에서는 세션의 활성 창이 열려 있는 동안 사용자가 백엔드에 대한 독점적인 액세스 권한을 가지며, 보정 작업을 포함한 다른 어떤 작업도 실행될 수 없습니다. 따라서 QPU 경합은 오직 사용자 자신의 세션 내 작업들 사이에서만 발생합니다. 또한, QPU 용량은 세션이 지속되는 동안 예약되므로, 세션 사용량은 작업이 실제로 실행 중인지 여부와 관계없이 세션이 활성화된 상태로 유지되는 동안 경과한 시간으로 측정됩니다. 자세한 내용은 [‘워크로드 사용](/docs/guides/estimate-job-run-time#usage) 현황’을 참조하십시오.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ee0318b6-0bfd-4f0b-b980-4e233a2d5d7b",
      "metadata": {
        "tags": [
          "id-status"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve a job by ID\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "# Get job ID (useful for saving for later retrieval)\n",
        "print(f\"Job ID: {job.job_id()}\")\n",
        "\n",
        "# Check current status\n",
        "print(f\"Status: {job.status()}\")\n",
        "\n",
        "# Wait for job to complete (blocking call)\n",
        "job.wait_for_final_state()\n",
        "print(\"Job completed\")\n",
        "\n",
        "# Get results\n",
        "results = job.result()\n",
        "print(results)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-usage",
      "metadata": {},
      "source": [
        "<span id=\"view-remaining-usage\" />\n",
        "\n",
        "## 남은 사용량 보기\n",
        "\n",
        "요금제의 사용 한도 중 얼마나 남아 있는지 확인하세요.\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Check usage with Qiskit\">\n",
        "    이 `service.usage()` 메서드를 사용하여 현재 활성화된 인스턴스의 사용 정보를 확인하십시오.\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-usage\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"View usage on IBM Quantum Platform\">\n",
        "    ['인스턴스'](/instances) 페이지로 이동한 후, 확인하려는 요금제와 관련된 탭을 선택하세요. 요금제에서 사용한 총 시간과 남은 총 시간이 표시됩니다.\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "usage-code",
      "metadata": {
        "tags": [
          "id-usage"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Get usage information for the current active instance\n",
        "usage = service.usage()\n",
        "print(usage)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-metrics",
      "metadata": {},
      "source": [
        "<span id=\"view-job-metrics\" />\n",
        "\n",
        "## 채용 지표 보기\n",
        "\n",
        "배치 및 세션 워크로드 지표를 포함하여 작업 제출 현황을 한눈에 확인하세요.\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Get job metrics with Qiskit\">\n",
        "    필터를 적용하여 [`service.jobs()`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#jobs) 메서드를 사용하면 제출된 작업에 대한 정보(예: 제출된 작업 수, 상태, 생성 일시 등)를 조회할 수 있습니다. 다음 예제는 지난 7일 동안 제출된 모든 작업을 가져와 해당 작업들의 총 사용량을 계산합니다.\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-metrics\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"View job metrics on IBM Quantum Platform\">\n",
        "    [‘분석’](/analytics) 페이지로 이동하여 다음과 같은 데이터를 확인하고 다운로드할 수 있습니다\n",
        "\n",
        "    * 사용량 총계\n",
        "    * 인스턴스, 양자 컴퓨터 및 사용자별로 필터링된 사용 내역\n",
        "    * 작업, 배치 및 세션 워크로드 수 집계\n",
        "\n",
        "    **참고** : 본인이 소유하거나 관리하는 계정에 대해서만 ‘분석’ 페이지에 접근할 수 있습니다.\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "metrics-code",
      "metadata": {
        "tags": [
          "id-metrics"
        ]
      },
      "outputs": [],
      "source": [
        "from datetime import datetime, timedelta\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve all jobs in the last 7 days\n",
        "seven_days_ago = datetime.now() - timedelta(days=7)\n",
        "jobs = service.jobs(limit=None, created_after=seven_days_ago)\n",
        "\n",
        "# To retrieve all jobs in a Session or Batch, use the session_id filter\n",
        "# jobs = service.jobs(session_id=\"<session id>\")\n",
        "\n",
        "total_usage = 0\n",
        "for job in jobs:\n",
        "    total_usage += job.usage()\n",
        "\n",
        "print(f\"{len(jobs)} jobs were submitted in the last 7 days.\")\n",
        "print(f\"Total usage was {total_usage} seconds\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "retrieve-later",
      "metadata": {},
      "source": [
        "<span id=\"retrieve-job-results-at-a-later-time\" />\n",
        "\n",
        "## 나중에 작업 결과를 가져오기\n",
        "\n",
        "작업 ID를 저장해 두면, 세션을 종료한 후에도 나중에 결과를 조회할 수 있습니다.\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Retrieve results with Qiskit\">\n",
        "    작업 제출 시 작업 ID를 저장해 두었다면, 나중에 이를 조회하려면 `service.job(<job_id>)` 를 사용하십시오. 작업 ID가 없거나, 한 번에 여러 작업을 조회하려는 경우(사용이 중지된 QPU의 작업 포함), 선택적 필터를 적용하여 대신 `service.jobs()` 이 명령을 사용하십시오.\n",
        "\n",
        "    사용 가능한 필터에 대해서는 API [`QiskitRuntimeService.jobs`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#jobs) 문서를 참조하십시오.\n",
        "\n",
        "    이 예제는 특정 백엔드에서 실행된 최근 결과를 조회하는 방법을 보여줍니다.\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-retrieve\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Retrieve results on IBM Quantum Platform\">\n",
        "    1. ['워크로드' 페이지](/workloads) 로 이동하세요.\n",
        "    2. 검색 또는 필터 옵션을 사용하여 직무명, 날짜 또는 상태별로 일자리를 찾아보세요.\n",
        "    3. 작업 항목을 클릭하면 결과와 세부 정보를 확인할 수 있습니다.\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n",
        "<span id=\"retrieve-backend-properties\" />\n",
        "\n",
        "## 백엔드 속성 가져오기\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Retrieve backend properties with Qiskit\">\n",
        "    을 사용하면 작업 실행 시점의 오류율 등 백엔드 속성을 조회할 `job.properties()` 수 있습니다.\n",
        "\n",
        "    이 예제는 작업이 실행된 시점에 유효했던 백엔드 속성을 가져오는 방법을 보여줍니다. 여기에는 $T_1$ / $T_2$ 의 시간 정보와 특정 큐비트(0)에 대한 오류율이 포함됩니다.\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-backend-properties\" />\n",
        "\n",
        "    <Admonition type=\"note\" title=\"더 이상 사용되지 않는 공급자 패키지\">\n",
        "      `service.jobs()` 는 더 이상 사용되지 않는 `qiskit-ibm-provider` 패키지에서 실행되는 작업도 반환합니다. 이전(또한 더 이상 사용되지 않는) `qiskit-ibmq-provider` 패키지로 제출된 작업은 더 이상 사용할 수 없습니다.\n",
        "    </Admonition>\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Retrieve backend properties on IBM Quantum Platform\">\n",
        "    작업 생성 시뿐만 아니라 작업 실행 시에도 백엔드의 보정 데이터를 확인할 수 있습니다.\n",
        "\n",
        "    1. [‘워크로드’ 페이지](/workloads) 로 이동\n",
        "    2. 워크로드를 클릭하면 해당 워크로드의 ‘세부 정보’ 페이지가 열립니다\n",
        "    3. ‘양자 컴퓨터’ 아래에서 ‘보정 내역 보기’를 클릭하세요\n",
        "    4. 드롭다운 메뉴를 사용하여 데이터 표시 기준을 “작업 실행 시작 시”에서 “작업 생성 시”로 변경하십시오\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "retrieve-code",
      "metadata": {
        "tags": [
          "id-retrieve"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Uncomment the next line to retrieve a specific job by ID\n",
        "# job = service.job(\"<job_id>\")\n",
        "\n",
        "# Optionally retrieve multiple jobs with filters\n",
        "# Use `limit` to retrieve a specific number of jobs. The default `limit` is 10.\n",
        "my_backend = \"<your-backend>\"\n",
        "recent_jobs = service.jobs(backend_name=my_backend, limit=10)\n",
        "\n",
        "print(f\"Retrieved {len(recent_jobs)} recent jobs from {my_backend}\\n\")\n",
        "\n",
        "# Get results from all jobs\n",
        "for job in recent_jobs:\n",
        "    print(f\"Job ID: {job.job_id()}\")\n",
        "    print(f\"Status: {job.status()}\")\n",
        "\n",
        "    # Retrieve results if the job is complete\n",
        "    if str(job.status()) == \"DONE\":\n",
        "        try:\n",
        "            results = job.result()\n",
        "            print(f\"Results: {results}\")\n",
        "        except Exception as e:\n",
        "            print(f\"Error retrieving results: {e}\")\n",
        "    else:\n",
        "        print(\"Results: Not available (job still running or failed)\")\n",
        "    print()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "55afa300-0af7-4f5e-8b32-c32b6ba39621",
      "metadata": {
        "tags": [
          "id-backend-properties"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve a specific job by ID\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "print(f\"Job ID: {job.job_id()}\")\n",
        "print(f\"Backend: {job.backend}\\n\")\n",
        "\n",
        "# Fetch backend properties at the time of job execution\n",
        "properties = job.properties()\n",
        "\n",
        "if properties:\n",
        "    print(\"Backend Properties at Job Execution Time:\")\n",
        "    print(\"=\" * 60)\n",
        "\n",
        "    # Get T1 (relaxation time) for qubit 0\n",
        "    t1 = properties.t1(0)\n",
        "    print(f\"Qubit 0 T1 (relaxation time): {t1}\")\n",
        "\n",
        "    # Get T2 (dephasing time) for qubit 0\n",
        "    t2 = properties.t2(0)\n",
        "    print(f\"Qubit 0 T2 (dephasing time): {t2}\")\n",
        "\n",
        "    # Get readout error for qubit 0\n",
        "    readout_error = properties.readout_error(0)\n",
        "    print(f\"Qubit 0 readout error: {readout_error}\")\n",
        "\n",
        "    # Get all properties for a specific qubit\n",
        "    print(\"All properties for qubit 0:\")\n",
        "    qubit_props = properties.qubit_property(0)\n",
        "    for prop_name, prop_value in qubit_props.items():\n",
        "        print(f\"  {prop_name}: {prop_value}\")\n",
        "else:\n",
        "    print(\"No properties available for this job\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cancel-job",
      "metadata": {},
      "source": [
        "<span id=\"cancel-a-job\" />\n",
        "\n",
        "## 작업 취소\n",
        "\n",
        "대기 중이거나 실행 중인 작업을 취소합니다. 작업이 취소되면 다시 재개할 수 없습니다.\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Cancel with Qiskit\">\n",
        "    이 `job.cancel()` 메서드를 사용하여 프로그래밍 방식으로 작업을 취소하십시오.\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-cancel\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Cancel on IBM Quantum Platform\">\n",
        "    1. **워크로드 테이블에서** : 취소하려는 워크로드의 행 끝에 있는 오버플로 메뉴를 클릭한 다음, **‘취소’를** 선택합니다.\n",
        "    2. **작업 세부 정보 페이지에서** : 작업 부하를 클릭하여 해당 세부 정보 페이지를 연 다음, 상단의 **‘작업’** 드롭다운 메뉴를 사용하여 **‘취소’를** 선택합니다.\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "cancel-code",
      "metadata": {
        "tags": [
          "id-cancel"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve the job\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "# Cancel the job\n",
        "job.cancel()\n",
        "\n",
        "print(f\"Job {job.job_id()} has been canceled\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "next-steps",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * 추가적인 작업 관리 메서드에 대해서는 [API `QiskitRuntimeService` 참조](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service) 문서를 확인하십시오.\n",
        "  * [실행 모드를](/docs/guides/execution-modes) 살펴보고 배치 및 세션 워크로드 유형을 이해해 보세요.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "description": "How to monitor or cancel a job submitted to IBM Quantum Platform",
    "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"
    },
    "title": "Monitor or cancel a job"
  },
  "nbformat": 4,
  "nbformat_minor": 4
}