

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 成本跟踪和节约
<a name="braket-pricing"></a>

**提示**  
**通过以下方式学习量子计算的基础 AWS！**注册 [Amazon Braket 数字学习计划](https://skillbuilder.aws/learning-plan/EH35DWGU3R/amazon-braket--knowledge-badge-readiness-path-includes-labs)，完成一系列学习课程和数字评估后，即可获得自己的数字徽章。

借助 Amazon Braket，您可以按需访问量子计算资源，无需预先承诺。您仅需按实际用量付费。要了解有关定价的更多信息，请访问[定价页面](https://aws.amazon.com/braket/pricing/)。

**Topics**
+ [

## 为 Amazon Braket 设置支出限额 QPUs
](#quantum-hardware-spending-limits)
+ [

## 近乎实时的成本跟踪
](#real-time-cost-tracking)
+ [

## 节省成本的最佳实践
](#best-practices)

## 为 Amazon Braket 设置支出限额 QPUs
<a name="quantum-hardware-spending-limits"></a>

Amazon Braket 支出限额为量子处理单元提供了可选的每台设备的成本控制 ()。QPUs

 **支出限制的运作方式**：Amazon Braket 会跟踪您的累积支出，并根据您配置的限额验证每个任务创建请求。如果某项任务的估计费用超过您的剩余支出上限，Amazon Braket 会立即拒绝该任务，并显示验证错误。您可以选择为支出限额配置时间段。通过配置时间段，您可以确保只能在该指定时间段内提交任务。在时间段之外提交的任务将被拒绝。

 **可选设计**：除非您明确启用控件，否则现有工作流程将不受影响。您可以通过删除支出限额来取消所有限制。

**注意**  
 支出限制仅适用于按需和混合作业 [QPU 任务](braket-submit-tasks)。它们不包括[模拟器](braket-submit-tasks-simulators)、[托管笔记本电脑](braket-get-started-create-notebook)、[Hybrid Job](braket-jobs) EC2 实例成本和 [Braket Direct 预留](braket-reservations)。要全面管理所有 AWS 服务的成本，请继续使用[AWS Budgets](https://aws.amazon.com/aws-cost-management/aws-budgets/)。

### 支出限制措施清单
<a name="spending-limits-actions"></a>

 **搜寻**   
 使用以下 AWS CLI 命令，您可以搜索和列出特定 AWS 区域和特定 Braket 设备的支出限制。  

```
aws --region {device_region} braket search-spending-limits --filters name=deviceArn,operator=EQUAL,values={device_arn}
```

 **创建**   
 使用以下 AWS CLI 命令，您可以为特定区域的指定量子设备创建新的支出限额。如果设备已存在支出限额，则该请求将被拒绝。  

```
aws --region {device_region} braket create-spending-limit --device-arn {device_arn} --spending-limit {max_spend}
```

 **更新**   
 使用以下 AWS CLI 命令，您可以将现有支出限额更新为新的最高支出价值。如果当前支出和排队支出的总和已经高于请求的新最高支出，则该请求将被拒绝。  

```
aws --region {device_region} braket update-spending-limit --spending-limit-arn {spending_limit_arn} --spending-limit {new_max_spend}
```
 如上例所示，您可以提供一个时间段来代替新的最高支出，或者在新的最高支出之外再提供一个时间段。

 **删除**   
 使用以下 AWS CLI 命令，您可以删除现有支出限额。  

```
aws --region {device_region} braket delete-spending-limit --spending-limit-arn {spending_limit_arn}
```
 如上例所示，您可以提供一个时间段来代替新的最高支出，或者在新的最高支出之外再提供一个时间段。

 尽管是可选的，但请务必将区域参数指定为最佳实践。在与设备不同的区域执行的命令将失败，或者如果是`SearchSpendingLimits`，则返回错误的结果。

 有关如何使用支出限额的更多示例，请参阅[示例笔记本](https://github.com/amazon-braket/amazon-braket-examples/tree/main/examples/braket_features/Spending_Limits_Introduction.ipynb)。

### 任务验证的工作原理
<a name="spending-limit-task-validation"></a>

 当 AWS 账户发送原本有效的`CreateQuantumTask`请求时，它会受到以下门控行为的约束。注意：剩余预算是支出限额与排队和当前支出之和之间的差额。（参见下一节） 
+  案例 1：任务设备**没有支出限制**：任务已创建。
+  案例 2：目标设备有支出限制，并且**当前时间在支出限制的时间段内**：
  +  如果任务的估计成本低于或等于剩余预算： CreateQuantumTask 成功，则任务即被创建。
  +  如果预估成本大于剩余预算：`CreateQuantumTask`失败，并且不创建任何任务。
+  案例 3：目标设备有支出限制，且**当前时间超出支出限制的时间段**：`CreateQuantumTask`失败，且未创建任何任务。

### 剩余预算是如何计算的
<a name="spending-limit-budget-computation"></a>

 剩余预算是**支出限额与当前支出****和**排队**支出**之和之间的差额。

 当为具有支出限制的设备创建任务时，**排队**的支出将按任务的估计成本增加。下表的第一行列出了此事件。下表显示了排队的支出和当前支出的变化，具体取决于任务的进度。


|  |  |  |  | 
| --- |--- |--- |--- |
|   **旧的量子任务状态**   |   **新的量子任务状态**   |   **更改为排队支出**   |   **更改为当前支出**   | 
|  -  |  CREATED  |  按估计成本增加  |  无更改  | 
|  CREATED  |  QUEUED  |  无更改  |  无更改  | 
|  任何  |  正在运行  |  无更改  |  无更改  | 
|  任何  |  正在取消  |  无更改  |  无更改  | 
|  正在取消  |  CANCELLED  |  按估计成本降低  |  没有变化  | 
|  任何  |  FAILED  |  按估计成本降低  |  无更改  | 
|  正在运行  |  COMPLETED  |  按估计成本降低  |   按估计费用增加（根据部分完成的任务作相应调整）   | 

### 边缘保护壳
<a name="spending-limit-edge-cases"></a>

 **问：在创建支出限额时，队列中已有的任务是否计入排队的支出？** 

 答：不是。 已创建、排队或其他正在进行的任务不计入新创建的支出限额的排队支出。

 **问：通过更新支出限额来降低支出限额是否会导致已创建、已排队或其他正在进行的量子任务提前终止？** 

 答：不是。

 **问：达到支出限制的结束时间是否会导致已创建、已排队或其他正在进行的量子任务提前终止？** 

 答：不是。 无论支出限制状态如何，都允许完成已创建、已排队和其他正在进行的任务。

 **问：缺乏支出限额与零美元支出限额有何不同？** 

 答：没有支出限制，可以不受限制地创建量子任务。零美元的支出限制会阻止所有量子任务。

 **问：过去或未来（future）的支出上限为零会阻碍所有量子任务的创建？** 

 答：能。

 **问：在创建支出限额时，已在队列中的任务完成后，估计的费用是否会计入当前支出？** 

 答：不是。 只有在支出限额处于活动状态时提交的任务才会计入累计支出。

## 近乎实时的成本跟踪
<a name="real-time-cost-tracking"></a>

Braket SDK 为您提供了向量子工作负载中添加近乎实时的成本跟踪的选项。我们的每个示例笔记本都包含成本跟踪代码，可为您提供有关 Braket 量子处理单元 (QPUs) 和按需模拟器的最大成本估算。最高成本估算值将以美元显示，不包括任何积分或折扣。

**注意**  
显示的费用是根据您的 Amazon Braket 模拟器和量子处理单元（QPU）任务使用情况估算的费用。显示的预计费用可能与您的实际费用有所不同。预计费用不考虑任何折扣或积分，您可能会因使用其他服务 [Amazon Elastic Compute Cloud（Amazon EC2）] 等其他服务而收取的额外费用。

 **成本跟踪 SV1** 

为了演示如何使用成本跟踪功能，我们将构建一个 Bell State 电路并在我们的 SV1 模拟器上运行它。首先导入 Braket SDK 模块，定义贝尔状态并将 `Tracker()` 函数添加到我们的电路中：

```
#import any required modules
from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.tracking import Tracker

#create our bell circuit
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=1000).result()

#Your results
print(task.measurement_counts)
```

```
Counter({'00': 500, '11': 500})
```

当您运行 Notebook 时，您可以期待 Bell State 模拟的以下输出。跟踪器功能将显示发送的镜头数量、已完成的量子任务、执行时长、计费的执行持续时间以及以美元为单位的最大成本。每次模拟的执行时间可能会有所不同。

```
import datetime

tracker.quantum_tasks_statistics()
{'arn:aws:braket:::device/quantum-simulator/amazon/sv1':
 {'shots': 1000,
  'tasks': {'COMPLETED': 1},
  'execution_duration': datetime.timedelta(microseconds=4000),
  'billed_execution_duration': datetime.timedelta(seconds=3)}}
  
tracker.simulator_tasks_cost()
```

```
Decimal('0.0037500000')
```

 **使用成本跟踪器设置最高成本** 

您可以使用成本跟踪器来设置计划的最高成本。您可对想要为某一项目花费的金额设定上限。通过这种方式，您可以使用成本跟踪器在执行代码中构建成本控制逻辑。以下示例在 Rigetti QPU 上采用相同的电路，并将成本限制为 1 美元。在我们的代码中运行一次电路迭代的成本为 0.30 美元。我们已将逻辑设置为重复迭代，直到总成本超过 1 美元；因此，代码片段将运行三次，直到下一次迭代超过 1 美元为止。通常，程序会继续迭代，直到达到所需的最大成本，在本例中为三次迭代。

```
device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-3")
with Tracker() as tracker:
    while tracker.qpu_tasks_cost() < 1:
        result = device.run(circ, shots=200).result()
print(tracker.quantum_tasks_statistics())
print(tracker.qpu_tasks_cost(), "USD")
```

```
{'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-3': {'shots': 600, 'tasks': {'COMPLETED': 3}}}
1.4400000000 USD
```

**注意**  
成本跟踪器不会跟踪失败的 TN1 量子任务的持续时间。在 TN1 模拟过程中，如果您的排练已完成，但收缩步骤失败，则您的排练费用将不会显示在成本跟踪器中。

## 节省成本的最佳实践
<a name="best-practices"></a>

请考虑以下使用 Amazon Braket 的最佳实践。节省时间，最大限度地降低成本，并避免常见错误。

 **使用模拟器进行验证** 
+ 在 QPU 上运行模拟器之前，请使用模拟器验证电路，这样您就可以微调电路，而不会因使用 QPU 而产生费用。
+ 尽管在模拟器上运行电路的结果可能与在 QPU 上运行电路的结果不同，但您可以使用模拟器识别编码错误或配置问题。

 **限制用户访问某些设备** 
+ 您可以设置限制，防止未经授权的用户在某些设备上提交量子任务。限制访问的推荐方法是使用 AWS IAM。有关如何操作的更多信息，请参阅[限制访问](https://docs.aws.amazon.com/braket/latest/developerguide/braket-manage-access.html#restrict-access)。
+ 我们建议您**不要**使用**管理员**账户来授予或限制用户访问 Amazon Braket 设备。

 **设置账单警报** 
+ 您可以设置账单警报，以便在账单达到预设限额时发出通知。设置闹钟的推荐方法是通过 AWS Budgets。您可以设置自定义预算，并在费用或使用量可能超过预算金额时收到提醒。有关信息，请访问 [AWS Budgets](https://aws.amazon.com/aws-cost-management/aws-budgets/)。

 **使用低拍摄计数测试 TN1 量子任务** 
+ 模拟器的成本低于 QPUs，但是如果量子任务以高射击次数运行，则某些模拟器可能会很昂贵。我们建议您使用低 shot 计数来测试您的 TN1 任务。Shot 计数不影响 SV1 和本地模拟器任务的成本。

 **检查所有区域的量子任务** 
+ 控制台仅显示您当前的量子任务 AWS 区域。在查找已提交的计费量子任务时，请务必查看所有区域。
+ 您可以在“[受支持的设备](braket-devices.md)”文档页面上查看设备及其相关区域的列表。