关于深度学习:启科量子解决方案实践使用-QuTrunkAmazon-Deep-Learning-AMI-构建量子神经网络

32次阅读

共计 8068 个字符,预计需要花费 21 分钟才能阅读完成。

量子神经网络是基于量子力学原理的计算神经网络模型。1995 年,Subhash Kak 和 Ron Chrisley 独立发表了对于量子神经计算的第一个想法,他们致力于量子思维实践,认为量子效应在认知性能中起作用。然而,量子神经网络的典型钻研波及将经典的人工神经网络模型(在机器学习中宽泛用于模式识别的重要工作)与量子信息的劣势相结合,以倒退更高效的算法。这些钻研的一个重要动机是经典神经网络难以训练,特地是在大数据利用中更是如此。心愿能够利用量子计算的个性,如量子并行性或干预和纠缠效应作为资源。

基于 QuTrunk+AI 框架构建量子神经网络的解决方案,与 Mindspore 及 paddle 联合实际曾经公布过相干实战的文章。而 TensorFlow 作为一个十分风行和重要的 AI 深度学习框架,QuTrunk 也同样反对与之联合一起应用。本文次要介绍在 AWS 试验环境中应用 QuTrunk 联合 TensorFlow 来实现量子神经网络构建的试验。试验之前,咱们首先介绍下本示例中应用到的两个技术资源:AWS DLAMI 和 TensorFlow。

1、AWS DLAMI 及 TensorFlow 简介

1.1 AWS DLAMI

AWS 提供的 Amazon Deep Learning AMI(缩写为 DLAMI)能够帮忙用户疾速的部署部署好深度学习试验环境和疾速上手试验。它具备如下特点:

预装框架:DLAMI 目前次要有 2 个次要的规格:DL Base AMI 和 DLAMI with conda 和。DL Base AMI 未装置框架,仅装置了 NVIDIA CUDA 和其余依赖项。DLAMI with conda 则全副都蕴含,不仅齐全装备了 TensorFlow、PyTorch、Apache MXNet 机器学习框架,也事后配置了 NVIDIA CUDA 和 NVIDIA cuDNN。它应用 Conda 环境来隔离每个框架,用户能够在它们之间随便切换,而不必放心它们的依赖关系抵触;
预装 GPU 软件:即便应用仅 CPU 的实例,DLAMI 也将具备 NVIDIA CUDA 和 NVIDIA cuDNN。无论实例类型如何,装置的软件都雷同。
模型服务和可视化:应用 Conda 的深度学习 AMI 预装了两种模型服务器,一种用于 MXNet,另一种用于 TensorFlow,以及 TensorBoard,用于模型可视化。

1.2 TensorFlow2

TensorFlow 是一个用于机器学习和人工智能的收费开源软件库。它能够用于一系列工作,但特地关注深度神经网络的训练和推理。TensorFlow 由谷歌大脑团队开发,用于谷歌外部钻研和生产。初始版本于 2015 年依据 Apache License 2.0 公布。Google 于 2019 年 9 月公布了 TensorFlow 的更新版本,名为 TensorFlow 2.0。TensorFlow 可用于多种编程语言,包含 Python、JavaScript、C++ 和 Java。这种灵活性实用于许多不同行业的一系列利用。

TensorFlow 2.0 引入了许多变动,最重要的是 TensorFlow eager,它将主动微分计划从动态计算图扭转为最后由 Chainer 和起初的 PyTorch 风行的“按运行定义”计划。其余次要变动包含删除旧库、不同版本 TensorFlow 上的训练模型之间的穿插兼容性以及 GPU 性能的显著改良。

2、试验环境搭建

2.1 启动 AWS Deep Learning EC2 实例

2.1.1、关上 EC2 Dashborad

登录 AWS 的治理控制台,点击右上角 Region 下拉菜单切换到须要创立的资源的 Region,本示例应用亚太新加坡站点的资源。而后从 Services 抉择 EC2,关上 EC2 Dashboard。

2.1.2、创立 EC2 拜访密钥对
顺次点击服务 -> 计算 ->EC2 关上 EC2 的主页面。首先创立好秘钥对便于前面登录到 EC2,顺次点击左侧导航栏的网络与平安 -> 密钥对 -> 创立密钥对。

实现创立后主动下载秘钥,保留好秘钥文件备用。

2.1.3、AMI 抉择
返回到 EC2 主页,抉择启动实例,关上实例配置页面,先设置实例名称设置为 QNNDemo_Tensor, 而后抉择镜像版本,搜寻框输出 Deep Learning 进行搜寻,关上镜像搜寻后果页面,显示如下:

疾速启动 AMI 中有 8 个搜寻后果,本示例应用的是 TensorFlow2,抉择搜寻后果中:Deep Learning AMI GPU TensorFlow 2.11.0 (Ubuntu 20.04) 20221220 这个镜像。

2.1.4、实例类型确定
选定镜像后再确定须要创立的实例类型。镜像的实例类型能够在实例上面的实例类型中查问,例如查问 GPU 是实例类型,依据条件过滤,能够看到有如下 gpu 实例类型:

AWS 提供了大量的实例类型可供用户抉择,用户能够从经济和需要角度登程,抉择适合的镜像来创立实例。对于深度学习,AWS 举荐是应用 GPU 实例 P3,P4,G3,G4,G5 和 G5g。各 GPU 实例类型的配置如下:

  • P3 具备 8 NVIDIA Tesla V100 GPUs
  • P4 具备 8 NVIDIA Tesla A100 GPUs
  • G3 具备 4 NVIDIA Tesla M60 GPUs
  • G4 具备 4 NVIDIA T4 GPUs
  • G5 具备 o 8 NVIDIA A10G GPU
  • G5g 则有基于 Arm 的 AWS Graviton2 processors。

如果经济上受限或者对于性能要求不是十分高,AWS 也提供了绝对经济的深度学习 CPU 实例和推理实例。深度学习举荐的 CPU 实例有三种:C5(不是所以的 region 都提供)、C4、C3 等实例类型。

  • C5 实例最多有 72 个 Intel vCPU。C5 实例善于迷信建模、批处理、分布式剖析、高性能计算(HPC)以及机器和深度学习推理。
  • C4 实例最多有 36 个 Intel vCPU。

AWS 推理实例旨在为深度学习模型推理工作负载提供高性能和高老本效率。具体来说,Inf1 实例类型应用 AWS Infentia 芯片和 AWS Neuron SDK,后者与 TensorFlow、PyTorch 和 MXNet 等风行的机器学习框架集成。客户能够应用 Inf1 实例以最低的云老本运行大规模机器学习推理应用程序,如搜寻、举荐引擎、计算机视觉、语音辨认、自然语言解决、个性化和欺诈检测。Amazon EC2 Inf1 实例具备多达 16 个 AWS Infentia 芯片和 100 Gbps 的网络吞吐量。

本示例只是用于简略深度学习试验,从节省成本思考,选用的实例类型是 CPU 类型,抉择的是一般是 t2.medium。用户也能够依据须要抉择其余带 GPU 的实例。

2.1.5、创立和启动实例
实例类型确定后而后抉择密钥对、网络设置及存储。最初点击启动示例提交创立。其余配置如下:

提交后示例创立中,待状态转变为正在运行即可开始应用。

3、量子神经网络构建

应用量子 + 深度学习构建量子神经网络根本流程差不多一统一,次要流程如下:

为了便于学习和了解,咱们本示例程序同样采纳单量子比特来构建一个简略的神经网络,构建的神经模型架构如下:

本示例模型次要由 3 个局部组成:

  • 输出电路 / 数据点电路:后面 3 个门,别离为:
  • 模型电路:前面 3 个门,对应别离为:
  • 期望值电路:对线路执行 PauliZ 算符

3.1、环境筹备

3.1.1、登录 EC2 实例

EC2 页面选中方才创立的这个示例,点击右键抉择连贯,抉择 ssh 客户端,显示如下:

依据秘钥文件保留的目录,应用如下命令即可拜访

ssh -i "qutrunk-asia.pem" ubuntu@18.141.145.32

3.1.2、QuTrunk 装置
执行如下命令装置 QuTrunk 最新版本到 EC2 环境上:

ubuntu@ip-192-168-150-172:~$ pip3 install --upgrade pip  -i https://pypi.tuna.tsinghua.edu.cn/simple
ubuntu@ip-192-168-150-172:~$ pip3 install qutrunk  -i https://pypi.tuna.tsinghua.edu.cn/simple

QuTrunk 装置实现后,在 python3 命令行交互模式下,测试是否装置胜利:

ubuntu@ip-192-168-150-172:~$ python3
Python 3.10.7 (main, Dec 20 2022, 07:32:05) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import qutrunk
>>> qutrunk.run_check()
============QuSL instruction:===========
qreg q[2]
creg c[2]
H * q[0]
MCX(1) * (q[0], q[1])
Measure * q[0]
Measure * q[1]
===============Draw circuit=============
      ┌───┐      ┌─┐
q[0]: ┤ H ├──■───┤M├───
      └───┘┌─┴──┐└╥┘┌─┐
q[1]: ─────┤ CX ├─╫─┤M├
           └────┘ ║ └╥┘
 c: 2/════════════╩══╩═
                  0  1
==========circuit running result=========
[{"0b00": 57}, {"0b11": 43}]
===========circuit running info==========
{"backend": "BackendLocal", "task_id": "7478c36b8ec941dbaed9b14f64a854a3", "status": "success", "arguments": {"shots": 100}}
qutrunk v0.2.0 is installed successfully! You can use QuTrunk now.

3.1.3、Jupyter Notebook Server 设置
为不便测试,本试验在 JupyterNotebook 环境下进行验证,DLAMI 环境上曾经装置 Jupyter Notebook,只需进行简略的配置和启动即可。

1、设置 Jupyter server

首先设置首选明码:

ubuntu@ip-192-168-150-172:~$ jupyter notebook password
Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /home/ubuntu/.jupyter/jupyter_notebook_config.json

2、启动 upyter notebook server

咱们能够通过如下命令开启一个反对近程拜访的 jupyter notebook:

$ jupyter notebook --ip=0.0.0.0

而后咱们就能够在本地 PC 上拜访了,关上浏览器,输出 EC2 的公网 IP:8888 即可拜访,关上登录界面:

输出刚设置的明码登录到环境,点击新建按钮,而后抉择 Python3

关上试验页面就能够开始基于 QuTrunk 的量子计算与深度学习框架联合的程序的开发了

3.2、程序实现

3.2.1 环境设置
装置实现后,设置程序应用的环境:

import random

import numpy as np
import tensorflow as tf
from matplotlib import pyplot as plt

from qutrunk.circuit import QCircuit
from qutrunk.circuit.gates import Rx, Ry, Rz, PauliZ

3.2.2、定义量子线路相干函数
依据后面模型设计,次要蕴含 3 个神经网络组成部分的量子线路函数,还有一个量子线路合并函数

数据点电路函数如下:

def datapoint_circuit(rotations):
    beta0, beta1, beta2 = [float(f) for f in rotations]
    circuit = QCircuit()
    qreg = circuit.allocate(1)
    Rx(beta0) * qreg[0]
    Ry(beta1) * qreg[0]
    Rz(beta2) * qreg[0]
    return circuit

模型电路函数定义:

def model_circuit():
    circuit = QCircuit()
    q = circuit.allocate(1)
    angles = ["theta-1", "theta-2", "theta-3"]
    params = circuit.create_parameters(angles)

    Rz(params[0]) * q[0]
    Ry(params[1]) * q[0]
    Rx(params[2]) * q[0]

    return circuit

期望值函数定义:

def expectation():
    circuit = QCircuit()
    qreg = circuit.allocate(1)
    return PauliZ(qreg[0])

最初是电路组合函数定义:

def join_circuit(datapoint_cir, model_cir, inputs):
    params = {"theta-" + str(i): inputs[i] for i in range(len(inputs))}
    model_cir = model_cir.bind_parameters(params)
    datapoint_cir.append_circuit(model_cir)
    return datapoint_cir

3.2.3、定义梯度计算类
采纳梯度降落的算法训练量子神经网络,为了不便调用,本示例将梯度计算定义为一个类

class CustomGradientTape:
    def __init__(self, inputs, exp_op, shift=np.pi / 2):
        self.inputs = inputs
        self.exp_op = exp_op
        self.shift = shift

    def gradient(self, loss, var_list):
        params = [var.numpy() for var in var_list]

        gradients = []
        for i in range(len(params)):
            shift_right = np.copy(params)
            shift_right[i] += self.shift
            shift_left = np.copy(params)
            shift_left[i] -= self.shift

            circuit = join_circuit(datapoint_circuit(self.inputs), model_circuit(), shift_right)
            expectation_right = -1 * circuit.expval_pauli(self.exp_op)

            circuit = join_circuit(datapoint_circuit(self.inputs), model_circuit(), shift_left)
            expectation_left = -1 * circuit.expval_pauli(self.exp_op)

            gradient = expectation_right - expectation_left
            gradients.append(tf.convert_to_tensor(gradient, dtype=tf.float32))
        return gradients

3.2.4、自定义层类
自定义层类蕴含了损失函数的定义,返回为迭代训练后的损失值

class ControlledPQC(tf.keras.layers.Layer):

    def __init__(self, optimizer, exp_op, var_list, grad):
        super(ControlledPQC, self).__init__()
        self.optimizer = optimizer
        self.exp_op = exp_op
        self.var_list = var_list

        self.grad = grad

    def call(self, inputs):
        params_list = [var.numpy() for var in self.var_list]
        circuit = join_circuit(datapoint_circuit(inputs), model_circuit(), params_list)
        loss = -1 * circuit.expval_pauli(self.exp_op)
        self.optimizer.minimize(loss, self.var_list, self.grad)

        return loss

3.2.5、模型设置及训练
首先根设置事后定义的参数,而后通过 TensorFlow 的 Adam 优化器优化下面的量子神经网络,,通过调整迭代次数 ITR 和学习率 LR 从新计算以使得这两个值达到十分靠近。初始化设置如下:

ITR = 200
LR = 0.02
rand = random.Random()
random_rotations = tf.convert_to_tensor(np.random.uniform(0, 2 * np.pi, 3))
op = expectation()

opt = tf.keras.optimizers.Adam(learning_rate=LR)

迭代循环计算和打印损失值。

control_params = [tf.Variable(rand.uniform(0, 2 * np.pi)) for _ in range(3)]
model = ControlledPQC(opt, op, control_params, CustomGradientTape(random_rotations, op))

loss_list = []
for it in range(ITR):
    ls = model(random_rotations)
    loss_list.append(ls)
    if it % 10 == 0:
        print(f"{it}: {ls:.4f}")

运行后输入的后果如下:

0: -0.2399
10: -0.6203
20: -0.8689
30: -0.9746
40: -0.9969
50: -0.9967
60: -0.9973
70: -0.9991
80: -0.9999
90: -1.0000
100: -1.0000
110: -1.0000
120: -1.0000
130: -1.0000
140: -1.0000
150: -1.0000
160: -1.0000
170: -1.0000
180: -1.0000
190: -1.0000

从后果能够看到通过 130 次迭代之后损失值逐步收敛到 -1。

3.2.6、后果展现
为了更形象的展现训练后果,咱们应用 plot 打印其曲线,实现形式如下:

plt.plot(loss_list)
plt.title("Learning to Control a Qubit")
plt.xlabel("Iterations")
plt.ylabel("loss")

输入的后果如下:

4、总结

本文章具体展现了应用 AWS 的 DLAMI 疾速部署出深度学习的试验环境,并应用 QuTrunk 与 AI 框架 TensorFlow 联合实现构建量子神经网络的试验和输入测试后果,为量子计算 + 深度学习的开发者用户提供了一个简略的入门学习示例。

QuTrunk 是启科量子公布的一个开源的、灵便方便使用的、能够与各种思考开源 AI 框架联合应用的量子编程框架。通过本文的展现,读者对量子编程 +AI 框架联合应用的办法有了根本理解,读者也能够拜访启科开发者社区,深刻理解 QuTrunk 的个性以便应用 QuTrunk+AI 的解决方案解决理论利用的中问题。更多的信息请点击 QuSaaS:启科开发者平台

作者:

Keith Yan(丘秉宜)中国首位亚马逊云科技 Community Hero。

黄文,启科量子 DEVOPS 工程师

Marz Kuo(郭梦杰),启科量子资深研发工程师,量子计算开源框架保护人

浏览原文:https://dev.amazoncloud.cn/co…

正文完
 0