{ "cells": [ { "cell_type": "markdown", "id": "f45c6ac2", "metadata": { "editable": true, "slideshow": { "slide_type": "" } }, "source": [ "# 実習の準備\n", "\n", "```{contents} 目次\n", "---\n", "local: true\n", "---\n", "```" ] }, { "cell_type": "markdown", "id": "13333bb0", "metadata": { "editable": true, "slideshow": { "slide_type": "" } }, "source": [ "## IBM Quantum\n", "\n", "### IBMidを取得し、IBM Quantumにログインする\n", "\n", "IBM Quantumを利用するには、IBMidというアカウントを作り、サービストークンを取得する必要があります。IBM QuantumウェブサイトからIDを取得し、サービスにログインしてください。\n", "\n", "(install_token)=\n", "### (ローカル環境)IBM Quantum APIトークンを取得し、Qiskit設定に保存する\n", "\n", "IBM Quantum Lab(IBM Quantumウェブサイト上のJupyter Lab)でプログラムを実行する場合、以下の手続きは不要です。\n", "\n", "ログインしたらホーム画面のYour API tokenという欄からトークンをコピーできます。\n", "```{image} figs/ibmq_home.png\n", ":height: 400px\n", ":name: My Account\n", "```\n", "\n", "アカウントごとに発行されるサービストークンは、ユーザー名+パスワードの代わりとしてPythonプログラム中でIBMQに接続するために使用されます。ローカルディスクに書き込める環境にある場合は、一度トークンを設定ファイルに保存することで、以降の認証を自動化できます。下のコードセルの`__paste_your_token_here__`のところにIBM Quantumからコピーしたトークンを貼り付け、実行してください。" ] }, { "cell_type": "code", "execution_count": 1, "id": "73a7a26c", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "raises-exception", "remove-output" ] }, "outputs": [ { "ename": "InvalidAccountError", "evalue": "\"Invalid `instance` value. Expected a non-empty string, got 'None'.\"", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mInvalidAccountError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mqiskit_ibm_runtime\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m QiskitRuntimeService\n\u001b[0;32m----> 3\u001b[0m \u001b[43mQiskitRuntimeService\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_account\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m__paste_your_token_here__\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/qiskit_runtime_service.py:713\u001b[0m, in \u001b[0;36mQiskitRuntimeService.save_account\u001b[0;34m(token, url, instance, channel, filename, name, proxies, verify, overwrite, channel_strategy, set_as_default)\u001b[0m\n\u001b[1;32m 676\u001b[0m \u001b[38;5;129m@staticmethod\u001b[39m\n\u001b[1;32m 677\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_account\u001b[39m(\n\u001b[1;32m 678\u001b[0m token: Optional[\u001b[38;5;28mstr\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 688\u001b[0m set_as_default: Optional[\u001b[38;5;28mbool\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 689\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 690\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Save the account to disk for future use.\u001b[39;00m\n\u001b[1;32m 691\u001b[0m \n\u001b[1;32m 692\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 710\u001b[0m \u001b[38;5;124;03m as the default account.\u001b[39;00m\n\u001b[1;32m 711\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 713\u001b[0m \u001b[43mAccountManager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 714\u001b[0m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 715\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 716\u001b[0m \u001b[43m \u001b[49m\u001b[43minstance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minstance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 717\u001b[0m \u001b[43m \u001b[49m\u001b[43mchannel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchannel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 718\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 719\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 720\u001b[0m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mProxyConfiguration\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mproxies\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 721\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 722\u001b[0m \u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moverwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 723\u001b[0m \u001b[43m \u001b[49m\u001b[43mchannel_strategy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchannel_strategy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 724\u001b[0m \u001b[43m \u001b[49m\u001b[43mset_as_default\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mset_as_default\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 725\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/management.py:71\u001b[0m, in \u001b[0;36mAccountManager.save\u001b[0;34m(cls, token, url, instance, channel, filename, name, proxies, verify, overwrite, channel_strategy, set_as_default)\u001b[0m\n\u001b[1;32m 55\u001b[0m filename \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mexpanduser(filename)\n\u001b[1;32m 56\u001b[0m config \u001b[38;5;241m=\u001b[39m Account\u001b[38;5;241m.\u001b[39mcreate_account(\n\u001b[1;32m 57\u001b[0m channel\u001b[38;5;241m=\u001b[39mchannel,\n\u001b[1;32m 58\u001b[0m token\u001b[38;5;241m=\u001b[39mtoken,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 63\u001b[0m channel_strategy\u001b[38;5;241m=\u001b[39mchannel_strategy,\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m save_config(\n\u001b[1;32m 66\u001b[0m filename\u001b[38;5;241m=\u001b[39mfilename,\n\u001b[1;32m 67\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 68\u001b[0m overwrite\u001b[38;5;241m=\u001b[39moverwrite,\n\u001b[1;32m 69\u001b[0m config\u001b[38;5;241m=\u001b[39m\u001b[43mconfig\u001b[49m\n\u001b[1;32m 70\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# avoid storing invalid accounts\u001b[39;49;00m\n\u001b[0;32m---> 71\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mto_saved_format(),\n\u001b[1;32m 72\u001b[0m set_as_default\u001b[38;5;241m=\u001b[39mset_as_default,\n\u001b[1;32m 73\u001b[0m )\n", "File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/account.py:163\u001b[0m, in \u001b[0;36mAccount.validate\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_token(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken)\n\u001b[1;32m 162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_url(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39murl)\n\u001b[0;32m--> 163\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_assert_valid_instance\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minstance\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_proxies(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproxies)\n\u001b[1;32m 165\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assert_valid_channel_strategy(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mchannel_strategy)\n", "File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/qiskit_ibm_runtime/accounts/account.py:326\u001b[0m, in \u001b[0;36mCloudAccount._assert_valid_instance\u001b[0;34m(instance)\u001b[0m\n\u001b[1;32m 324\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Assert that the instance name is valid for the given account type.\"\"\"\u001b[39;00m\n\u001b[1;32m 325\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28misinstance\u001b[39m(instance, \u001b[38;5;28mstr\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(instance) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m):\n\u001b[0;32m--> 326\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidAccountError(\n\u001b[1;32m 327\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid `instance` value. Expected a non-empty string, got \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00minstance\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 328\u001b[0m )\n", "\u001b[0;31mInvalidAccountError\u001b[0m: \"Invalid `instance` value. Expected a non-empty string, got 'None'.\"" ] } ], "source": [ "from qiskit_ibm_runtime import QiskitRuntimeService\n", "\n", "QiskitRuntimeService.save_account('__paste_your_token_here__')" ] }, { "cell_type": "markdown", "id": "3cd0b3e3", "metadata": { "editable": true, "slideshow": { "slide_type": "" } }, "source": [ "トークンを保存することで、プログラム中でのIBM Quantumへの認証(QiskitRuntimeServiceの取得)は\n", "\n", "```{code-block} python\n", "from qiskit_ibm_runtime import QiskitRuntimeService\n", "\n", "service = QiskitRuntimeService(channel='ibm_quantum')\n", "```\n", "\n", "のようになります。ちなみにIBM Quantum Labでは最初からトークンが保存されている状態なので、このコードで認証が行なえます。\n", "\n", "ローカルディスクに書き込める環境でない場合(このワークブックをインタラクティブに使っている場合など)は、Pythonプログラムを実行するたびに(Jupyterのカーネルを再起動するたびに)手動で認証を行う必要があります。\n", "\n", "```{code-block} python\n", "from qiskit_ibm_runtime import QiskitRuntimeService\n", "\n", "service = QiskitRuntimeService(channel='ibm_quantum', token='__paste_your_token_here__')\n", "```\n", "\n", "## ワークブックの使い方\n", "\n", "### インタラクティブHTML\n", "\n", "このワークブックの各ページにあるプログラムの書かれたセルは、そのままJupyter Notebookのようにブラウザ上で実行することができます。ページの右上のにカーソルを乗せ、現れるメニューから Live Codeをクリックしてください。ページのタイトルの下にステータス表示が現れるので、readyと表示されるまで待ちます。\n", "\n", "```{image} figs/toggle_interactive.jpg\n", ":height: 400px\n", ":name: Turn interactive contents on\n", "```\n", "\n", "ページがインタラクティブになると、コード・セルにrunおよびrestartというボタンが現れ、直下にセルの出力が表示されるようになります。\n", "\n", "```{image} figs/interactive_cell.jpg\n", ":height: 200px\n", ":name: Interactive code cell\n", "```\n", "\n", "この状態になったら、入力セルの内容を自由に書き換えて、runボタンをクリックして(もしくはShift + Enterで)Pythonコードを実行することができます。このときいくつか注意すべき点があります。\n", "\n", "- restartを押すまでページ全体が一つのプログラムになっているので、定義された変数などはセルをまたいで利用される。\n", "- しばらく何もしないでページを放置していると、実行サーバーとの接続が切れてしまう。その場合ページを再度読み込んで、改めてインタラクティブコンテンツを起動する必要がある。\n", "- コードはmybinder.orgという外部サービス上で実行されるので、個人情報等センシティブな内容の送信は極力避ける。
\n", " (通信は暗号化されていて、mybinder.org中ではそれぞれのユーザーのプログラムは独立のコンテナ中で動くので、情報が外に筒抜けということではないはずですが、念の為。)
\n", " ただし上で出てきたように、IBM Quantumのサービストークンだけはどうしても送信する必要があります。\n", "\n", "### Jupyter Notebook\n", "\n", "インタラクティブHTMLのセキュリティの問題が気になったり、編集したコードを保存したいと考えたりする場合は、ページの元になったノートブックファイルをダウンロードし、自分のローカルの環境で実行することもできます。右上ののメニューの.ipynbをクリックするか、もしくはのメニューのrepositoryからリンクされているgithubレポジトリをクローンしてください。\n", "\n", "ノートブックをローカルに実行するためには、Pythonバージョン3.10以上が必要です。また、`pip`を使って以下のパッケージをインストールする必要があります。\n", "\n", "```{code-block}\n", "pip install qiskit qiskit-aer qiskit-ibm-runtime qiskit-experiments qiskit-machine-learning qiskit-optimization matplotlib pylatexenc pandas tabulate\n", "```" ] } ], "metadata": { "jupytext": { "notebook_metadata_filter": "all", "text_representation": { "extension": ".md", "format_name": "myst", "format_version": 0.13, "jupytext_version": "1.16.1" } }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.12" }, "source_map": [ 25, 35, 56, 68 ] }, "nbformat": 4, "nbformat_minor": 5 }