Biblioteca de clientes dos Trabalhos Do Azure Quantum para .NET – versão 1.0.0-beta.3

O Azure Quantum é um serviço Microsoft Azure que você pode usar para executar programas de computação quântica ou resolver problemas de otimização na nuvem. Usando as ferramentas e os SDKs do Azure Quantum, você pode criar programas quânticos e executá-los em diferentes simuladores e computadores quânticos. Você pode usar a biblioteca de clientes Azure.Quantum.Jobs para:

Introdução

Esta seção deve incluir tudo o que um desenvolvedor precisa fazer para instalar e criar sua primeira conexão de cliente muito rapidamente.

Instalar o pacote

Instale a biblioteca de clientes do Azure Quantum Jobs para .NET com o NuGet:

dotnet add package Azure.Quantum.Jobs --prerelease -v 1.0.0-beta.1

Pré-requisitos

Inclua uma seção após o comando install que detalha todos os requisitos que devem ser atendidos antes que um desenvolvedor possa autenticar e testar todos os snippets na seção Exemplos . Por exemplo, para o Cosmos DB:

Você deve ter uma assinatura do Azure, uma conta do Cosmos DB (API do SQL) e o Python 3.6+ para usar esse pacote.

Autenticar o cliente

Para autenticar com o serviço, o workspace usará DefaultAzureCredential internamente. Isso tentará mecanismos de autenticação diferentes com base no ambiente (por exemplo, Variáveis de Ambiente, ManagedIdentity, CachedTokens) e, por fim, fará fallback para InteractiveBrowserCredential.

O workspace também permitirá que o usuário substitua o comportamento acima passando seu próprio TokenCredential.

TokenCredential é o mecanismo de autenticação padrão usado pelos SDKs do Azure.

Principais conceitos

QuantumJobClient é a classe raiz a ser usada para autenticar e criar, enumerar e cancelar trabalhos.

JobDetails contém todas as propriedades de um trabalho.

ProviderStatuscontém status informações para um provedor.

QuantumJobQuota contém propriedades de cota.

Acesso thread-safe

Garantimos que todos os métodos de instância do cliente sejam thread-safe e independentes uns dos outros (diretriz). Isso garante que a recomendação de reutilize instâncias de cliente seja sempre segura, mesmo entre threads.

Conceitos adicionais

Opções | do cliente Acessando a resposta | Operações de execução prolongada | Tratamento de falhas | Diagnostics | Zombando | Tempo de vida do cliente

Exemplos

Crie o cliente

Crie uma instância do QuantumJobClient passando estes parâmetros:

  • Assinatura – se parece com XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXXXX E pode ser encontrada em sua lista de assinaturas no azure
  • Grupo de Recursos – um contêiner que contém recursos relacionados para uma solução do Azure
  • Workspace – uma coleção de ativos associados à execução de aplicativos quânticos ou de otimização
  • Localização – escolha o melhor data center por região geográfica
  • StorageContainerName - seu armazenamento de blobs
  • Credencial – usada para autenticar
// 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);

Obter URI sas do contêiner

Crie um contêiner de armazenamento em que os dados sejam colocados.

// Get container Uri with SAS key
var containerUri = (quantumJobClient.GetStorageSasUri(
    new BlobDetails(storageContainerName))).Value.SasUri;

Carregar dados de entrada

Usando o URI sas, carregue os dados de entrada json compactados no cliente blob. Observe que precisamos compactar os dados de entrada json antes de carregá-los no armazenamento de blobs. Isso contém os parâmetros a serem usados com otimizações inspiradas no Quantum

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);
}

Criar o trabalho

Agora que você carregou sua definição de problema no Armazenamento do Azure, pode usar CreateJob para definir um trabalho do 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;

Obter trabalho

GetJob recupera um trabalho específico por sua ID.

// Get the job that we've just created based on its jobId
myJob = (quantumJobClient.GetJob(jobId)).Value;

Obter Trabalhos

Para enumerar todos os trabalhos no workspace, use o GetJobs método .

foreach (JobDetails job in quantumJobClient.GetJobs())
{
   Console.WriteLine($"{job.Name}");
}

Solução de problemas

Todas as operações de serviço trabalhos quânticos lançarão uma RequestFailedException em caso de falha com ErrorCodes úteis. Muitos desses erros são recuperáveis.

Próximas etapas

Participante

Consulte o CONTRIBUTING.md para obter detalhes sobre como criar, testar e contribuir para essa biblioteca.

Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um CLA (Contrato de Licença do Colaborador) declarando que você tem o direito de nos conceder, e de fato concede, os direitos de usar sua contribuição. Para obter detalhes, visite https://cla.microsoft.com.

Este projeto adotou o Código de Conduta de Software Livre da Microsoft. Para obter mais informações, confira as Perguntas frequentes sobre o Código de Conduta ou contate opencode@microsoft.com para enviar outras perguntas ou comentários.

Impressões