Partilhar via


Computação quântica interativa: sessões

Este artigo explica a arquitetura da computação quântica interativa, também conhecida como sessões, e como criar uma nova sessão.

Neste modelo de computação quântica híbrida, o recurso de computação de cliente pode ser movido para a cloud, resultando numa latência inferior e na capacidade de repetir a execução do circuito quântico com parâmetros diferentes. As tarefas podem ser agrupadas logicamente numa sessão e as tarefas nessa sessão podem ser priorizadas em tarefas que não sejam de sessão. Embora os estados de qubit não persistam entre tarefas, uma sessão permite tempos de fila mais curtos para trabalhos e problemas de execução mais longos.

Computação quântica interativa

Pré-requisitos

Para criar uma sessão, precisa dos seguintes pré-requisitos:

  • Uma conta do Azure com uma subscrição ativa. Se não tiver uma conta do Azure, registe-se gratuitamente e inscreva-se numa subscrição pay as you go.

  • Uma área de trabalho do Azure Quantum. Para obter mais informações, veja Criar uma área de trabalho do Azure Quantum.

  • Um ambiente Python com Python e Pip instalados.

  • O pacote do Azure Quantum azure-quantum . Se quiser utilizar o Qiskit ou o Cirq, tem de instalar o azure-quantum pacote com as etiquetas [qiskit] ou [cirq].

    pip install --upgrade azure-quantum[qiskit] 
    

O que é uma sessão?

Uma sessão é um agrupamento lógico de uma ou mais tarefas submetidas a um único target. Cada sessão tem um ID exclusivo anexado a cada tarefa nessa sessão.

As sessões permitem-lhe organizar várias tarefas de computação quântica com a capacidade de executar código clássico entre tarefas quânticas. Poderá executar algoritmos complexos para organizar e controlar melhor as tarefas de computação quântica individuais.

Um cenário de utilizador chave em que poderá querer combinar tarefas numa sessão é algoritmos quânticos parametrizados em que a saída de uma tarefa de computação quântica informa os parâmetros da próxima tarefa de computação quântica. Os exemplos mais comuns deste tipo de algoritmo são Variational Quantum Eigensolvers (VQE) e Quantum Approximate Optimization Algorithms (QAOA).

Hardware suportado

As sessões são suportadas em todos os fornecedores de hardware de computação quântica, atualmente IonQ, Quantinuum e Rigetti. Em alguns casos, as tarefas submetidas numa sessão são priorizadas na fila desse target. Para obter mais informações, veja Comportamento de destino.

Introdução às sessões

As sessões são geridas com Python e podem ser criadas para quaisquer programas quânticos QIR, incluindo Q#programas Qiskit e Cirq.

Este exemplo mostra como criar uma sessão com código inline com Q# um Jupyter Notebook no Visual Studio Code. Também pode criar sessões com um programa Python que invoca um programa adjacente Q# .

Nota

As sessões são geridas com Python, mesmo quando executam Q# código inline.

  1. No VS Code, selecione Ver > Paleta de comandos e selecione Criar: Novo Jupyter Notebook.

  2. No canto superior direito, o VS Code irá detetar e apresentar a versão do Python e o ambiente virtual do Python que foi selecionado para o bloco de notas. Se tiver vários ambientes Python, poderá ter de selecionar um kernel com o seletor de kernel no canto superior direito. Se não tiver sido detetado nenhum ambiente, consulte Jupyter Notebooks no VS Code para obter informações de configuração.

  3. Na primeira célula do bloco de notas, execute

    import azure.quantum
    
    workspace = azure.quantum.Workspace(
        resource_id = "", # add your resource ID
        location = "", # add your location, for example "westus"
    )
    
  4. Clique em + Código para adicionar uma nova célula no bloco de notas e importar qsharp o SDK python.

    import qsharp
    
  5. Selecione o quântico target à sua escolha. Neste exemplo, está a utilizar o simulador IonQ como target.

    target = workspace.get_targets("ionq.simulator")
    
  6. Selecione as configurações do seu target perfil ou UnrestrictedBase .

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Unrestricted
    
  7. Escreva o seu Q# programa. Por exemplo, o programa seguinte Q# gera um bit aleatório. Para ilustrar a utilização de argumentos de entrada, este programa utiliza um número inteiro e numa matriz de ângulos, , anglecomo entrada.

    %%qsharp
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Arrays;
    
    operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] {
       use qubits = Qubit[n]; // n parameter as the size of the qubit array
       for q in qubits {
           H(q);
       }
       R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters
       R(PauliZ, angle[1], qubits[1]);
       let results = MeasureEachZ(qubits);
       ResetAll(qubits);
       return results;
    }
    
  8. Em seguida, crie uma sessão. Digamos que pretende executar GenerateRandomBit a operação três vezes, pelo que utiliza target.submit para submeter a Q# operação com os target dados e repetir o código três vezes, num cenário real, poderá querer submeter programas diferentes em vez do mesmo código.

    angle = [0.0, 0.0]
    with target.open_session(name="Q# session of three jobs") as session:
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission
        angle[0] += 1
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission
        angle[1] += 1
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission
    
    session_jobs = session.list_jobs()
    [session_job.details.name for session_job in session_jobs]
    

    Importante

    Ao transmitir argumentos como parâmetros para a tarefa, estes são formatados na expressão ao Q# chamar qsharp.compile. Isto significa que tem de ter cuidado para formatar os seus argumentos como Q# objetos. Neste exemplo, uma vez que as matrizes no Python já estão impressas como [item0, item1, ...], os argumentos de entrada correspondem à Q# formatação. Para outras estruturas de dados python, poderá precisar de mais processamento para inserir os valores da cadeia de carateres de Q# uma forma compatível.

  9. Depois de criar uma sessão, pode utilizar workspace.list_session_jobs para obter uma lista de todas as tarefas na sessão. Para obter mais informações, veja Como gerir sessões.

Sessões de monitorização

Pode utilizar o painel Gestão de tarefas na área de trabalho Quantum para ver todos os itens submetidos de nível superior, incluindo sessões e trabalhos individuais que não estão associados a nenhuma sessão.

  1. Selecione o painel Gestão de tarefas na área de trabalho Quântica.
  2. Identifique as tarefas do tipo Sessão. Nesta vista, pode ver o ID Exclusivo de uma Sessão no ID da coluna e monitorizar o respetivo Estado. Os estados de uma sessão são:
    • A aguardar: as tarefas na sessão estão a ser executadas.
    • Com êxito: a sessão terminou com êxito.
    • Tempo Limite: se não for submetida nenhuma nova tarefa na sessão durante 10 minutos, essa sessão excede o limite de tempo. Para obter mais informações, veja Tempos limite da sessão.
    • Falha: se uma tarefa numa sessão falhar, essa sessão termina e comunica um estado de Falha. Para obter mais informações, veja Política de falha de tarefas nas sessões.
  3. Clique no nome de uma sessão para obter mais detalhes.
  4. Pode ver a lista de Todas as tarefas na sessão e monitorizar o respetivo estado.

Comportamento de destino

Cada fornecedor de hardware quântico define a sua própria heurística para gerir melhor a atribuição de prioridades de trabalhos numa sessão.

Quantinuum

Se optar por submeter tarefas numa sessão para um Quantinuum target, a sua sessão terá acesso exclusivo ao hardware, desde que coloque tarefas em fila dentro de um minuto entre si. Depois disso, as suas tarefas serão aceites e processadas com a lógica padrão de colocação em fila e atribuição de prioridades.