你当前正在访问 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。 其中许多错误是可恢复的。

后续步骤

供稿

有关构建、测试和参与此库的详细信息,请参阅 CONTRIBUTING.md

本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 https://cla.microsoft.com

此项目采用了 Microsoft 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。

曝光数