Biblioteca cliente de trabajos de Azure Quantum para .NET: versión 1.0.0-beta.3

Azure Quantum es un servicio de Microsoft Azure que puede usar para ejecutar programas de computación cuántica o resolver problemas de optimización en la nube. Con las herramientas de Azure Quantum y los SDK, puede crear programas cuánticos y ejecutarlos en diferentes simuladores cuánticos y máquinas. Puede usar la biblioteca cliente de Azure.Quantum.Jobs para:

Introducción

Esta sección debe incluir todo lo que un desarrollador debe hacer para instalar y crear su primera conexión de cliente muy rápidamente.

Instalar el paquete

Instale la biblioteca cliente de trabajos de Azure Quantum para .NET con NuGet:

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

Prerrequisitos

Incluya una sección después del comando de instalación que detalla los requisitos que deben cumplirse antes de que un desarrollador pueda autenticar y probar todos los fragmentos de código de la sección Ejemplos . Por ejemplo, para Cosmos DB:

Debe tener una suscripción de Azure, una cuenta de Cosmos DB (SQL API) y Python 3.6+ para usar este paquete.

Autenticar el cliente

Para autenticarse con el servicio, el área de trabajo usará DefaultAzureCredential internamente. Esto probará diferentes mecanismos de autenticación basados en el entorno (por ejemplo, Variables de entorno, ManagedIdentity, CachedTokens) y, por último, se revertirá a InteractiveBrowserCredential.

El área de trabajo también permitirá al usuario invalidar el comportamiento anterior pasando su propio TokenCredential.

TokenCredential es el mecanismo de autenticación predeterminado que usan los SDK de Azure.

Conceptos clave

QuantumJobClient es la clase raíz que se va a usar para autenticar y crear, enumerar y cancelar trabajos.

JobDetails contiene todas las propiedades de un trabajo.

ProviderStatus contiene información de estado para un proveedor.

QuantumJobQuota contiene propiedades de cuota.

Seguridad para subprocesos

Garantizamos que todos los métodos de instancia de cliente sean seguros para subprocesos e independientes entre sí (guía). Esto garantiza que la recomendación de reutilizar instancias de cliente siempre es segura, incluso entre subprocesos.

Conceptos adicionales

Opciones | de cliente Acceso a la respuesta | Operaciones | de larga duraciónControl de errores | Diagnóstico | Burla | Duración del cliente

Ejemplos

Creación del cliente

Cree una instancia de QuantumJobClient pasando estos parámetros:

  • Suscripción : tiene el aspecto de XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX y se puede encontrar en la lista de suscripciones de Azure.
  • Grupo de recursos : un contenedor que contiene recursos relacionados para una solución de Azure
  • Área de trabajo : una colección de recursos asociados a la ejecución de aplicaciones cuánticas o de optimización
  • Ubicación : elija el mejor centro de datos por región geográfica.
  • StorageContainerName : el almacenamiento de blobs
  • Credencial: se usa para autenticarse
// 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);

Obtención del URI de SAS de contenedor

Cree un contenedor de almacenamiento donde colocar los datos.

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

Cargar datos de entrada

Con el URI de SAS, cargue los datos de entrada json comprimidos en el cliente de blobs. Tenga en cuenta que es necesario comprimir los datos de entrada json antes de cargarlos en el almacenamiento de blobs. Contiene los parámetros que se van a usar con optimizaciones de inspiración cuántica.

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

Crear el trabajo

Ahora que ha cargado la definición del problema en Azure Storage, puede usar CreateJob para definir un trabajo de 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;

Obtener trabajo

GetJob recupera un trabajo específico por su identificador.

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

Obtener trabajos

Para enumerar todos los trabajos del área de trabajo, use el GetJobs método .

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

Solución de problemas

Todas las operaciones del servicio Trabajos cuánticos producirán una excepción RequestFailedException en caso de error con códigos de error útiles. Muchos de estos errores son recuperables.

Pasos siguientes

Contribuir

Consulte la CONTRIBUTING.md para obtener más información sobre la compilación, las pruebas y la contribución a esta biblioteca.

Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para más detalles, visite https://cla.microsoft.com.

El proyecto ha adoptado el Código de conducta de código abierto de Microsoft. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.

Impresiones