Share via


チュートリアル: QIR プログラムを Azure Quantum Resource Estimator に送信する

Azure Quantum Resource Estimator は、量子プログラムの完全に相互運用可能な仕様である (QIR) に基づいてQuantum Intermediate Representation構築されています。 QIR は、量子プログラミング言語とフレームワーク、および targeted 量子計算プラットフォーム間の共通インターフェイスとして機能します。 Resource Estimator は QIR プログラムを入力として受け取るため、QIR に変換されるすべての言語をサポートします。 たとえば、一般的な量子 SDK や Q# や Qiskit などの言語で使用できます。 このチュートリアルでは、QIR プログラムを作成して Resource Estimator に送信します。 このチュートリアルでは PyQIR を使用して QIR を生成しますが、QIR の他のソースを使用できます。

このチュートリアルで学習する内容は次のとおりです。

  • Azure Quantum サービスに接続します。
  • QIR ビットコードからリソース推定ジョブを作成する関数を定義する
  • PyQIR ジェネレーターを使用して QIR ビットコードを作成する
  • リソース推定器に QIR ジョブを送信する

無料の Azure 試用版サブスクリプションに 30 日間サインアップします。

前提条件

ワークスペースに新しいノートブックを作成する

  1. Azure portal にログインし、Azure Quantum ワークスペースを選択します。
  2. [ 操作] で[ノートブック] を選択 します。
  3. [マイ ノートブック] をクリックし、[新規追加] をクリックします。
  4. [カーネルの種類] で、[IPython] を選択します。
  5. ファイルの名前を入力し、[ファイルの 作成] をクリックします。

新しいノートブックが開くと、サブスクリプションとワークスペースの情報に基づいて、最初のセルのコードが自動的に作成されます。

from azure.quantum import Workspace
workspace = Workspace ( 
    resource_id = "", # Your resource_id 
    location = ""  # Your workspace location (for example, "westus") 
)

Note

特に記載がない限り、コンパイルの問題が発生しないように、各セルは作成した順序で実行する必要があります。

セルの左側にある三角形の [再生] アイコンをクリックして、このコードを実行します。

必要なインポートを読み込む

まず、、、および からazure.quantumqiskitいくつかの Python クラスと関数をインポートするpyqir必要があります。 Qiskit を使用して量子回路を直接構築することはありませんが、Qiskit エコシステムの上に構築された を使用 AzureQuantumJobします。 Qiskit の最新バージョンを使用していることを確認します。 詳細については、「 Azure-quantum Python パッケージを更新する」を参照してください。

from azure.quantum.qiskit import AzureQuantumProvider
from azure.quantum.qiskit.job import AzureQuantumJob
from pyqir.generator import BasicQisBuilder, SimpleModule

Azure Quantum サービスに接続する

次に、前の AzureQuantumProvider セルの オブジェクトを workspace 使用してオブジェクトを作成し、Azure Quantum ワークスペースに接続します。

provider = AzureQuantumProvider(workspace)

QIR からリソース推定ジョブを作成する関数を定義する

Resource Estimator は、 target Microsoft Quantum Computing プロバイダーの です。 Resource Estimator の使用は、Azure Quantum で他のソフトウェアおよびハードウェア プロバイダー targets に対してジョブを送信するのとまったく同じです。プログラムを定義し、を設定 targetし、計算のためにジョブを送信します。

プログラムのリソース見積もり要求を送信するときに、いくつかの target パラメーターを指定できます。

  • errorBudget - 許容される全体的なエラー予算
  • qecScheme - 量子エラー修正 (QEC) スキーム
  • qubitParams - 物理量子ビット パラメーター
  • constraints - コンポーネント レベルの制約

入力パラメーターの詳細については、「 Resource Estimator のターゲット パラメーター」を参照してください。

この例では、Azure Quantum ワークスペースに接続するオブジェクトと量子プログラムの provider QIR ビットコードを入力として受け取るジェネリック関数を実装します。 その結果、Azure Quantum ジョブが返されます。 Resource Estimator target パラメーターは、キーワード (keyword)引数を使用して関数に渡すことができます。

def resource_estimation_job_from_qir(provider: AzureQuantumProvider, bitcode: bytes, **kwargs):
    """A generic function to create a resource estimation job from QIR bitcode"""

    # Find the Resource Estimator target from the provider
    backend = provider.get_backend('microsoft.estimator')

    # You can provide a name for the job via keyword arguments; if not,
    # use QIR job as a default name
    name = kwargs.pop("name", "QIR job")

    # Wxtract some job specific arguments from the backend's configuration
    config = backend.configuration()
    blob_name = config.azure["blob_name"]
    content_type = config.azure["content_type"]
    provider_id = config.azure["provider_id"]
    output_data_format = config.azure["output_data_format"]

    # Finally, create the Azure Quantum jon object and return it
    return AzureQuantumJob(
        backend=backend,
        target=backend.name(),
        name=name,
        input_data=bitcode,
        blob_name=blob_name,
        content_type=content_type,
        provider_id=provider_id,
        input_data_format="qir.v1",
        output_data_format=output_data_format,
        input_params = kwargs,
        metadata={}
    )

サンプル量子プログラムを実行する

次に、PyQIR ジェネレーターを使用して QIR ビットコードをいくつか作成します。 この例では、3 つの T ゲートと 2 つの CNOT ゲートを使用して制御された S ゲートを構築します。

module = SimpleModule("Controlled S", num_qubits=2, num_results=0)
qis = BasicQisBuilder(module.builder)

[a, b] = module.qubits[0:2]
qis.t(a)
qis.t(b)
qis.cx(a, b)
qis.t_adj(b)
qis.cx(a, b)

上記で定義した関数を PyQIR の bitcode() 関数と共に使用して、リソース推定ジョブを生成できます。 Resource Estimator 固有の引数を渡すこともできます。 この例では、 を使用 errorBudget してエラー率を 5% に設定します。 パラメーターの target 詳細については、「 Resource Estimator のターゲット パラメーター」を参照してください。

job = resource_estimation_job_from_qir(provider, module.bitcode(), errorBudget=0.05)
result = job.result()
result

この関数は、物理リソースの全体的な数を示すテーブルを作成します。 より多くの情報を持つグループを折りたたむことで、コストの詳細をさらに調べることができます。 たとえば、[ 論理量子ビット パラメーター] グループを折りたたんだ場合、エラー修正コードの距離が 15 であることがわかります。

論理量子ビット パラメーター
QEC スキーム surface_code
コード距離 5
物理量子ビット 50
論理サイクル時間 2us
論理量子ビット エラー率 3.00E-5
交差の前要素 0.03
エラー修正しきい値 0.01
論理サイクル時間の数式 (4 * twoQubitGateTime + 2 * oneQubitMeasurementTime) * codeDistance
物理量子ビットの数式 2 * codeDistance * codeDistance

[物理量子ビット パラメーター] グループでは、この推定で想定されていた物理量子ビット プロパティを確認できます。 たとえば、単一量子ビット測定と単一量子ビット ゲートを実行する時間は、それぞれ 100 ns と 50 ns であると見なされます。

物理量子ビット パラメーター
量子ビット名 qubit_gate_ns_e3
命令セット GateBased
単一量子ビット測定時間 100 ns
T ゲート時間 50 ns
T ゲート エラー率 0.001
単一量子ビット測定エラー率 0.001
単一量子ビット ゲート時間 50 ns
単一量子ビットエラー率 0.001
2 量子ビット ゲート時間 50 ns
2 量子ビット エラー率 0.001

詳細については、Resource Estimator の出力データの完全な一覧 を参照してください。

引き続き他の量子アルゴリズムおよび手法を調査します。

  • グローバーの検索アルゴリズムを実装 する」チュートリアルでは、グローバーの検索アルゴリズムを使用してグラフの色分けの問題を解決する Q# プログラムを記述する方法を示します。
  • チュートリアル「 Q# を使用した量子エンタングルメントの探索 」では、Q# を使用して量子ビットを操作して状態を変更する方法と、重ね合わせとエンタングルメントの効果を示します。
  • Quantum Katas は、量子コンピューティングと Q# プログラミングの要素を同時に教えることを目的とした、Jupyter Notebookベースのマイペースのチュートリアルとプログラミング演習です。