{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "b24594e7-0ace-4b54-979a-e4c77dd17507",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"포트 코드를 Qiskit Serverless 로 변경하십시오\"\n",
        "description: \"Qiskit Serverless 활용을 위한 기존 코드 이식 방법\"\n",
        "---\n",
        "\n",
        "<span id=\"port-code-to-qiskit-serverless\" />\n",
        "\n",
        "# 포트 코드를 Qiskit Serverless 로 변경하십시오\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e20e8e81-c439-4f17-a843-a633259e5268",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cb8926d5-a417-478e-9ae1-ec78c64aa86a",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\">\n",
        "  **Qiskit Serverless 업그레이드를 진행 중이며, 기능이 빠르게 변화하고 있습니다.** 이 개발 단계 동안, 릴리스 노트와 최신 문서는 [Qiskit ServerlessGitHub](https://qiskit.github.io/qiskit-serverless/index.html) 페이지에서 확인하실 수 있습니다.\n",
        "</Admonition>\n",
        "\n",
        "다음 예시는 키스킷 서버리스를 활용하기 위해 기존 코드를 포팅하는 방법을 보여줍니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  다음 코드는 자격 증명을 저장했다고 가정합니다. 아직 인증하지 않았다면 [IBM Cloud 계정 설정의](/docs/guides/cloud-setup-untrusted) 안내에 따라 API 키로 인증하세요.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"update-the-experiment\" />\n",
        "\n",
        "## 실험을 업데이트하십시오\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  서버리스 버전에서는 (에서 `qiskit_serverless`) `get_runtime_service()` 를 사용하여 런타임 서비스를 생성해야 하며 `QiskitRuntimeService()`, (를 사용하는 대신) 이렇게 하면 IBM Quantum® Compute Service가 시작하는 작업과 세션이 상위 Qiskit Serverless 작업에 대해 추적됩니다. 자세한 내용은 [‘첫 번째 Qiskit Serverless 프로그램 작성하기](/docs/guides/serverless-first-program) ’를 참조하십시오.\n",
        "</Admonition>\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"LocalExperiment\" label=\"Local Experiment\">\n",
        "    ```python\n",
        "    from qiskit.transpiler import generate_preset_pass_manager\n",
        "    from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "    from qiskit.circuit.random import random_circuit\n",
        "\n",
        "    qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]\n",
        "    optimization_level = 3\n",
        "\n",
        "    service = QiskitRuntimeService(channel=\"ibm_quantum_platform\")\n",
        "    backend = service.get_backend(backend_name)\n",
        "\n",
        "    pass_manager = generate_preset_pass_manager(\n",
        "        optimization_level=optimization_level, backend=backend\n",
        "    )\n",
        "\n",
        "    # @distribute_task(target={\"cpu\": 1})\n",
        "    def transpile_parallel(circuit, pass_manager):\n",
        "        \"\"\"Distributed transpilation for an abstract circuit into an ISA circuit for a given backend.\"\"\"\n",
        "\n",
        "        isa_circuit = pass_manager.run(circuit)\n",
        "\n",
        "        return isa_circuit\n",
        "\n",
        "    transpiled_circuits = [\n",
        "        transpile_parallel(circuit, pass_manager)\n",
        "        for circuit in circuits\n",
        "    ]\n",
        "\n",
        "    print(transpiled_circuits)\n",
        "    ```\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"Serverless\" label=\"Serverless\">\n",
        "    ```python\n",
        "    # transpile_remote.py\n",
        "\n",
        "    from qiskit.transpiler import generate_preset_pass_manager\n",
        "    from qiskit_serverless import get_arguments, save_result, distribute_task, get, get_runtime_service\n",
        "\n",
        "    # Get program arguments\n",
        "    arguments = get_arguments()\n",
        "    circuits = arguments.get(\"circuits\")\n",
        "    backend_name = arguments.get(\"backend_name\")\n",
        "    optimization_level = arguments.get(\"optimization_level\")\n",
        "    pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=optimization_level, backend=backend_name\n",
        "    )\n",
        "\n",
        "    # Distribute task across workers\n",
        "    @distribute_task(target={\"cpu\": 1})\n",
        "    def transpile_parallel(circuit, pass_manager):\n",
        "    \"\"\"Distributed transpilation for an abstract circuit into an ISA circuit for a given backend.\"\"\"\n",
        "\n",
        "    isa_circuit = pass_manager.run(circuit)\n",
        "\n",
        "    return isa_circuit\n",
        "\n",
        "    try:\n",
        "    # Get backend\n",
        "    service = get_runtime_service()\n",
        "    backend = service.get_backend(backend_name)\n",
        "\n",
        "    # run distributed tasks as async function\n",
        "    # we get task references as a return type\n",
        "    sample_task_references = [\n",
        "        transpile_parallel(circuit, pass_manager)\n",
        "        for circuit in circuits\n",
        "    ]\n",
        "\n",
        "    # now we need to collect results from task references\n",
        "    results = get(sample_task_references)\n",
        "\n",
        "    # Return results\n",
        "    save_result({\n",
        "        \"transpiled_circuits\": results\n",
        "    })\n",
        "\n",
        "    except Exception as e:\n",
        "    # Exception handling\n",
        "    import traceback\n",
        "    print(traceback.format_exc())\n",
        "    ```\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n",
        "<span id=\"upload-to-qiskit-serverless\" />\n",
        "\n",
        "## Qiskit Serverless 에 업로드\n",
        "\n",
        "[키스킷 함수 소개](/docs/guides/functions) 페이지의 안내에 따라 API 키로 인증하세요.\n",
        "\n",
        "```python\n",
        "from qiskit_ibm_catalog import QiskitServerless, QiskitFunction\n",
        "\n",
        "# Authenticate to the remote cluster and submit the pattern for remote execution.\n",
        "serverless = QiskitServerless()\n",
        "\n",
        "transpile_remote_demo = QiskitFunction(\n",
        "    title=\"transpile_remote_serverless\",\n",
        "    entrypoint=\"transpile_remote.py\",\n",
        "    working_dir=\"./source_files/\",\n",
        ")\n",
        "\n",
        "serverless.upload(transpile_remote_demo)\n",
        "```\n",
        "\n",
        "출력\n",
        "\n",
        "```text\n",
        "'transpile_remote_serverless'\n",
        "```\n",
        "\n",
        "<span id=\"remotely-run-in-qiskit-serverless\" />\n",
        "\n",
        "## Qiskit Serverless 에서 원격으로 실행\n",
        "\n",
        "```python\n",
        "from qiskit.circuit.random import random_circuit\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "# Setup inputs\n",
        "qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]\n",
        "backend = \"ibm_brisbane\"\n",
        "optimization_level = 3\n",
        "\n",
        "# Running program\n",
        "transpile_remote_serverless = serverless.load('transpile_remote_serverless')\n",
        "job = transpile_remote_serverless.run(\n",
        "    circuits=qc_random,\n",
        "    backend=backend,\n",
        "    optimization_level=optimization_level\n",
        ")\n",
        "\n",
        "job.job_id\n",
        "```\n",
        "\n",
        "출력\n",
        "\n",
        "```text\n",
        "'727e921d-512d-4b7d-af97-fe29e93ce7ea'\n",
        "```\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"info\" title=\"권장사항\">\n",
        "  * 연구자들이 [양자 화학을 탐구하기](https://arxiv.org/abs/2405.05068v1) 위해 키스킷 서버리스 및 양자 중심 슈퍼컴퓨팅을 사용한 논문을 읽어보세요.\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
}