{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "6ec2a7ce-6d72-401c-aecd-59f2f519153a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Serverless 의 첫 번째 워크로드를 원격으로 실행하세요\"\n",
        "description: \"서버리스에서 사용 가능한 프로그램을 나열하고, 해당 프로그램에 입력을 전달하며, 원격으로 실행하고, 상태를 확인하며, 결과와 로그를 가져오는 방법.\"\n",
        "---\n",
        "\n",
        "<span id=\"run-your-first-qiskit-serverless-workload-remotely\" />\n",
        "\n",
        "# Qiskit Serverless 의 첫 번째 워크로드를 원격으로 실행하세요\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1ffb4bbc-6702-4424-bc38-226eb3194a07",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "<Accordion>\n",
        "  <AccordionItem title=\"패키지 버전\">\n",
        "    이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다.\n",
        "    다음 버전 이상을 사용하는 것이 좋습니다.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=1.4.0\n",
        "    qiskit-ibm-runtime~=0.36.1\n",
        "    qiskit-ibm-catalog~=0.4\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "33bc7389-22b7-4ddd-ae7d-1c4fd603d793",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\">\n",
        "  **Qiskit Serverless 업그레이드를 진행 중이며, 기능이 빠르게 변화하고 있습니다.** 이 개발 단계 동안, 릴리스 노트와 최신 문서는 [Qiskit ServerlessGitHub](https://qiskit.github.io/qiskit-serverless/index.html) 페이지에서 확인하실 수 있습니다.\n",
        "</Admonition>\n",
        "\n",
        "이 섹션에서는 `qiskit-ibm-catalog` 를 사용하여 키스킷 서버리스에서 사용 가능한 프로그램을 나열하고, 이러한 프로그램에 입력을 전달하고, 원격으로 실행하고, 상태를 확인하고, 결과와 로그를 검색하는 방법을 살펴본다.\n",
        "\n",
        "시작하기 전에 [‘첫 번째 Qiskit Serverless 프로그램 작성하기](/docs/guides/serverless-first-program) ’의 단계별 절차를 모두 따랐는지 확인하세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ec693d85-baaf-487e-aaff-3867512a4790",
      "metadata": {},
      "source": [
        "<span id=\"list-programs-available\" />\n",
        "\n",
        "## 사용 가능한 프로그램 목록\n",
        "\n",
        "Qiskit Serverless 에서 실행 가능한 프로그램 목록을 확인하려면 `QiskitServerless.list()` 를 사용할 수 있습니다. 여기에는 이전에 업로드된 파일도 [`transpile_remote_serverless`](/docs/guides/serverless-first-program)포함됩니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "4eaad0dc-9b42-48fa-ad08-4e0f9c4d90bc",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "QiskitFunction(transpile_remote_serverless)"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitServerless\n",
        "\n",
        "serverless = QiskitServerless()\n",
        "next(\n",
        "    program\n",
        "    for program in serverless.list()\n",
        "    if program.title == \"transpile_remote_serverless\"\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e1a5d0f7-e4d9-4289-ac87-ca25e76f968d",
      "metadata": {},
      "source": [
        "<span id=\"run-an-uploaded-program-and-pass-inputs\" />\n",
        "\n",
        "## 업로드된 프로그램을 실행하고 입력을 전달합니다\n",
        "\n",
        "먼저 입력을 설정합니다. 프로그램에는 세 가지 입력이 있습니다: `circuits`, `backend`, `optimization_level` 입니다. `random_circuit` 을 사용하여 30개의 무작위 회로를 만들 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "46108a95-11f8-4ecf-83bb-131c3e7ea4c2",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/serverless-run-first-workload/extracted-outputs/46108a95-11f8-4ecf-83bb-131c3e7ea4c2-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.random import random_circuit\n",
        "\n",
        "qc_random = [(random_circuit(4, 4, measure=True, seed=i)) for i in range(10)]\n",
        "qc_random[0].draw(output=\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "61c17ded-b832-4db1-ba9a-60772362daea",
      "metadata": {},
      "source": [
        "그런 다음 `QiskitRuntimeService` 및 `least_busy` 을 사용하여 `backend`:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ebefb5ac-c8a8-4350-b16f-0677f0e412e5",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a6ba35b-b98b-41b1-8dd4-c7cf2fc8b637",
      "metadata": {},
      "source": [
        "최적화 수준을 설정합니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "cab2773b-f72a-49fe-a274-169a10e89c5e",
      "metadata": {},
      "outputs": [],
      "source": [
        "optimization_level = 3"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f522b54f-93e5-45e9-9dc7-a2287eb4c707",
      "metadata": {},
      "source": [
        "`serverless.load('PROGRAM_NAME')` 으로 프로그램을 선택하세요:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "e9b7e7c1-07b1-4777-bb08-1522433901c6",
      "metadata": {},
      "outputs": [],
      "source": [
        "transpile_remote_serverless = serverless.load(\"transpile_remote_serverless\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8e256a2a-6b14-4194-8fee-df986c7ebc6c",
      "metadata": {},
      "source": [
        "그런 다음 입력을 전달하고 다음과 같이 피토닉 방식으로 실행합니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "85b1aace-e7d7-4e2e-bb77-44fb514d0236",
      "metadata": {},
      "outputs": [],
      "source": [
        "job = transpile_remote_serverless.run(\n",
        "    circuits=qc_random,\n",
        "    backend=backend.name,\n",
        "    optimization_level=optimization_level,\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "2e8b4ec2-b7e3-4218-8742-b67f2a1d82e0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'118256c5-bbb0-4ea8-9e9f-51aac2220aef'"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.job_id"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "87dbb375-cd24-4d0f-a2fc-c653db8345e3",
      "metadata": {},
      "source": [
        "<span id=\"serverless-job-status\" />\n",
        "\n",
        "<span id=\"check-job-status\" />\n",
        "\n",
        "## 작업 상태 점검(O)\n",
        "\n",
        "키스킷 서버리스 `job_id` 를 통해 실행 중인 작업의 상태를 확인할 수 있습니다. 여기에는 다음과 같은 상태가 포함됩니다:\n",
        "\n",
        "* **`QUEUED`**: 원격 프로그램이 키스킷 서버리스 대기열에 있습니다. 대기열 우선 순위는 현재 키스킷 서버리스를 얼마나 많이 사용했는지에 따라 결정됩니다\n",
        "* **`INITIALIZING`**: 원격 프로그램이 시작 중이며, 여기에는 원격 환경 설정 및 종속성 설치가 포함됩니다\n",
        "* **`RUNNING`**: 프로그램이 실행 중입니다. 이 단계에서 프로그램에 `print()` 출력이 있는 경우 다음을 사용하여 로그를 검색할 수 있습니다 `job.logs()`\n",
        "* **`DONE`**: 프로그램이 완료되었으며 `save_result()` 에 저장된 데이터를 검색할 수 있습니다 `job.results()`\n",
        "\n",
        "또한, [키스킷 서버리스 컴퓨팅 및 데이터 리소스 관리에서](/docs/guides/serverless-manage-resources) 더 자세한 작업 상태를 설정할 수도 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "f4877d45-c350-4855-b1ca-868a6ad8cfa4",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'QUEUED'"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.status()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3fa9c01e-18a4-482c-bad6-69dee5acece4",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\">\n",
        "  현재 ‘ IBM Quantum ’ 워크로드 표에는 ‘ IBM Quantum Compute Service’ 워크로드만 반영되어 있습니다. Qiskit Serverless 워크로드의 현재 상태를 확인하려면 `job.status()` 를 사용하세요.\n",
        "</Admonition>\n",
        "\n",
        "첫 번째 키스킷 서버리스 프로그램을 성공적으로 실행했습니다!\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "65566f2c-8d5b-4493-819b-4389155c3d69",
      "metadata": {},
      "source": [
        "<span id=\"retrieve-logs-and-results\" />\n",
        "\n",
        "## 로그 및 결과 가져오기\n",
        "\n",
        "앞서 언급했듯이 프로그램이 `RUNNING` 이면 `job.logs()` 을 사용하여 `print()` 출력에서 생성된 로그를 가져올 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "cbf12a1b-bfff-4eb2-82f1-298de1e9c114",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "No logs yet.\n"
          ]
        }
      ],
      "source": [
        "logs = job.logs()\n",
        "print(logs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bff87452-bf98-4c7a-85c8-d280d89a7970",
      "metadata": {},
      "source": [
        "언제든지 작업을 취소할 수도 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "bc4fbe20-456c-4ce4-bf26-dfdb8b68e89f",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'Job has been stopped.'"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "job.stop()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "925a8d81-e85b-4e26-a9e1-3a01e8e0785b",
      "metadata": {},
      "source": [
        "프로그램이 `DONE` 이면 `job.results()` 을 사용하여 `save_result()` 에 저장된 결과를 가져올 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "c0d999d9-af9e-4312-b5bb-f60f714257ba",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'transpiled_circuits': [<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93eca64810>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5e5310>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5d5310>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec58b490>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec57d310>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec535950>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec523c90>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec60a990>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5527d0>,\n",
              "  <qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec4152d0>]}"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# We can't get results from a cancelled job, so we'll fetch a completed one instead\n",
        "completed_job = next(\n",
        "    job for job in serverless.jobs() if job.status() == \"DONE\"\n",
        ")\n",
        "completed_job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ca9791df-60c2-49d8-8541-741078ea63c6",
      "metadata": {},
      "source": [
        "<span id=\"list-jobs-previously-run-with-qiskit-serverless\" />\n",
        "\n",
        "## Qiskit Serverless 로 이전에 실행된 작업 목록\n",
        "\n",
        "`jobs()` 을 사용하여 키스킷 서버리스에 제출된 모든 작업을 나열할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "ba9365c4-b07d-4dc6-9594-edc07c44bc63",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<Job | 118256c5-bbb0-4ea8-9e9f-51aac2220aef>,\n",
              " <Job | e9a36469-7d6b-4f00-bf91-78709ebdbbff>,\n",
              " <Job | 4efd601b-8f61-4c8e-b14a-0b8a9c649dc0>,\n",
              " <Job | 87cd22c7-8eb9-4606-bdb4-befe946e9e9b>,\n",
              " <Job | be9a6dfd-0830-4250-aa60-acdd05bb8818>,\n",
              " <Job | 479513dd-6a76-4c3e-ba49-bb21351b9a05>,\n",
              " <Job | f9c20c31-be46-41b3-97ac-99f7be61f89e>,\n",
              " <Job | 37fa2489-4449-4bfb-974e-9d9a9ec3cc21>,\n",
              " <Job | b754c4e8-6817-48db-9bb9-74c151d6349a>,\n",
              " <Job | 78bc6744-b417-48cb-8e01-59bb63bcc2be>]"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "old_jobs = serverless.jobs()\n",
        "old_jobs"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fd3415a0-0e55-4991-8764-c9fe66eb2664",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"info\" title=\"권장사항\">\n",
        "  * 병렬 처리를 포함하여 해당 프로그램에서 사용할 수 있는 [컴퓨팅 및 데이터 관리 도구를](/docs/guides/serverless-manage-resources) 살펴보세요.\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": 2
}