Amazon Web Services ブログ

Amazon Braket のコスト管理

この記事は、Managing the cost of your experiments in Amazon Braket を翻訳したものです。

実験の使用量とコストを見積もることは、Amazon Braket を利用するお客様にとって重要な要件です。お客様は、アルゴリズムの実行に伴うコストと使用量をトラッキングしたいと考えています。特に、満足いく結果を得るために多くのサイクルを必要とするような複雑なアルゴリズムであれば、なおさらコスト見積もりのニーズは高まるでしょう。その上、Amazon Braket では多種多様なオンデマンドシミュレーターと量子ハードウェアが利用可能なため、デバイスごとのコストを把握、予測、比較することはさらに重要になってきます。このような背景からわたしたちは、お客様が最小限の労力でこれらのコスト計算を行えるようなあらゆる選択肢の提供や、コストパフォーマンスが最も高いプラットフォーム選択の簡易化、そして予算管理の支援に努めています。

このブログでは、Amazon Braket のコストをほぼリアルタイムで管理できる新しい Braket Cost Tracker をご紹介するとともに、AWS で利用できる他のコスト管理ツールについても説明します。料金の概要から始まり、量子ワークロードの実行前、実行中、実行後のコストを管理するための例や様々なオプションについて説明します。この記事を読むことで、Amazon Braket の利用コストを予測、監視、制限、報告できるようになります。Braket の料金体系について既にご存知の読者の方は、こちらからコストトラッキングツールの概要に飛ぶことができます。

Amazon Braket の料金体系

Amazon Braket は、量子コンピュータ、量子回路シミュレーター、ハイブリッド量子古典アルゴリズムのフルマネージド実行、Jupyter Notebook 開発環境を提供します。ここでは、最初の3つを取り上げます。Jupyter Notebookの料金については、Amazon SageMaker の料金ページを参照してください。

まず、Braket 経由で量子コンピュータにアクセスする際のコストについて説明します。量子処理装置 (QPU) の利用料金は、2 つの要素から成ります。すなわち、タスク単位の料金と、ショット単位の料金です。

ショットとは、QPU上で量子回路を 1 回だけ実行することです。IonQ, Oxford Quantum Circuits(OQC), Rigetti といったゲートベースの QPU では、1 ショットは 1 回の回路実行と測定にあたります。D-Wave の量子アニーラを使用する場合、1 ショットは量子アニーリング問題の 1 つの結果サンプルを収集することにあたります。Xanadu のガウシアンボゾンサンプリングデバイスでは、1 ショットは個々の時間領域回路の実行にあたります。なお、ショット単位の料金は、使用する QPU の種類のみに依存し、使用するゲートの数や種類、使用する変数の数には影響されません。各 QPU のショット単位の料金については、料金ページに最新の情報が掲載されています。

タスクとは、ショットの論理的なグループ分けのことです。同じ回路上、もしくは同じアニーリング問題上で繰り返されるショットの集合にあたります。Amazon Braket にタスクを送信する際に、1 つのタスクに含まれるショット数を定義します。現在、タスク単位の料金は、すべての QPU とリージョンで同じです。

図 1: QPU を用いた Amazon Braket のワークフロー

これらの用語を図で説明します。ある研究者は、とある量子アニーリング問題を AWS US West (Oregon) リージョンにある D-Wave Advantage で実行します。このタスクには、同じアニーリング問題の結果サンプルが 10,000 個含まれています。結果を比較するため、研究者はこの実験を毎回異なるパラメータで 4 回実行します。この実験の料金には、タスク単位の料金と、ショット単位の料金で 10,000 ショットが含まれることになります。そのため、料金は合計で以下のようになります。

表 1: QPU 実行にかかる料金見積もり。

これに対し、オンデマンド量子回路シミュレーターの料金は、タスクの実行時間のみに依存します。Amazon Braket では、状態ベクトルシミュレーター (SV1)、テンソルネットワークシミュレーター (TN1)、密度行列シミュレーター (DM1) という3種類のオンデマンドシミュレーターを提供しています。ゲート数、量子ビット数、演算数、グラフ構造、同時実行数は、タスク実行時間に影響を与えますが、タスク料金の決定には直接影響しません。タスク料金は、あくまでタスクの継続時間に基づいて測定されます。各シミュレーターの最新情報については、料金ページをご覧ください。

図 2: オンデマンドシミュレーターを用いた Amazon Braket のワークフロー。

別の例で考えてみましょう。ある開発者が Amazon Braket SDK を使って 30 量子ビットの量子回路を設計し、AWS US East (N. Virginia) リージョンの Amazon Braket オンデマンドシミュレータ SV1 を利用して、その回路のシミュレーションを実行したとします。このシミュレーションタスクは 15 分かかり、毎回異なるショット数で 4 回繰り返されます。このワークフローの総コストは、分単位 (ただし最小課金時間は3秒) のオンデマンド料金で以下のように計算できます。

表 2: シミュレーション実行にかかる料金見積もり

なお、このワークロードであれば、合計タスクの実行時間がちょうど 1 時間のため、AWS 無料利用枠の範囲に収めることができます。AWS 無料利用枠では、Braketを使い始めてから 12 ヶ月間、毎月 1 時間のシミュレーション時間が提供されます。

実験を行う 3 つ目の方法は、ハイブリッドジョブを用いることです。Amazon Braket Hybrid Jobs は、Amazon Elastic Cloud Compute(ジョブインスタンス)で動作する AWS の古典計算リソースと、Amazon Braket QPU または量子回路シミュレーターを組み合わせ、ハイブリッド量子古典アルゴリズムのフルマネージド実行を提供します。この機能を用いることで、Braket 上の QPU へ必要な時のみ、かつ優先的にアクセスでき、ハイブリッドアルゴリズムの実行を高速化することができます。

図 3: Amazon Braket Hybrid Jobs を用いた量子古典ハイブリッド計算のワークフロー。

Hybrid Jobs の利用コストは、2 つの要素から成ります。すなわち、古典リソースの利用コストと、量子コンピューターや量子回路シミュレーターの利用コストです。

Hybrid Jobs では、インスタンスタイプに基づくジョブインスタンスと、選択したハードウェアまたはシミュレーターでの量子タスクの実行に課金されます。Hybrid Jobs は、デフォルトでml.m5.large インスタンスを使用しますが、ジョブ作成時に別のインスタンスタイプを選択することもできます。また、ジョブインスタンス内に追加データストレージを追加するオプションもあります(別途の追加費用が発生します)。インスタンスタイプと追加ストレージの料金については、Amazon Braketの料金ページ内の Hybrid Jobs タブにある “Job Instances” の料金表を参照してください。Hybrid Jobs での QPU やシミュレーターの使用には、それらを (Hybrid Jobs を使わずに) 単独で使用する際と同じ料金設定が適用されます。

この仕組みを図で説明します。ある科学者が、パラメータ付き量子回路を使用して損失関数を最小化する変分アルゴリズムを実行し、勾配降下法を使用して回路パラメータを繰り返し調整するとします。このアルゴリズムは、AWS US West (N. California) リージョンの Amazon Braket Hybrid Jobs を使用して、Rigetti Aspen-M QPU で実行されます。この Hybrid Jobsは、パラメータを収束させるために 50 回の調整のそれぞれについて、100 ショットずつ 2 つのタスクを実行する必要があります。また、この科学者は、ワークロードの古典計算部分を管理するために ml.p3.8xlarge ジョブインスタンスを使用し、全部で26分かかる実験の間、各イテレーションでパラメータを調整します。このワークロードの料金は、以下のとおりです。

表 3: 古典と量子のリソースを用いたハイブリッド計算にかかる料金見積もり。

AWS/Amazon Braket に関するコストトラッキング・予算ツール

ニアリアルタイムのコストトラッキングツール : Amazon Braket Cost Tracker

ある量子アルゴリズムが複雑であるため、その実行コストを事前に予測することが難しい場合があります。例えば、アニーリング問題が必要とするタスク数は埋め込みグラフのサイズに依存します。別の例として、QML ハイブリッドアルゴリズムの実行時間は、収束に必要なイテレーション回数に依存します。最近、私たちは Amazon Braket Cost Tracker というツールを発表し、現在はBraket SDK に組み込まれています。このツールを用いることで、量子ワークロードが取りうる最大コストを、ほぼリアルタイムで見積もることができるようになります。

Braket Cost Tracker の 1 行のコードを追加することで、QPU のタスクやショットにかかるコストや、シミュレーターの利用時間にかかるコストといった、使用する量子リソースごとのコストを把握できるようになります。

このツールを使うには、まず Tracker() オブジェクトを初期化し、後はいつも通りにアルゴリズムを定義して実行します。このオブジェクトは、実行されるコンテクスト内のリソースをトラッキングします。トラッキングの範囲は、Notebook 全体にわたることも、変分アルゴリズム内の特定のイテレーションのみに絞ることも可能です。Cost Tracker は、使用状況をトラッキングし、コスト管理ロジックを簡略化するメソッドを提供します。これらの使い方は Braket SDK のドキュメントに記載されています。

Cost Tracker を実際に動かしてみましょう。以下の例では、ベル状態の回路を作成し、SV1 シミュレーター上で実行します。まず Braket SDK をインポートし、ベル状態を定義し、作成された量子タスクを追跡するために Tracker() オブジェクトをインスタンス化します。statistics() メソッドと cost() メソッドを呼び出すと、送信されたショット数、完了したタスクとそのステータス、実行時間、請求される実行時間、最大コスト (USD) が返されます。実行時間はシミュレーションごとに異なる場合があります。

# Import any required modules
from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.tracking import Tracker
from braket.annealing import Problem,ProblemType

# Create Bell state and initialize tracking
circ = Circuit().h(0).cnot(0,1)
device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")
with Tracker() as tracker:
    task = device.run(circ, shots=100).result()

# Your results
print(task.measurement_counts)

# Print tracker results
print(f"Task statistics: {tracker.quantum_tasks_statistics()}")
print(f"Estimated cost to run this example: {tracker.simulator_tasks_cost():.5f} USD")
Output:
        Counter({'11': 51, '00': 49})
        Task statistics: {
                'arn:aws:braket:::device/quantum-simulator/amazon/sv1': {
                        'shots': 100,
                        'tasks': {'COMPLETED': 1},
                'execution_duration': datetime.timedelta(microseconds = 64000),
                'billed_execution_duration': datetime.timedelta(seconds = 3)}}
        Estimated cost to run this example: 0.00375 USD

このように、実行時間は 0.064 秒ですが、請求される実行時間は 3 秒です。これはシミュレータータスクの最低料金が 3 秒分であるためです。次に、device 変数を Rigetti Aspen-11 QPU に変えて同じ回路を実行してみましょう。Cost Tracker の tatistics() メソッドを呼び出すと、実行時間の記述がなくなっています。これは、タスクとショットのみが料金計算の要素となるためです。

# Import any required modules
from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.tracking import Tracker
from braket.annealing import Problem,ProblemType

#create our bell circuit
circ = Circuit().h(0).cnot(0,1)
device = AwsDevice("arn:aws:braket:::device/qpu/rigetti/Aspen-11")
with Tracker() as tracker:
task = device.run(circ, shots=100).result()

#Your results
print(task.measurement_counts)

# Print tracker results
print(f"Task statistics: {tracker.quantum_tasks_statistics()}")
print(f"Estimated cost to run this example: {tracker.qpu_tasks_cost():.3f} USD")
Output:
        Counter({'00': 42, '11': 33, '10': 14, '01': 11})
        Task statistics: {
                'arn:aws:braket:::device/qpu/rigetti/Aspen-11': {
                        'shots': 100,
                        'tasks': {'COMPLETED': 1}}}
        Estimated cost to run this example: 0.335 USD

Cost Tracker を使用してコスト管理ロジックを追加する

Tracker を使用して、実験にコスト管理ロジックを追加することができます。例えば、最大料金を設定し、与えられたワークロードにいくらまでなら支出してもよいか、といったことを決めることができます。以下の例は、D-Wave Advantage System 6.1 上で QUBO 問題を実行し、総料金が定義された上限 (2.00 USD) を超えたら新しいタスクの実行を停止しています。これによってコストを制限しています。Tracker によると、1 タスク + 1000ショットのコストは 0.49 USD です。ここでは 2 USD を越えるまで問題を繰り返し実行し、その都度コストを表示するロジックを設定しています (結果的に 5 回実行することになります)。これにより、コストを指定した最大料金に近づけながらタスクを複数回実行できるため、実験に柔軟性が生まれます。

# Import any required modules
from braket.aws import AwsDevice
from braket.annealing import Problem,ProblemType
from braket.tracking import Tracker

# Create your annealing problem
problem = Problem(ProblemType("QUBO"), {35: 1}, {(35, 36): -1})
device = AwsDevice("arn:aws:braket:us-west-2::device/qpu/d-wave/Advantage_system6")
with Tracker() as tracker:
    while tracker.qpu_tasks_cost() <= 2:
        result = device.run(problem, shots=1000).result()
        # Print the cost of each iteration
        print(f"Estimated cost: {tracker.qpu_tasks_cost():.2f} USD")

# Print final results
print(f"Task statistics: {tracker.quantum_tasks_statistics()}")
Output:
     Estimated cost: 0.49 USD
     Estimated cost: 0.98 USD
     Estimated cost: 1.47 USD
     Estimated cost: 1.96 USD
     Estimated cost: 2.45 USD
     Task statistics: {
          'arn:aws:braket:us-west-2::device/qpu/d-wave/Advantage_system6': {
               'shots': 5000,
               'tasks': {'COMPLETED': 5}}}

ここまでの例では、Tracker は 1 つの量子回路や 1 つのアニーリング問題の中で起動・停止していました。しかし、Tracker を 1 つの Notebook にわたって実行したり、Hybrid Jobsの特定のイテレーションに限定して使うこともできます。コストを調べたい箇所で、 start メソッドや stop メソッドを呼び出すだけで良いのです。

コード上で料金情報にアクセスする : AWS Price List service API

Braket Cost Tracker はお客様のタスクの状態を追跡し、停止するまでのリソース使用量を計測します。一方で、公開されている現在の Braket 料金のみを知りたい場合もあるでしょう。そのような時、AWS Price List Service API を用いることで最新の料金情報を手軽に照会することができます。標準化されたサービス情報を入手することができ、予算や将来のワークロード費用の見積もり、請求データの照合などに利用できます。

この API を Jupyter Notebook (または独自のカスタム開発環境) で使用すると、コード内でいつでも QPU のタスク料金とショット料金の案内を入手できます。また、シミュレーションの実行時間が事前に分かっている場合は、分単位の料金に基づいて総コストの見積もりを計算することができます。前セクションで照会した Cost Tracker との大きな違いは、Price List Service API は、お客さまが独自にコーディングしない限りワークロードロジックに組み込まれない、という点です。つまり、タスクの中断、追加、パラメータ変更、(シミュレータの場合) 予想と異なる実行時間、などが生じても、Price List Service API の出力が変わることはありません。

Price List Service API を利用するには、サービスコードを指定して GetServices メソッドを呼び出し、そのサービスの属性名を取得します。さらに GetAttributeValues のサービスコードに ‘AmazonBraket’ を設定することで、属性値を取得できます。サービスコード、属性名、属性値を取得したら、GetProducts を呼び出し、デバイスやリージョンごとのタスク料金、ショット料金、実行時間料金、ジョブインスタンス料金を取得することができます。

Braket SDK でも一部の料金参照ができることについても触れたいと思います。Braket SDK の デバイスのプロパティ ( device.properties.service.deviceCost.price ) としてショット料金が組み込まれています。このプロパティを呼び出している例がこちらの Notebook の最後にございますので、興味のある方はご覧ください。

ブラウザベースのコスト見積もりツール : AWS Pricing Calculator

コストを見積もる別の方法として、AWS Pricing Calculator があります。これは Web ブラウザベースの見積もりツールで、Amazon Braket の料金も見積もることができます。実験を始める前に量子ワークロードをモデル化し、Braket の費用感を把握し、見積もりの各要素を確認することができます。そのため Braket の使用を始めるにあたり、試算に基づいた意思決定ができるようになります。クラウドの経験や AWS アカウントは不要のため、AWS を初めて使うという方にも便利なツールです。

以下のスクリーンショットの例では、ある研究責任者が、担当する量子プロジェクトに割り当てられる月次予算を試算しています。試算するサービス項目で Amazon Braket を選び、リージョンを選択した後、関連項目に値を入力していきます。今回は以下のように、ローカルシミュレーター、状態ベクトルシミュレーター (SV1)、テンソルネットワークシミュレーター (TN1)、ノイズシミュレーター (DM1) を合計して、毎日平均 185 回のシミュレーションが実行されていると推定しています。シミュレーターの実行時間は分単位での課金となるため、各シミュレーションの平均実行時間も入力しています。同様に、 QPU のセクションでは、月次で実行される予定のタスク数とショット数を入力します。この例では、1 週間に 100 タスクを実行し、1 タスクあたり平均 1000 ショットと入力しています。このように、画面下部の月次総コストが動的に更新されるため、予算に合わせて入力値を変更したり、特定のワークロードを別のものに置き換えたりすることが可能です。

図 4: AWS Pricing Calculator の Amazon Braket セクションを用いた、QPUとシミュレーターの料金見積もり。

すべての入力が完了すると、年間コスト予測概要にアクセスできたり、リンクを発行して見積もりを同僚に共有できたり、CSV および PDF 形式でエキスポートできたりするようになります。

過去のワークロードを視覚化する : AWS Cost Explorer

もう一つの可視化ツールは AWS Cost Explorer です。これを用いると、過去 1 年までの Amazon Braket の使用量をレポートし、コストを視覚化し、エキスポートできます。 AWS Cost Explorer はマネジメントコンソールのコスト管理セクションに含まれており、適切な権限を設定することで、アクセスできるユーザーを制御できます。

図 5: Cost Explorer で表示した 1 週間の Braket 使用量 (サービスと使用タイプでフィルタリング済み)。

上のスクリーンショットで示しているように、右側の Service パネルで Braket のみにフィルタリングすることができます。上部パネルでは、レポートの時間枠と粒度 (月単位、日単位、時間単位) を選択できます。最後に Group by メニューで Usage Type を選択すると、QPU のタスク料金やショット料金、シミュレーションの実行時間などを 1 つのレポートで可視化することができます。AWS Pricing Calculator と同様に、作成したレポートは保存、共有、CSV 形式での書き出しが可能です。

ワークロードの予算についての通知を受け取る : AWS Budgets

コスト管理ツール紹介の締めくくりに、AWS Budgets についてお話しします。AWS Budget を用いることで、利用料金または利用量が予算を超えたときに、通知を受け取ることができます。このツールもマネジメントコンソールのコスト管理セクションに含まれています。AWS Budgets は、Braket 料金に対してカスタム予算を設定し、特定の要素の使用に関して詳細な制御をかけることができるため、財務管理者にとっては非常に素晴らしいツールです。

以下の例では、ある研究機関の応用コンピューティング部門のアカウント管理者が、イオントラップ技術にかかる経常支出を管理したいと考えています。この部門では、IonQ の利用に対して、毎月 500USD の専用予算を確保しています。まず管理者は、計画コストに関する新しい月次予算レポートを作成します。

図 6: AWS Budgets の初期設定画面。

次に、特定の項目で予算をフィルタリングすることができます。今回は IonQ を用いたタスクとショットにフィルタリングしています。下のスクリーンショットからわかるように、このツールは特定の項目の予算設定を行うこともできますし、必要であれば AWS の全サービスの予算設定を行うこともできます。

図 7: AWS Budgets による予算項目のフィルタリング。

この初期設定後、月次レポートが自動的に作成され、マネジメントコンソール上で利用できるようになります。また月次の予算を定めて研究を行なっている場合、AWS Budgets を用いて、実際のコストが月次予測を上回った際に管理者にアラームを通知することもできます。

Next Steps

このブログでは、Amazon Braket の料金体系の概要と、ショット、タスク、シミュレーション実行時間、ジョブインスタンス実行時間、マネージドノートブックインスタンス実行時間といった、主要な用語について説明しました。また料金ツールとして、Braket SDK 上でほぼリアルタイムにコストをトラッキングできる Braket Cost Tracker、 事前に見積もりを行える AWS Calculator と AWS Price List service API、料金レポートを提供する AWS Cost Explorer、そして予算を設定できる AWS Budgets をご紹介しました。それぞれのツールは、AWS の量子コンピューティングワークロードで発生するコストについて、さまざまな視点を提供します。

既に Amazon Braket をご利用しているお客様は、GitHub レポジトリから新しいノートブックインスタンスを起動したり、既存のノートブックインスタンスを更新したりすることができます。新しく登場した Cost Tracker は、既にすべての Braket Notebook サンプルに埋め込まれています。そのためコストの見通しが立てやすくなり、既存のワークロードにも組み込みやすくなりました。今すぐご利用を開始し、その効果を実感してみましょう!

Juan Moreno

Juan Moreno

Juan は Amazon Braket 専門のソリューションアーキテクトです。さまざまな業界の技術支援に関わり、大規模なオペレーションとチームマネジメントに注力してきました。量子コンピュータについても豊富な知識を持ち、お客様が新しい技術を使い始めることの支援に大きな情熱を注いでいます。休日には物理を学び、ヨガを教え、妻や友人と充実した時間を過ごしています。

Zia Mohammad

Zia Mohammad

Zia Mohammad は Amazon Braket のシニアプロダクトマネージャーです。ベンチャーキャピタル、AI、フィンテック、そして最近では量子コンピューティング領域での仕事に励んでいます。オハイオ州立大学で電気工学と計算神経科学の学位を取得しています。プライベートでは、技術政策についての本を読んだり、世界中を旅行したり、ニューヨークで一番美味しいデザート屋さんを探したりしています。

翻訳は Solutions Architect の高木裕登が担当しました。