Skip to main content
IBM Quantum Platform

Comece a usar o Qiskit Functions

Os usuários dos planos Premium, Flex e “ On-Prem ” (por meio da API IBM Quantum Platform ) podem começar a usar o “ IBM ” Qiskit Functions gratuitamente ou adquirir uma licença junto a um dos parceiros que contribuíram com uma função para o catálogo.


Solicite uma avaliação gratuita do software de gerenciamento de ativos de terceiros ( Qiskit Functions )

Para solicitar uma avaliação gratuita, acesse o site Qiskit Functions Catalog e explore o painel de detalhes. Clique Request a free trial e preencha as informações solicitadas pelo parceiro da Functions, incluindo o IBM Cloud AccessGroupId:

  1. Acesse o IBM Cloud IAM.
  2. Verifique se você se qualifica.
    • Na barra de menu do cabeçalho, alterne sua conta para uma com o seguinte formato: XXXXXXX - [Organization Name]
    • Verifique se a organização é a mesma associada à sua conta Premium.
    • Se você vir “Conta [de] [Seu Nome]”, significa que está usando sua conta pessoal, que não dá direito ao acesso premium.
  3. Descubra o ID do seu grupo de acesso.
    • Clique no nome de um grupo.
    • Clique em “Detalhes ”.
    • Copie o ID do grupo de acesso. Deve começar com AccessGroup-.

Instale o cliente do Qiskit Functions Catalog

  1. Para começar a usar o Qiskit Functions, instale o cliente IBM Qiskit Functions Catalog :

    pip install qiskit-ibm-catalog
  2. Recupere sua chave de API no painel IBM Quantum Platform e ative seu ambiente virtual Python. Consulte as instruções de instalação caso ainda não tenha um ambiente virtual configurado.

    Se você estiver trabalhando em um ambiente confiável do Python (como em um laptop pessoal ou estação de trabalho), use o save_account() método para salvar suas credenciais localmente. ( Pule para a próxima etapa se você não estiver usando um ambiente confiável, como um computador compartilhado ou público, para se autenticar no site IBM Quantum Platform.)

    A instância com a qual você se autentica deve ter o acesso “ Qiskit Functions ” habilitado. Para configurá-lo em uma instância existente, consulte “Configurar o acesso d Qiskit Functions ” em uma instância.

    save_account()Para usar, execute python no seu shell e, em seguida, digite o seguinte:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog
    
    QiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")

    Digite exit(). A partir de agora, sempre que precisar se autenticar no serviço, você poderá carregar suas credenciais da seguinte forma:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog
    catalog = QiskitFunctionsCatalog()

    Por exemplo:

# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

Evite executar código em uma máquina não confiável ou em um ambiente externo de nuvem Python para minimizar os riscos de segurança. Se precisar usar um ambiente não confiável (por exemplo, em um computador público), altere sua chave de API após cada uso, excluindo-a na página de chaves de API IBM Cloud para reduzir o risco. Saiba mais no tópico “Gerenciamento de chaves de API de usuários ”. Para inicializar o serviço nessa situação, use este código:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

# After using the following code, delete your API key on the
# IBM Quantum Platform home dashboard
catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character
# API_KEY you created and saved from the IBM Quantum Platform Home dashboard
Proteja sua chave de API

Nunca inclua sua chave no código-fonte, em scripts do Python ou em arquivos de notebook. Ao compartilhar código com outras pessoas, certifique-se de que sua chave de API não esteja incorporada diretamente no script Python. Em vez disso, compartilhe o script sem a chave e forneça instruções para configurá-lo com segurança.

Se você compartilhar sua chave acidentalmente com alguém ou a incluir em um sistema de controle de versão como Git, revogue-a imediatamente excluindo-a na página de chaves da API IBM Cloud para reduzir os riscos. Saiba mais no tópico “Gerenciamento de chaves de API de usuários ”.


Liste as funções às quais você tem acesso

Após se autenticar, você pode listar as funções do Qiskit Functions Catalog às quais tem acesso:

catalog.list()

Output:

[QiskitFunction(qunova/hivqe-chemistry),
 QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
 QiskitFunction(algorithmiq/tem),
 QiskitFunction(qedma/qesem),
 QiskitFunction(multiverse/singularity),
 QiskitFunction(ibm/circuit-function),
 QiskitFunction(q-ctrl/optimization-solver),
 QiskitFunction(colibritd/quick-pde),
 QiskitFunction(q-ctrl/performance-management),
 QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]

Executar funções habilitadas

catalog.load("<provider/function-name>")Depois que um objeto de catálogo for instanciado, você poderá selecionar uma função usando:

qesem_function = catalog.load("qedma/qesem")

Cada função do Qiskit possui entradas, opções e saídas personalizadas. Consulte as páginas de documentação específicas da função que você deseja executar para obter mais informações. Por padrão, todos os usuários podem executar apenas uma tarefa de função por vez:

from qiskit.quantum_info import SparsePauliOp

avg_magnetization = SparsePauliOp.from_sparse_list(
    [("Z", [q], 1 / 5) for q in range(5)], num_qubits=5
)

job = qesem_function.run(
    pubs=[(circuit, [avg_magnetization, observable])],
    backend_name=backend_name,  # example: "ibm_fez"
    # options = {
    #     "estimate_time_only": "empirical",
    #     "default_precision": 0.2,  # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
    #     "max_execution_time": 3600,  # You can specify a maximum QPU time in seconds, see API reference for more details
    #     "transpilation_level": "standard",  # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
    #     "parallel_execution": True,  # True for parallel execution, see API reference for more details
    # },
)
job.job_id

Output:

'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'
Tip

run() verifica a capacidade restante e o acesso ao backend antes de enviar o trabalho. Se sua instância estiver sem capacidade ou se o backend que você indicou não estiver acessível, run() o sistema gera um erro imediatamente, em vez de deixar a tarefa falhar na fila. Quando a capacidade está baixa, run() emite um aviso. Toque suppress_low_usage_warning=True para desligar o som.

job = qesem_function.run(
    pubs=[(circuit, [avg_magnetization, observable])],
    backend_name=backend_name,  # example: "ibm_fez"
    suppress_low_usage_warning=True,
    # options = {
    #     "estimate_time_only": "empirical",
    #     "default_precision": 0.2,  # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
    #     "max_execution_time": 3600,  # You can specify a maximum QPU time in seconds, see API reference for more details
    #     "transpilation_level": "standard",  # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
    #     "parallel_execution": True,  # True for parallel execution, see API reference for more details
    # },
)

Verificar o status do trabalho

job_idCom a função Qiskit, você pode verificar o status dos trabalhos em execução. Isso inclui os seguintes status:

  • QUEUED: O programa remoto está na fila de funções do Qiskit. A prioridade na fila depende do quanto você já utilizou o Qiskit Functions.
  • INITIALIZING: O programa remoto está sendo iniciado; isso inclui a configuração do ambiente remoto e a instalação das dependências.
  • RUNNING: O programa está em execução. Isso também inclui vários status mais detalhados, caso sejam suportados por funções específicas.
    • RUNNING: MAPPING: Atualmente, a função está mapeando suas entradas clássicas para entradas quânticas.
    • RUNNING: OPTIMIZING_FOR_HARDWARE: A função está sendo otimizada para a QPU selecionada. Isso poderia incluir a transpilagem de circuitos, a caracterização da QPU, a retropropagação de observáveis e assim por diante.
    • RUNNING: WAITING_FOR_QPU: A função enviou uma tarefa para o Serviço de Computação d IBM Quantum e está aguardando na fila.
    • RUNNING: EXECUTING_QPU: A função possui uma tarefa ativa no Quantum Compute.
    • RUNNING: POST_PROCESSING: A função consiste no pós-processamento dos resultados, o que pode incluir a mitigação de erros, o mapeamento de resultados quânticos para o clássico e assim por diante.
  • DONE: O programa está concluído, e você pode recuperar os dados dos resultados com job.result().
  • ERROR: O programa parou de funcionar devido a um problema. Use job.result() para obter a mensagem de erro.
  • CANCELED: O programa foi cancelado por um usuário, pelo serviço ou pelo servidor.
job.status()

Output:

'QUEUED'

Exibir resultados

Depois que um programa for executado DONE, você pode usar job.result() para obter o resultado. Esse formato de saída varia de acordo com cada função; portanto, certifique-se de seguir a documentação específica:

result = job.result()
print(result)

Output:

PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})

Você também pode cancelar um trabalho a qualquer momento:

job.cancel()

Output:

'Job has been stopped.'

Acesse os trabalhos associados ao Quantum Compute

Uma função do Qiskit pode enviar um ou mais trabalhos de computação quântica para uma QPU enquanto ela está em execução. Para recuperar os IDs desses trabalhos em execução, use job.runtime_jobs(). Você pode usar esses IDs para recuperar os objetos de tarefa em execução de uma instância QiskitRuntimeService ou para localizar as cargas de trabalho no painel do IBM Quantum® Platform.

runtime_job_ids = job.runtime_jobs()
runtime_job_ids

Se uma função agrupar suas tarefas em tempo de execução em sessões ou lotes, use job.runtime_sessions() para listar os IDs das sessões. Passe um ID de sessão para job.runtime_jobs() a fim de retornar apenas os trabalhos em execução nessa sessão:

sessions = job.runtime_sessions()
if sessions:
    session_runtime_jobs = job.runtime_jobs(runtime_session=sessions[0])
    print(session_runtime_jobs)
else:
    print("No runtime sessions for this job.")
Note

A lista retornada pode estar vazia. Uma função reporta seus trabalhos em tempo de execução somente quando os envia por meio do serviço de tempo de execução que a função recebe durante a execução, e algumas funções não enviam trabalhos em tempo de execução diretamente.


Visualizar logs de tarefa

Use job.logs() para recuperar a saída de log que uma função gera durante sua execução. Os registros são úteis para acompanhar o andamento e para depurar um trabalho que termine em um determinado estado ERROR .

print(job.logs().splitlines())

Para uma tarefa de longa duração que gera muitas linhas de log, use job.filtered_logs() para retornar apenas as linhas desejadas. Passe uma expressão regular para include para manter as linhas correspondentes ou para exclude para descartar as linhas correspondentes:

print(job.filtered_logs(include="iteration"))

Listar tarefas do Qiskit Functions executadas anteriormente

Você pode usar jobs() para listar todos os trabalhos enviados para Qiskit Functions :

old_jobs = catalog.jobs()
old_jobs

Output:

[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
 <Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
 <Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
 <Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
 <Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
 <Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
 <Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
 <Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
 <Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
 <Job | 629cf110-e490-4675-8a07-f6d298d166b0>]

Para refinar os resultados, aplique filtros. Filtre por função com function, por status com statuse por data de envio com created_after. Navegue pelos resultados usando limit e offset:

recent_errors = catalog.jobs(
    function=qesem_function,
    status="ERROR",
    created_after="2024-01-01T00:00:00Z",
    limit=5,
)
recent_errors

Se você já tiver o ID de um determinado trabalho, poderá recuperá-lo com catalog.job():

# First, get the most recent job that has been executed.
latest_job = old_jobs[0]

# We can also get that same job with `catalog.job`
job_by_id = catalog.job(latest_job.job_id)

# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id

# Print the job_id for this job.
print(job_by_id.job_id)

Output:

f6c29f49-4d5f-4fff-aca6-2e9a115b9763

Buscar mensagens de erro

Se o status de um programa for ERROR, use job.error_message() para obter a mensagem de erro da seguinte maneira:

job.error_message()

Output:

qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'

Próximas etapas

Recomendações
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.