发布者:程星和Michael Broughton,谷歌
训练大型机器学习模型是TensorFlow的一个核心能力。多年来,规模已经成为许多现代机器学习系统的一个重要特征,用于NLP、图像识别、药物发现等。利用多台机器来提高计算能力和吞吐量,导致了该领域的巨大进步。同样,在量子计算和量子机器学习中,更多机器资源的可用性加快了对更大的量子状态和更复杂系统的模拟。在本教程中,你将了解如何使用TensorFlow和TensorFlow quantum来进行大规模和分布式的QML模拟。以更大的FLOP/s计数来运行更大的模拟,为研究释放了新的可能性,否则在较小的规模上是不可能的。在下图中,我们概述了量子模拟的几种不同硬件设置的近似扩展能力。
运行分布式工作负载往往伴随着基础设施的复杂性,但我们可以使用Kubernetes来简化这一过程。Kubernetes是一个开源的容器协调系统,它是一个有效管理大规模工作负载的成熟平台。虽然可以用物理机或虚拟机集群进行多工作器设置,但Kubernetes提供了许多优势,包括。
- 服务发现--工作者可以使用众所周知的DNS名称轻松识别对方,而不是手动配置IP目的地。
- 自动bin-packing--你的工作负载会根据资源需求和当前消耗情况自动安排在不同机器上。
- 自动推出和回滚--可以通过改变配置来改变工作者副本的数量,Kubernetes会自动增加/删除工作者的响应,并在有资源的机器上进行调度。
本教程指导你使用谷歌云产品(包括谷歌Kubernetes引擎,一个可管理的Kubernetes平台)进行TensorFlow Quantum多工作器设置。你将有机会利用TensorFlow Quantum中的单工作器量子卷积神经网络(QCNN)教程,并为多工作器训练增强它。
从我们在多人工作环境中的实验来看,用1000个训练实例训练一个23比特的QCNN,这相当于大约3000个使用全状态矢量模拟的电路,在一个32个节点(512个vCPU)的集群上,每历时5分钟,这需要花费几美元。相比之下,同样的训练工作在一个单机上,每个历时大约需要4小时。再往前推一点,几十万个30比特的电路可以在几个小时内使用超过10,000个虚拟CPU来运行,而这些电路在单人工作环境下可能需要几周时间来运行。实际的性能和成本可能会因你的云计算设置而有所不同,如虚拟机类型、集群总运行时间等。在进行更大规模的实验之前,我们建议先从一个小型集群开始,比如本教程中使用的集群。
本教程的源代码可在TensorFlow Quantum的GitHub仓库中找到。README.md ,其中包含了启动和运行本教程的最快速方法。本教程将专注于详细介绍每个步骤,以帮助你理解基本概念并将其与你自己的项目相结合。让我们开始吧!
1.在谷歌云中设置基础设施
第一步是在谷歌云中创建基础设施资源。如果你有一个现有的谷歌云环境,确切的步骤可能会有所不同,例如,由于组织政策的限制。这是对最常见的一套必要步骤的指导。请注意,你将为你创建的谷歌云资源收费,这里是本教程中使用的可收费资源的摘要。如果你是一个新的谷歌云用户,你有资格获得300美元的积分。如果你是学术机构的一部分,你可能有资格获得谷歌云研究学分。
在本教程中,你将会运行几个shell命令。为此,你可以使用你的计算机上可用的本地Unix shell或云端Shell,它已经包含了后面提到的许多工具。
一个自动完成以下步骤的脚本可在 [setup.sh](https://github.com/tensorflow/quantum/blob/2a24b979467445f6d8e7156796f34ce81af147fa/qcnn_multiworker/setup.sh).本节详细介绍了每一个步骤,如果这是你第一次使用谷歌云,我们建议你走完整个部分。如果你喜欢自动完成谷歌云的设置过程,跳过这一部分。
- 打开
setup.sh,在里面配置参数值。 - 运行
./setup.sh infra。
在本教程中,你将使用一些谷歌云产品。
- Kubernetes引擎(GKE)。这是在本教程中执行你的QCNN作业的主要基础设施平台。
- 云存储,用于存储来自你的QCNN作业的数据。
- 容器注册表,用来存储容器镜像。
为了让你的云环境做好准备,首先遵循这些快速入门指南。
为了本教程的目的,你可以在创建集群的说明之前就停止Kubernetes引擎的快速启动。此外,安装gsutil ,云存储的命令行工具(如果你使用的是Cloud Shell,gsutil 已经安装好了)。
gcloud components install gsutil
作为参考,整个教程中的shell命令将参考这些变量。其中一些将在本教程后面的每个命令的上下文中变得更有意义。
${CLUSTER_NAME}: 在谷歌Kubernetes引擎上你喜欢的Kubernetes集群名称。${PROJECT}:你的谷歌云项目ID。${NUM_NODES}:你的集群中的虚拟机的数量。${MACHINE_TYPE}:虚拟机的机器类型。这控制了每个虚拟机的CPU和内存资源的数量。${SERVICE_ACCOUNT_NAME}:谷歌云IAM服务账户和相关Kubernetes服务账户的名称。${ZONE}:Kubernetes集群的Google Cloud区域。${BUCKET_REGION}:谷歌云区域的谷歌云存储桶。${BUCKET_NAME}:用于存储训练输出的谷歌云存储桶的名称。
为了确保你有权限在本教程的其余部分运行云操作,请确保你有IAM角色 owner ,或所有下列角色。
container.adminiam.serviceAccountAdminstorage.admin
要检查你的角色,请运行。
gcloud projects get-iam-policy ${PROJECT}
用你的谷歌云项目ID并搜索你的用户账户。
在你完成快速入门指南后,运行这个命令来创建一个Kubernetes集群。
gcloud container clusters create ${CLUSTER_NAME} --workload-pool=${PROJECT}.svc.id.goog --num-nodes=${NUM_NODES} --machine-type=${MACHINE_TYPE} --zone=${ZONE} --preemptible
用你的谷歌云项目ID和首选集群名称。
--num-nodes 是支持你的Kubernetes集群的Compute Engine虚拟机的数量。这不一定与你想为你的QCNN工作拥有的工作副本数量相同,因为Kubernetes能够在同一节点上安排多个副本,只要该节点有足够的CPU和内存资源。如果你是第一次尝试这个教程,我们建议使用2个节点。
--machine-type 指定虚拟机的类型。如果你是第一次尝试这个教程,我们推荐 "n1-standard-2",有2个vCPUs和7.5GB的内存。
--zone 是你想运行集群的谷歌云区域(例如 "us-west1-a")。
--workload-pool 启用GKE工作负载身份功能,该功能将Kubernetes服务账户与谷歌云IAM服务账户联系起来。为了实现精细化的访问控制,建议使用IAM服务账户来访问各种谷歌云产品。这里你将创建一个服务账户,供你的QCNN作业使用。Kubernetes服务账户是将这个IAM服务账户的凭证注入你的工作容器的机制。
--preemptible 使用Compute EnginePreemptible VMs来支持Kubernetes集群。与普通的虚拟机相比,它们的成本要低80%,但代价是虚拟机可能在任何时候被抢占,这将终止训练过程。这非常适用于大型集群的短期培训课程。
然后你可以创建一个IAM服务账户。
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME}
并将其与Workload Identity整合。
gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:${PROJECT}.svc.id.goog[default/${SERVICE_ACCOUNT_NAME}]" ${SERVICE_ACCOUNT_NAME}@${PROJECT}.iam.gserviceaccount.com
现在创建一个存储桶,它是存储数据的基本容器。
gsutil mb -p ${PROJECT} -l ${BUCKET_REGION} -b on gs://${BUCKET_NAME}
使用你喜欢的桶的名称。存储桶的名称是全球唯一的,所以我们建议将你的项目名称作为存储桶名称的一部分。建议桶的区域是包含你的集群的区域。区的区域是指区名中没有最后一个连字符后的部分。例如,区域 "us-west1-a "的区域是 "us-west1"。
为了使你的云存储数据能够被你的QCNN作业访问,请给你的IAM服务账户赋予权限。
gsutil iam ch serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT}.iam.gserviceaccount.com:roles/storage.admin gs://${BUCKET_NAME}
2.准备你的Kubernetes集群
随着云环境的建立,你现在可以将必要的Kubernetes工具安装到集群中。你将需要tf-operator ,这是KubeFlow的一个组件。KubeFlow是一个工具包,用于在Kubernetes上运行机器学习工作负载,并且 tf-operator是一个子组件,它简化了TensorFlow作业的管理。tf-operator ,可以单独安装,而不用安装更大的KubeFlow。
要安装tf-operator ,请运行。
docker pull k8s.gcr.io/kustomize/kustomize:v3.10.0docker run k8s.gcr.io/kustomize/kustomize:v3.10.0 build "github.com/kubeflow/tf-operator.git/manifests/overlays/standalone?ref=v1.1.0" | kubectl apply -f -
(注意,tf-operator使用Kustomize来管理它的部署文件,所以它也需要安装在这里)
3.使用MultiWorkerMirroredStrategy训练
现在你可以使用TensorFlow Quantum研究分支上的QCNN代码,并准备以分布式方式运行。让我们来克隆源代码。
git clone https://github.com/tensorflow/quantum.git && cd quantum && git checkout origin/research && cd qcnn_multiworker
或者,如果你使用SSH密钥来验证GitHub。
git clone git@github.com:tensorflow/quantum.git && cd quantum && git checkout origin/research && cd qcnn_multiworker
代码设置
training 目录包含了对你的QCNN进行分布式训练的必要部分。training/qcnn.py 和common/qcnn_common.py 的组合与 TensorFlow Quantum 中的混合 QCNN 示例相同,但增加了一些功能。
- 训练现在可以选择利用多台机器,
tf.distribute.MultiWorkerMirroredStrategy。 - TensorBoard集成,你将在下一节中详细探讨。
MultiWorkerMirroredStrategy是TensorFlow中执行同步分布式训练的机制。你现有的模型已经被增强了,只需要几行额外的代码就可以进行分布式训练。
在开始的时候 [training/qcnn.py](https://github.com/tensorflow/quantum/blob/2a24b979467445f6d8e7156796f34ce81af147fa/qcnn_multiworker/training/qcnn.py)开始,我们设置了MultiWorkerMirroredStrategy。
strategy = tf.distribute.MultiWorkerMirroredStrategy()
在模型准备步骤中,我们再把这个策略作为一个参数传进去。
... = qcnn_common.prepare_model(strategy)
我们的QCNN分布式训练作业的每个工作者将运行这个Python代码的副本。每个工作者都需要知道所有其他工作者的网络端点。环境变量通常用于此目的。 TF_CONFIG环境变量通常用于此目的,但在我们的案例中,tf-operator 在幕后自动注入了它。
在模型训练完成后,权重被上传到你的云存储桶,以便以后被推理工作访问。
if task_type == 'worker' and task_id == 0: qcnn_weights_path='/tmp/qcnn_weights.h5' qcnn_model.save_weights(qcnn_weights_path) upload_blob(args.weights_gcs_bucket, qcnn_weights_path, f'qcnn_weights.h5')
Kubernetes的部署设置
在进行Kubernetes部署设置和启动你的工作者之前,需要在教程的源代码中配置几个参数,以符合你自己的设置。所提供的脚本。 [setup.sh](https://github.com/tensorflow/quantum/blob/2a24b979467445f6d8e7156796f34ce81af147fa/qcnn_multiworker/setup.sh)可以用来简化这一过程。
打开setup.sh ,并在里面配置参数值,如果你还没有在前一步中这样做的话。然后运行
./setup.sh param
在这一点上,本节剩下的步骤可以在一个命令中执行。
make training
本节的其余部分将详细介绍Kubernetes的设置。
在Kubernetes中作为容器运行之前,QCNN工作需要用Docker打包成容器镜像,并上传到容器注册中心。Dockerfile ,其中包含了镜像的规范。要构建和上传镜像,请运行。
docker build -t gcr.io/${PROJECT}/qcnn .docker push gcr.io/${PROJECT}/qcnn
接下来,你将通过使用common/sa.yaml 创建Kubernetes服务账户来完成工作负载身份的设置。这个服务账户将被QCNN容器所使用。
apiVersion: v1kind: ServiceAccountmetadata: annotations: iam.gke.io/gcp-service-account: ${SERVICE_ACCOUNT_NAME}@${PROJECT}.iam.gserviceaccount.com name: ${SERVICE_ACCOUNT_NAME}
注释告诉GKE这个Kubernetes服务账户应该绑定到你之前创建的IAM服务账户。让我们来创建这个服务账户。
kubectl apply -f common/sa.yaml
最后一步是创建分布式训练作业。training/qcnn.yaml ,包含作业的Kubernetes规范。在Kubernetes中,具有相关功能的多个容器被分组为一个实体,称为Pod,它是可以调度的最基本的工作单位。通常情况下,用户利用现有的资源类型,如部署和工作来创建和管理工作负载。而你将使用TFJob (如`kind`字段所指定的),它不是Kubernetes内置的资源类型,而是由tf-operator ,使其更容易与TensorFlow工作负载合作。
值得注意的是,TFJob 规格包含字段tfReplicaSpecs.Worker ,它可以让你配置一个 MultiWorkerMirroredStrategy 工作器。PS (参数服务器)、Chief 和Evaluator 的值也被支持用于异步和其他形式的分布式训练。在引擎盖下,tf-operator 为每个工作者副本创建两个Kubernetes资源。
- 一个Pod,使用Pod规格模板,
tfReplicaSpecs.Worker.template。这可以运行你之前在Kubernetes上构建的容器。 - 一个服务,它暴露了一个在Kubernetes集群中可见的知名网络端点,以便访问工人的gRPC训练服务器。其他工作者可以通过简单地指向
<service_name>:<port>(<service_name>.<service_namespace>.svc:<port>的替代形式也可以)与它的服务器进行通信。
![]() |
| TFJob为每个工作者副本生成一个服务和Pod。一旦TFJob被更新,变化就会反映在基础服务和Pod中。工作者的状态也会在TFJob中报告。 |
![]() |
| 服务将工作者服务器暴露给集群的其他部分。每个工作者通过使用目标工作者的服务名称作为DNS名称与其他工作者进行通信。 |
在worker规范中,有几个值得注意的字段。
- replicas。工作副本的数量。多个副本有可能被安排在同一个节点上,所以这个数字不限于节点的数量。
- 模板:每个工人副本的Pod规格模板。
- serviceAccountName:这使Pod能够访问Kubernetes服务账户。
- 容器。
- image。指向你之前构建的容器注册表镜像。
- command:容器的入口点命令。
- arg:命令行参数。
- 端口:为工作器打开一个端口,以便相互通信,另一个端口用于分析。
- affinity:这告诉Kubernetes,你希望尽可能地将worker Pod安排在不同的节点上,以最大限度地提高资源利用率。
要创建TFJob 。
kubectl apply -f training/qcnn.yaml
检查部署情况
恭喜你!你的分布式培训已经开始了。你的分布式训练现在正在进行中。要检查作业的状态,请运行几次kubectl get pods (或添加-w ,以流式输出)。最终你应该看到有与你的replicas 参数相同数量的qcnn-worker Pods,并且它们都有状态Running 。
NAME READY STATUS RESTARTSqcnn-worker-0 1/1 Running 0qcnn-worker-1 1/1 Running 0
要访问工作者的日志输出,请运行。
kubectl logs <worker_pod_name>
或添加-f 来流化输出。qcnn-worker-0 的输出看起来像这样。
…I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:411] Started server with target: grpc://qcnn-worker-0.default.svc:2222…I tensorflow/core/profiler/rpc/profiler_server.cc:46] Profiler server listening on [::]:2223 selected port:2223…Epoch 1/50…4/4 [==============================] - 7s 940ms/step - loss: 0.9387 - accuracy: 0.0000e+00 - val_loss: 0.7432 - val_accuracy: 0.0000e+00…I tensorflow/core/profiler/lib/profiler_session.cc:71] Profiler session collecting data.I tensorflow/core/profiler/lib/profiler_session.cc:172] Profiler session tear down.…Epoch 50/504/4 [==============================] - 1s 222ms/step - loss: 0.1468 - accuracy: 0.4101 - val_loss: 0.2043 - val_accuracy: 0.4583File /tmp/qcnn_weights.h5 uploaded to qcnn_weights.h5.
qcnn-worker-1 的输出应该是类似的,只是缺少最后一行。首席工作者(worker 0)负责保存整个模型的权重。
你也可以通过访问Cloud Console 中的存储浏览器并浏览你之前创建的存储桶来验证模型权重的保存。
要删除训练作业,请运行
kubectl delete -f training/qcnn.yaml
4.了解使用TensorBoard的训练性能
TensorBoard是TensorFlow的可视化工具包。通过将你的TensorFlow Quantum模型与TensorBoard集成,你可以得到许多关于你的模型的可视化信息,如训练损失和准确性,可视化模型图和程序剖析。
代码设置
要为你的工作启用TensorBoard,创建一个TensorBoard回调并将其传入model.fit() 。
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=args.logdir, histogram_freq=1, update_freq=1, profile_batch='10, 20')… history = qcnn_model.fit(x=train_excitations, y=train_labels, batch_size=32, epochs=50, verbose=1, validation_data=(test_excitations, test_labels), callbacks=[tensorboard_callback])
profile_batch 参数在编程模式下启用TensorFlow剖析器,它在你在这里指定的训练步骤范围内对程序进行采样。你也可以启用采样模式。
tf.profiler.experimental.server.start(args.profiler_port)
它允许由不同的程序或通过TensorBoard用户界面启动的按需剖析。
TensorBoard功能
这里我们将强调本教程中使用的TensorBoard的许多强大功能的一个子集。请查看TensorBoard指南以了解更多。
损失和准确度
损失是模型在训练期间要最小化的数量,通过损失函数计算。准确度是训练期间预测与标签相匹配的样本的比例。默认情况下,损失指标被导出。要启用准确度指标,请在model.compile() 步骤中添加以下内容。
qcnn_model.compile(..., metrics=[‘accuracy’])
自定义指标
除了损失和准确性,TensorBoard还支持自定义指标。例如,教程代码将QCNN读出张量导出为柱状图。
剖析器
TensorFlow分析器是调试模型训练工作中性能瓶颈的一个有用工具。
在本教程中,我们既使用编程模式,其中剖析是针对预定义的训练步骤范围进行的,也使用采样模式,其中剖析可以按需进行。对于MultiWorkerMirroredStrategy的设置,目前编程模式只输出首席(Worker 0)的剖析数据,而采样模式能够剖析所有Worker。
当你第一次打开剖析器时,显示的数据是来自编程模式。概述页面让你了解每一步的训练时间。当你尝试用不同的方法来提高训练性能时,这将作为一个参考,无论是通过扩展基础设施(向集群添加更多的虚拟机,使用具有更多CPU和内存的虚拟机,与硬件加速器集成)还是提高代码效率。

跟踪查看器给出了引擎盖下所有训练指令的持续时间明细,提供了一个详细的视图来识别执行时间瓶颈。
Kubernetes的部署设置
为了查看TensorBoard用户界面,你可以在Kubernetes中创建一个TensorBoard实例。Kubernetes的设置是在training/tensorboard.yaml 。这个文件包含两个对象。
- 一个部署包含1个相同的工人容器镜像的Pod副本,但用TensorBoard命令运行。
tensorboard --logdir=gs://${BUCKET_NAME}/${LOGDIR_NAME} --port=5001 --bind_all - 一个服务,创建一个网络负载平衡器,使TensorBoard用户界面可以在互联网上访问,所以你可以在浏览器中查看它。
也可以通过将--logdir 指向相同的云存储桶,在你的工作站上运行TensorBoard的本地实例,尽管需要额外的IAM权限设置。
创建这个Kubernetes设置。
kubectl apply -f training/tensorboard.yaml
在kubectl get pods 的输出中,你应该看到有一个前缀为qcnn-tensorboard 的Pod,最终处于运行状态。为了获得TensorBoard实例的IP地址,运行
kubectl get svc tensorboard-service -w
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)tensorboard-service LoadBalancer 10.123.240.9 <pending> 5001:32200/TCP
负载平衡器需要一些时间来配置,所以你可能不会马上看到IP。一旦它可用,在你的浏览器中进入<ip>:5001 ,访问TensorBoard用户界面。
通过TensorFlow 2.4和更高版本,可以在采样模式下对多个工作者进行剖析:在训练作业运行时,可以通过点击Tensorboard剖析器中的 "捕获剖析 "和 "剖析服务URL "对工作者进行剖析,qcnn-worker-<replica_id>:2223 。要启用这一点,剖析器端口需要由工作者服务公开。该教程的源代码提供了一个脚本,它将所有由TFJob 生成的工作者服务与剖析器端口打上补丁。运行
training/apply_profiler_ports.sh
请注意,需要手动修补Services是暂时的,目前计划在tf-operator ,支持在TFJob ,指定额外的端口。
5.运行推理
在完成分布式训练工作后,模型权重被存储在你的云存储桶中。然后你可以使用这些权重来构建一个推理程序,然后在Kubernetes集群中创建一个推理作业。也可以在你的本地工作站上运行一个推理程序,尽管它需要额外的IAM权限来授予对云存储的访问。
代码设置
推理源代码可在inference/ 目录中找到。主文件,qcnn_inference.py ,主要是重复使用common/qcnn_common.py 中的模型构建代码,但从你的云存储桶加载模型权重。
qcnn_weights_path = '/tmp/qcnn_weights.h5'download_blob(args.weights_gcs_bucket, args.weights_gcs_path, qcnn_weights_path)qcnn_model.load_weights(qcnn_weights_path)
然后,它将模型应用于测试集,并计算出平均平方误差。
results = qcnn_model(test_excitations).numpy().flatten()loss = tf.keras.losses.mean_squared_error(test_labels, results)
Kubernetes部署设置
本节中的其余步骤可以在一个命令中执行。
make inference
推理程序已经内置于培训步骤中的Docker镜像中,所以你不需要在这里建立一个新的镜像。推理作业规范,inference/inference.yaml ,包含一个作业,其Pod规范指向镜像,但执行的是qcnn_inference.py 。运行kubectl apply -f inference/inference.yaml 来创建作业。
以inference-qcnn 为前缀的 Pod 最终应该处于运行状态 (kubectl get pods)。在推理Pod的日志输出中(kubectl logs <pod_name>),平均平方误差应该接近于TensorBoard用户界面中显示的最终损失。
…Blob qcnn_weights.h5 downloaded to /tmp/qcnn_weights.h5.[-0.8220097 0.40201923 -0.82856977 0.46476707 -1.1281478 0.23317486 0.00584182 1.3351855 0.35139582 -0.09958048 1.2205497 -1.3038696 1.4065738 -1.1120421 -0.01021352 1.4553616 -0.70309246 -0.0518395 1.4699622 -1.3712595 -0.01870352 1.2939589 1.2865802 0.847203 0.3149605 1.1705848 -1.0051676 1.2537074 -0.2943283 -1.3489063 -1.4727883 1.4566276 1.3417912 0.9123422 0.2942805 -0.791862 1.2984066 -1.1139404 1.4648925 -1.6311806 -0.17530376 0.70148027 -1.0084027 0.09898916 0.4121615 0.62743163 -1.4237025 -0.6296255 ]Test Labels[-1 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1]Mean squared error: tf.Tensor(0.29677835, shape=(), dtype=float32)
6.清理工作
这就结束了我们的分布式训练之旅!在你完成本教程的实验后,本节将引导你完成清理谷歌云资源的步骤。
首先,删除Kubernetes的部署。运行。
make delete-inferencekubectl delete -f training/tensorboard.yaml
和,如果你还没有这样做的话。
make delete-training
然后,删除GKE集群。这样也就删除了底层的虚拟机。
gcloud container clusters delete ${CLUSTER_NAME} --zone=${ZONE}
接下来,删除你的谷歌云存储中的训练数据。
gsutil rm -r gs://${BUCKET_NAME}
最后,按照云计算控制台的这些说明,从容器注册中心删除工人容器镜像。寻找镜像名称qcnn 。
接下来的步骤
现在你已经试过了多工作器的设置,试着用你的项目来设置它吧!随着本教程中提到的所有工具的不断发展,使用多工作者训练的最佳实践将随着时间的推移而改变。请回到TensorFlow QuantumGitHub仓库的教程目录中查看更新信息
随着你继续扩展你的实验,你可能最终会遇到基础设施的限制,由于在分布式环境中工作的复杂性,需要对本教程中使用的技术进行高级配置。要深入了解其中的一些内容,请查看这些资源。
- 用TensorFlow进行分布式训练
- TensorBoard指南
- The TensorFlow Blog
- Kubernetes文档
- 管理容器的资源,因为大型培训工作通常是资源有限的。
- 谷歌Kubernetes引擎文档
- 谷歌云博客
如果你有兴趣在Tensorflow Quantum中进行大规模的QML研究,请查看我们的研究信用申请页面,申请谷歌云上的云信用。



