Visual Studio Code (VS Code) を使用して、Q# プログラムを作成し、実際の量子ハードウェアに送信する方法について説明します。 量子コンピューティング ジョブをスタンドアロン Azure Quantum プログラムとしてQ#に送信し、Q#をPython プロジェクトのQ#と組み合わせて、Jupyter Notebookを実行できます。
Q#ジョブをAzure Quantumに送信する
VS Codeを使用してQ#プログラムを実行し、デバッグし、Azure Quantumに送信する方法について説明します。
前提条件
インストールの詳細については、「QDK拡張機能のセットアップ」を参照してください。
- Azure Quantum サブスクリプション内のAzure ワークスペース。 ワークスペースを作成するには、「Azure Quantum ワークスペースを作成する」を参照してください。
- 最新バージョンのVisual Studio Codeまたは web 上のVS Codeを開きます。
- Azure Quantum Development Kit拡張機能の最新バージョン。
Q# サンプル プログラムを読み込む
VS Codeで、[ファイル] > [新しいテキスト ファイル] を選択し、RandomNum.qs としてファイルを保存します。
RandomNum.qs を開き、「Random Bit sample」と入力
sampleし、オプションの一覧から [Random Bit sample] を選択してファイルを保存します。
注
独自の Q# ファイルを開くこともできます。 古い Q# プログラムを実行してエラーが発生した場合は、「 テストとデバッグ」を参照してください。
Q# プログラムを実行する
組み込みのシミュレーターでプログラムをローカルで実行するには、エントリ ポイント操作の横にあるコマンドの一覧から [実行 ] をクリックするか、 Ctrl キーを押しながら F5 キーを押します。 出力がデバッグ コンソールに表示されます。
Azure Quantumに送信する前にプログラムをデバッグするには、エントリ ポイント操作の横にあるコマンドの一覧から [デバッグ] をクリックするか、F5 キーを押します。 上部にあるデバッグ コントロールを使用して、コードのステップ オーバー、ステップ イン、ステップ アウトを行います。 Q#プログラムのデバッグの詳細については、「テストとデバッグ」を参照してください。
頻度ヒストグラムを視覚化する
頻度ヒストグラムは、量子プログラムを複数回実行して得られた結果の分布("ショット") を表します。 ヒストグラムの各バーは、考えられる結果に対応し、その高さは結果が観察される回数を表します。 頻度ヒストグラムは、これらの結果の確率分布を視覚化するのに役立ちます。
[View -> Command Palette]\(コマンド パレットの表示\) を選択し、「ヒストグラム」と入力します。これにより、QDK:ファイルの実行とヒストグラムの表示コマンドが表示されます。 エントリ ポイント操作の前にあるコマンドの一覧から ヒストグラム を選択することもできます。 ヒストグラム ウィンドウを開くには、このオプションを Q# 選択します。
プログラムを実行するショットの数 (100 ショットなど) を入力し、Enter キーを押します。 ヒストグラムがヒストグラム ウィンドウに Q# 表示されます。
左上 の設定アイコン をクリックすると、オプションが表示されます。
バーをクリックすると、その結果の 割合 が表示されます。 この場合、0 と 1 の 2 つの結果が考えられます。各結果の割合は 50% に近い値です。
ヒント
マウス スクロール ホイールまたはトラックパッド ジェスチャを使用して、ヒストグラムをズームできます。 拡大すると、スクロール中に 'Alt' キーを押してグラフをパンできます。
量子回路を視覚化する
量子回路図は、量子演算を視覚的に表現したものです。 量子プログラムを通る量子ビットの流れを示します。これには、ゲートとそれらに適用される測定値が含まれます。 詳細については、Visual Studio Codeの量子回路図を参照してください。
[
View - \<コマンド パレットの表示\> を選択して「Command Palette] 回路 を表示」コマンドを 使用します。 エントリ ポイント操作の横にあるコマンド リストから 回路 を選択することもできます。
回路ウィンドウに回路が Q# 表示されます。 この回路図は、|0⟩ 状態に初期化された 1 つの量子ビット レジスタを示しています。 次に、ハダマールゲート Hが量子ビットに適用され、続いて 測定演算が行われ、これがメーターシンボルで表されます。 詳細については、「量子回路の規則」を参照してください。
Azure Quantumに接続してジョブを送信する
VS Codeからジョブを直接接続して送信できます。 この例では、Rigetti シミュレーターにジョブを送信します。
[ 表示> コマンドパレット ] を選択し、「 QDK: Azure Quantum ワークスペースに接続する」と入力します。 Enter キーを押します。
Azureアカウントを選択し、プロンプトに従って、優先するディレクトリ、サブスクリプション、ワークスペースに接続します。
注
接続文字列がある場合は、[ 接続文字列 ] を選択し、 Azure Quantum ワークスペースに対応する接続文字列を貼り付けることができます。 詳細については、「接続文字列を使用して Quantum ワークスペースに接続する」を参照してください。
接続したら、[エクスプローラー] ウィンドウで [Quantum ワークスペース] を展開します。
ワークスペースを展開し、Rigetti プロバイダーを展開します。
注
Azure Quantumへの接続に問題がある場合は、ワークスペース名の横に警告アイコンが表示されます。 ワークスペース名にカーソルを合わせると、エラー情報が表示されます。
rigetti.sim.qvm を選択しますtarget。
target名の右側にある再生アイコンを選択して、現在のQ# プログラムの送信を開始します。
ジョブを識別する名前を追加します。
ショットの数、またはプログラムが実行される回数を追加します。
Enter キーを押してジョブを送信します。 ジョブの状態が画面の下部に表示されます。
[ジョブ] を展開し、ジョブの上にカーソルを合わせると、ジョブの時刻と状態が表示されます。
結果を表示するには、ジョブ名の横にあるクラウド アイコンを選択してワークスペース ストレージから結果をダウンロードし、 VS Codeに表示します。
Jupyter NotebookからAzure Quantumにジョブを送信する
VS Codeを使用して、Q#にJupyter NotebookAzure Quantumを実行、デバッグ、送信する方法について説明します。
前提条件
インストールの詳細については、「QDK拡張機能のセットアップ」を参照してください。
Azure Quantum サブスクリプション内のAzure ワークスペース。 ワークスペースを作成するには、「Azure Quantum ワークスペースを作成する」を参照してください。
Python がインストールされた Python 環境。
VS Code Azure Quantum Development Kit、Python、およびJupyterの拡張機能がインストールされている場合は、VS Code。
Azure Quantum
qdk[jupyter]およびazure-quantumパッケージ、およびipykernelパッケージ。python -m pip install --upgrade qdk[jupyter] azure-quantum ipykernel
ローカル シミュレーターでプログラムを実行してテストする
VS Codeで、[コマンド パレット>表示] を選択し、[作成: 新しいJupyter Notebook] を選択します。
右上の VS Code は、 Python のバージョンと、ノートブック用に選択された仮想 Python 環境を検出して表示します。 複数の Python 環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要があります。 環境が検出されなかった場合は、セットアップ情報については、Jupyter NotebookのVS Codeを参照してください。
ノートブックの最初のセルで、次の Python コードを実行して、必要なモジュールをインポートします。
from qdk import qsharp, azure import azure.quantum-
qsharpパッケージにより、%%qsharpマジック コマンドがアクティブになり、Q#コードをセルに直接入力できます。 -
azureパッケージは、Azure Quantum ワークスペースへの接続を提供します。
注
Jupyter Pythonカーネル
ipykernelが検出されない場合、VS Codeはインストールするように求められます。-
別のセルを追加し、ユーザー指定のランダム ビット数を返す次の Q# コードを入力します。
注
マジック コマンド
%%qsharpを入力するとすぐに、ノートブック のセルの種類が Python から Q# に変わります。%%qsharp operation Random() : Result { use q = Qubit(); H(q); let result = M(q); Reset(q); return result } operation RandomNBits(N: Int): Result[] { mutable results = []; for i in 0 .. N - 1 { let r = Random(); results += [r]; } return results }操作をテストするには、
evalメソッドを使用できます。このメソッドは、ノートブックで以前に定義した任意の Q# 操作を呼び出すことができます。qsharp.eval("RandomNBits(4)")[Zero, One, One, Zero]ローカル シミュレーターに対してプログラムを実行するには、メソッドを使用します
run。shotsを指定するか、プログラムを実行する回数を指定すると、シミュレーターは結果をPythonリストとして返します。qsharp.run("RandomNBits(4)", shots=10)[[One, One, One, One], [Zero, Zero, One, Zero], [One, Zero, Zero, One], [Zero, One, Zero, Zero], [One, Zero, One, One], [One, Zero, One, Zero], [One, One, One, Zero], [One, One, One, One], [Zero, Zero, Zero, One], [One, Zero, Zero, One]]
量子回路を視覚化する
パッケージを使用して qdk.widgets 量子回路を視覚化できます。 このパッケージは、SVG 画像として量子回路図をレンダリングするウィジェットを提供します。 詳細については、「Jupyter Notebookを使用した量子回路図」を参照してください。
次のコードを新しいセルに追加して、回線を視覚化します。
from qdk.qsharp import circuit
from qdk.widgets import Circuit
Circuit(circuit("RandomNBits(4)"))
詳細については、「量子回路の規則」を参照してください。
基本プロファイルを使用してジョブをコンパイルする
ローカル量子シミュレーターでプログラムを実行する場合は、任意の種類の Q# プログラムを送信できます。 ただし、ハードウェア Azure Quantumtargetsは、すべてのQ# プログラムを実行するために必要な完全な機能をまだサポートしていません。 Q# プログラムをコンパイルしてAzure Quantumに送信するには、target ハードウェアでサポートされている機能をQ#に伝えるために、target プロファイルを設定する必要があります。 現時点では、基本プロファイルです。 詳細については、「Azure Quantumのプロファイルの種類」を参照してください。
Q# インタープリターを再初期化し、基本プロファイルを使用してプログラムをコンパイルするには:
プロファイルを
init設定するには、次のメソッドを使用します。from qdk import init, TargetProfile init(target_profile=TargetProfile.Base)インタープリターを再初期化したので、新しいプロファイルでコードをもう一度実行する必要があります。
%%qsharp operation Random() : Result { use q = Qubit(); H(q); let result = M(q); Reset(q); return result } operation RandomNBits(N: Int): Result[] { mutable results = []; for i in 0 .. N - 1 { let r = Random(); results += [r]; } return results }次に、メソッドを
compile使用して、プログラムへのエントリ ポイントである操作または関数を指定します。 これにより、コードが QIR 形式にコンパイルされ、任意の量子ハードウェアに送信できます。from qdk.qsharp import compile MyProgram = compile("RandomNBits(4)")
Azure Quantumに接続してジョブを送信する
プログラムを正しい形式にコンパイルしたら、azure.quantum.Workspaceに接続するAzure Quantum オブジェクトを作成します。 接続するには、 Azure Quantum ワークスペースのリソース ID を使用します。 リソース ID と場所は、 Azure ポータルのワークスペースの概要ページからコピーできます。
新しいセルで、 Azure Quantum ワークスペースのリソース ID と場所を入力します。
from qdk.azure import Workspace MyWorkspace = Workspace( resource_id = "MyResourceID", location = "MyLocation" )ワークスペースで
get_targets使用可能なハードウェア targets を確認するには、次のメソッドを使用します。MyTargets = MyWorkspace.get_targets() print("This workspace's targets:") MyTargets以下を選択します。
rigetti.sim.qvmtargetMyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")最後に、メソッドを
submit使用して、そのパラメーターを使用してプログラムを送信し、結果を表示します。job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100) job.get_results(){'[0, 1, 1, 1]': 0.08, '[1, 1, 0, 0]': 0.1, '[0, 0, 1, 0]': 0.04, '[0, 1, 0, 0]': 0.05, '[1, 0, 1, 0]': 0.05, '[1, 0, 0, 0]': 0.07, '[0, 1, 0, 1]': 0.07, '[1, 0, 1, 1]': 0.07, '[0, 0, 0, 0]': 0.08, '[1, 1, 1, 0]': 0.05, '[0, 0, 0, 1]': 0.1, '[0, 0, 1, 1]': 0.04, '[0, 1, 1, 0]': 0.09, '[1, 0, 0, 1]': 0.04, '[1, 1, 1, 1]': 0.05, '[1, 1, 0, 1]': 0.02}ジョブのすべてのプロパティにアクセスできます
job.details。次に例を示します。print(job.details) print("\nJob name:", job.details.name) print("Job status:", job.details.status) print("Job ID:", job.details.id){'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...} Job name: MyQuantumJob Job status: Succeeded Job ID: 0150202e-9638-11ee-be2f-b16153380354
その他のジョブの詳細
qdk.azure
Python パッケージには、より詳細なジョブ データを表示するための追加のメソッドが含まれています。
job.get_results_histogram():このメソッドは、各一意の測定の結果とショット数のディクショナリを返します。 たとえば、前のジョブの結果は次のようになります。print(job.get_results_histogram()){ '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 8}, '[1, 1, 0, 0]' : {'Outcome' : [1, 1, 0, 0], 'Count' : 10}, '[0, 0, 1, 0]' : {'Outcome' : [0, 0, 1, 0], 'Count' : 4}, '[0, 1, 0, 0]' : {'Outcome' : [0, 1, 0, 0], 'Count' : 5}, '[1, 0, 1, 0]' : {'Outcome' : [1, 0, 1, 0], 'Count' : 5}, '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 7}, '[0, 1, 0, 1]' : {'Outcome' : [0, 1, 0, 1], 'Count' : 7}, '[1, 0, 1, 1]' : {'Outcome' : [1, 0, 1, 1], 'Count' : 7}, '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 8}, '[1, 1, 1, 0]' : {'Outcome' : [1, 1, 1, 0], 'Count' : 5}, '[0, 0, 0, 1]' : {'Outcome' : [0, 0, 0, 1], 'Count' : 10}, '[0, 0, 1, 1]' : {'Outcome' : [0, 0, 1, 1], 'Count' : 4}, '[0, 1, 1, 0]' : {'Outcome' : [0, 1, 1, 0], 'Count' : 9}, '[1, 0, 0, 1]' : {'Outcome' : [1, 0, 0, 1], 'Count' : 4}, '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 5}, '[1, 1, 0, 1]' : {'Outcome' : [1, 1, 0, 1], 'Count' : 2} }job.get_results_shots(): このメソッドは、各ショット結果の一覧を返します。 たとえば、前のジョブの結果は次のようになります。print(job.get_results_shots())[ [0, 1, 1, 1], [1, 0, 1, 1], [0, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 0], [1, 0, 1, 1], [1, 1, 0, 1], ...]
Python を含むジョブを Q# に送信する Azure Quantum
VS Codeを使用して、Python操作を呼び出すQ# プログラムを作成し、Azure コマンドまたは Python CLI を使用してAzureに接続し、ジョブを送信する方法について説明します。
前提条件
インストールの詳細については、「QDK拡張機能のセットアップ」を参照してください。
- Azure Quantum サブスクリプション内のAzure ワークスペース。 ワークスペースを作成するには、「Azure Quantum ワークスペースを作成する」を参照してください。
- Python がインストールされた Python 環境。
- VS CodeおよびAzure Quantum Development Kitの拡張機能がインストールされている場合はPython。
-
qdkPythonライブラリにazure追加の機能を持たせた。 - 最新の拡張機能がインストールされている
CLI を使用します。
Q#操作を作成してインポートする
qdk.qsharp パッケージを使用すると、Q# ファイルに関数と操作を格納し、Q# コードからそれらを呼び出すことができるPythonを作成できます。 これは、入力パラメーターを受け取るプログラムを起動する必要がある場合に特に役立ちます。
手順に従ってQ# プロジェクトを作成します。
新しいテキスト ファイルを開き、ユーザー指定のランダム ビット数を返す次のQ# コードを追加し、
/srcとしてプロジェクトのSource.qsディレクトリにファイルを保存します。operation Random() : Result { use q = Qubit(); H(q); let result = M(q); Reset(q); return result } operation RandomNBits(N: Int): Result[] { mutable results = []; for i in 0 .. N - 1 { let r = Random(); results += [r]; } return results }(
qsharp.jsonファイルを含む) プロジェクト ルート フォルダーで、別のファイルを開き、randomNum.pyとして保存します。次のコードを追加して、モジュールを
qsharpazure.quantumインポートします。from qdk import qsharp, azure次に、 Q# プロジェクトのルート フォルダーを定義するコードを追加し、ローカル シミュレーターで target 操作をテスト実行します。 この操作は名前空間<によって呼び出されます。><operation_name( )>、この場合は、返すランダム ビットの数を渡します。
注
名前空間が指定
Source.qsされていないため、コンパイラは既定の名前空間Source.RandomNBits()としてファイル名を使用します。 詳細については、「プロジェクトと暗黙的な名前空間」を参照してください。qsharp.init(project_root = '../MyProjectRootFolder') print(qsharp.eval("Source.RandomNBits(4)"))[Zero, One, One, Zero]runメソッドを使用して操作をテストすることもできます。このメソッドは、追加のshotsパラメーターを渡し、結果をPythonリストに返します。 でrandomNum.py、前の print ステートメントを次のように置き換えます。result = qsharp.run("Source.RandomNBits(4)", shots=10) for x in result: print(x)[[One, One, One, One], [Zero, Zero, One, Zero], [One, Zero, Zero, One], [Zero, One, Zero, Zero], [One, Zero, One, One], [One, Zero, One, Zero], [One, One, One, Zero], [One, One, One, One], [Zero, Zero, Zero, One], [One, Zero, Zero, One]]
基本プロファイルを使用してジョブをコンパイルする
ローカル量子シミュレーターでプログラムを実行する場合は、任意の種類の Q# プログラムを送信できます。 ただし、ハードウェア Azure Quantumtargetsは、すべてのQ# プログラムを実行するために必要な完全な機能をまだサポートしていません。
Q# プログラムをコンパイルしてAzure Quantumに送信するには、target プロファイルを設定して、Q# ハードウェアでサポートされている機能をtargetに伝える必要があります。 現在、それはBaseまたはAdpative_RIのプロファイルです。 詳細については、「Azure Quantumのプロファイルの種類」を参照してください。
注
プロファイルを
init設定するには、次のメソッドを使用します。qsharp.init(project_root = '../MyProjectRootFolder', target_profile=qsharp.TargetProfile.Base)注
qsharp状態を再初期化するため、project_root操作を検索する場所をコンパイラが認識できるように、RandomNBitsパラメーターをもう一度設定する必要があります。 これは、前の手順の手順 5 でも実行できました。次に、このメソッドを
compile使用して、プログラムへのエントリ ポイントである操作または関数を指定します。 コンパイルされたプログラムは、任意の量子ハードウェアに送信できます。MyProgram = qsharp.compile("Source.RandomNBits(4)")
Azure Quantumに接続してジョブを送信する
Azure Quantumに接続し、Python作成されたWorkspace オブジェクトを使用してジョブを送信したり、Azure CLI を使用してジョブを接続して送信したりできます。
Azure CLI を使用するには、コンパイル済みのプログラムをテキスト ファイルとして保存し、CLI コマンドを使用してそのファイルを送信する必要があります。
プログラムを正しい形式にコンパイルしたら、azure.quantum.Workspaceに接続するAzure Quantum オブジェクトを作成します。 接続するには、 Azure Quantum ワークスペースのリソース ID を使用します。 リソース ID と場所は、 Azure ポータルのワークスペースの概要ページからコピーできます。
次のコードを
randomNum.pyに追加し、 Azure Quantum ワークスペースからリソース ID と場所を入力します。workspace = azure.Workspace( resource_id = "MyResourceID", location = "MyLocation" )ワークスペースで
get_targets使用可能なハードウェア targets を表示するには、次のメソッドを使用します。MyTargets = workspace.get_targets() print("This workspace's targets:") for x in MyTargets: print(x)以下を選択します。
rigetti.sim.qvmtargetMyTarget = workspace.get_targets("rigetti.sim.qvm")最後に、メソッドを
submit使用して、そのパラメーターを使用してプログラムを送信します。 ジョブの結果は、 Python ディクショナリとして返されます。job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100) results = job.get_results() print("\nResults: ", results)値だけを抽出して表示するには:
for x in results: print(x)[0, 0, 0, 0] 0.3 [1, 0, 0, 0] 0.1 [1, 1, 1, 1] 0.3 [0, 1, 1, 1] 0.3ジョブのすべてのプロパティにアクセスできます
job.details。次に例を示します。print(job.details) print("\nJob name:", job.details.name) print("Job status:", job.details.status) print("Job ID:", job.details.id){'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...} Job name: MyPythonJob Job status: Succeeded Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
その他のジョブの詳細
qdk.azure
Python パッケージには、より詳細なジョブ データを表示するための追加のメソッドが含まれています。
job.get_results_histogram():このメソッドは、各一意の測定の結果とショット数のディクショナリを返します。 たとえば、前のジョブの結果は次のようになります。results = job.get_results_histogram() for x in results.items(): print(x){ '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 30}, '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 10}, '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 30}, '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 30} }job.get_results_shots(): このメソッドは、各ショット結果の一覧を返します。 たとえば、前のジョブの結果は次のようになります。print(job.get_results_shots())[ [0, 0, 0, 0], [1, 1, 1, 1], [0, 1, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0], [0, 1, 1, 1], [0, 0, 0, 0], ...]