你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于 .NET 的 Azure Quantum Jobs 客户端库 - 版本 1.0.0-beta.3
Azure Quantum 是一项 Microsoft Azure 服务,可用于在云中运行量子计算程序或解决优化问题。 使用 Azure Quantum 工具和 SDK,你可以创建量子程序,并针对不同的量子模拟器和计算机运行它们。 可以使用 Azure.Quantum.Jobs 客户端库来:
入门
本部分应包括开发人员非常 快速地安装和创建其第一个客户端连接所需的所有操作。
安装包
使用 NuGet 安装适用于 .NET 的 Azure Quantum Jobs 客户端库:
dotnet add package Azure.Quantum.Jobs --prerelease -v 1.0.0-beta.1
先决条件
在安装命令后面添加一个部分,详细说明开发人员在“示例”部分中进行身份验证和测试所有代码片段之前必须满足的任何要求。 例如,对于 Cosmos DB:
必须具有 Azure 订阅、 Cosmos DB 帐户 (SQL API) 和 Python 3.6+ 才能使用此包。
验证客户端
若要使用服务进行身份验证,工作区将在内部使用 DefaultAzureCredential 。 这会根据环境 (例如环境变量、ManagedIdentity、CachedTokens) 尝试不同的身份验证机制,最后将回退到 InteractiveBrowserCredential。
工作区还允许用户通过传递自己的 TokenCredential 来替代上述行为。
TokenCredential
是 Azure SDK 使用的默认身份验证机制。
关键概念
QuantumJobClient
是用于进行身份验证和创建、枚举和取消作业的根类。
JobDetails
包含作业的所有属性。
ProviderStatus
包含提供程序的状态信息。
QuantumJobQuota
包含配额属性。
线程安全
我们保证所有客户端实例方法都是线程安全的,并且相互独立, (准则) 。 这可确保重用客户端实例的建议始终是安全的,即使跨线程也是如此。
其他概念
客户端选项 | 访问响应 | 长时间运行的操作 | 处理失败 | 诊断 | 嘲笑 | 客户端生存期
示例
创建客户端
通过传入以下参数创建 QuantumJobClient 的实例:
- 订阅 - 类似于 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,可在 azure 上的订阅列表中找到
- 资源组 - 一个容器,用于保存 Azure 解决方案的相关资源
- 工作区 - 与运行量子或优化应用程序关联的资产集合
- 位置 - 按地理区域选择最佳数据中心
- StorageContainerName - Blob 存储
- 凭据 - 用于进行身份验证
// Create a QuantumJobClient
var subscriptionId = "your_subscription_id";
var resourceGroupName = "your_resource_group_name";
var workspaceName = "your_quantum_workspace_name";
var location = "your_location";
var storageContainerName = "your_container_name";
var credential = new DefaultAzureCredential(true);
var quantumJobClient =
new QuantumJobClient(
subscriptionId,
resourceGroupName,
workspaceName,
location,
credential);
获取容器 SAS URI
创建用于放置数据的存储容器。
// Get container Uri with SAS key
var containerUri = (quantumJobClient.GetStorageSasUri(
new BlobDetails(storageContainerName))).Value.SasUri;
上传输入数据
使用 SAS URI 将压缩的 json 输入数据上传到 Blob 客户端。 请注意,我们需要先压缩 json 输入数据,然后再将其上传到 Blob 存储。 它包含要与量子启发优化一起使用的参数
string problemFilePath = "./problem.json";
// Get input data blob Uri with SAS key
string blobName = Path.GetFileName(problemFilePath);
var inputDataUri = (quantumJobClient.GetStorageSasUri(
new BlobDetails(storageContainerName)
{
BlobName = blobName,
})).Value.SasUri;
using (var problemStreamToUpload = new MemoryStream())
{
using (FileStream problemFileStream = File.OpenRead(problemFilePath))
{
// Check if problem file is a gzip file.
// If it is, just read its contents.
// If not, read and compress the content.
var fileExtension = Path.GetExtension(problemFilePath).ToLower();
if (fileExtension == ".gz" ||
fileExtension == ".gzip")
{
problemFileStream.CopyTo(problemStreamToUpload);
}
else
{
using (var gzip = new GZipStream(problemStreamToUpload, CompressionMode.Compress, leaveOpen: true))
{
byte[] buffer = new byte[8192];
int count;
while ((count = problemFileStream.Read(buffer, 0, buffer.Length)) > 0)
{
gzip.Write(buffer, 0, count);
}
}
}
}
problemStreamToUpload.Position = 0;
// Upload input data to blob
var blobClient = new BlobClient(new Uri(inputDataUri));
var blobHeaders = new BlobHttpHeaders
{
ContentType = "application/json",
ContentEncoding = "gzip"
};
var blobUploadOptions = new BlobUploadOptions { HttpHeaders = blobHeaders };
blobClient.Upload(problemStreamToUpload, options: blobUploadOptions);
}
创建作业
将问题定义上传到 Azure 存储后,可以使用 CreateJob
定义 Azure Quantum 作业。
// Submit job
var jobId = $"job-{Guid.NewGuid():N}";
var jobName = $"jobName-{Guid.NewGuid():N}";
var inputDataFormat = "microsoft.qio.v2";
var outputDataFormat = "microsoft.qio-results.v2";
var providerId = "microsoft";
var target = "microsoft.paralleltempering-parameterfree.cpu";
var inputParams = new Dictionary<string, object>() { { "params", new Dictionary<string, object>() } };
var createJobDetails = new JobDetails(containerUri, inputDataFormat, providerId, target)
{
Id = jobId,
InputDataUri = inputDataUri,
Name = jobName,
InputParams = inputParams,
OutputDataFormat = outputDataFormat
};
JobDetails myJob = (quantumJobClient.CreateJob(jobId, createJobDetails)).Value;
获取作业
GetJob
按 ID 检索特定作业。
// Get the job that we've just created based on its jobId
myJob = (quantumJobClient.GetJob(jobId)).Value;
获取作业
若要枚举工作区中的所有作业,请使用 GetJobs
方法。
foreach (JobDetails job in quantumJobClient.GetJobs())
{
Console.WriteLine($"{job.Name}");
}
疑难解答
所有 Quantum 作业服务操作都会在失败时引发 RequestFailedException,并具有有用的 ErrorCodes。 其中许多错误是可恢复的。
后续步骤
- 请访问 我们的产品文档 ,了解有关 Azure Quantum 的详细信息。
供稿
有关构建、测试和参与此库的详细信息,请参阅 CONTRIBUTING.md 。
本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 https://cla.microsoft.com 。
此项目采用了 Microsoft 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。