{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "6ec2a7ce-6d72-401c-aecd-59f2f519153a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"最初の Qiskit Serverless ワークロードをリモートで実行する\"\n",
        "description: \"Serverlessで利用可能なプログラムの一覧表示方法、これらのプログラムへの入力値の渡し方、リモートでの実行方法、ステータスの確認方法、結果とログの取得方法。\"\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 Serverless GitHub](https://qiskit.github.io/qiskit-serverless/index.html) ページでご覧いただけます。\n",
        "</Admonition>\n",
        "\n",
        "このセクションでは、 `qiskit-ibm-catalog` 、Qiskit Serverlessで利用可能なプログラムを一覧表示し、これらのプログラムに入力を渡し、リモートで実行し、ステータスをチェックし、結果とログを取得する方法について説明します。\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",
        "まず、入力を設定する。 あなたのプログラムには3つの入力がある： `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": [
        "次に、入力を渡し、以下のようにpythonicな方法で実行する：\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",
        "## ジョブのステータスの確認\n",
        "\n",
        "Qiskit Serverless `job_id` で、実行中のジョブのステータスを確認できます。 これには以下のステータスが含まれる：\n",
        "\n",
        "* **`QUEUED`**:リモートプログラムはQiskit Serverlessキューにある。 キューの優先順位は現在、Qiskit Serverlessの使用量に基づいています\n",
        "* **`INITIALIZING`**:リモート環境のセットアップと依存関係のインストールを含む\n",
        "* **`RUNNING`**:プログラムは実行中です。 この段階で、プログラム内に `print()` の出力がある場合は、次のようにしてログを取得できます。 `job.logs()`\n",
        "* **`DONE`**: `save_result()` 。 `job.results()`\n",
        "\n",
        "[Manage Qiskit Serverless compute and data resourcesでは](/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",
        "最初のQiskitサーバーレスプログラムの実行に成功しました！\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()` 、Qiskit Serverlessに投入されたすべてのジョブを一覧表示できる：\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
}